diff options
| author | ckonstanski <kostcarl@isu.edu> | 2026-07-22 22:41:16 -0600 |
|---|---|---|
| committer | ckonstanski <kostcarl@isu.edu> | 2026-07-22 22:41:16 -0600 |
| commit | 7a902d7dec9e0ea2a35610bebac2e217340deb40 (patch) | |
| tree | 986111ad86ec227edc7f4b12e542a2ff0c2bcee5 | |
| parent | 51aa4409c58625687445f3d176e3f6bfa5281153 (diff) | |
stuff
| -rw-r--r-- | lisp/service/menu-service.lisp | 1 | ||||
| -rw-r--r-- | lisp/service/resume-service.lisp | 345 | ||||
| -rw-r--r-- | lisp/sql/resume-pkg.lisp | 72 | ||||
| -rw-r--r-- | lisp/sql/skill.lisp | 3 | ||||
| -rw-r--r-- | lisp/webapps/resume/clojurescript/resume/src/core.cljs | 419 | ||||
| -rw-r--r-- | lisp/webapps/resume/site.lisp | 112 | ||||
| -rw-r--r-- | sql/functions/resume.insert_contactinfo.sql | 45 | ||||
| -rw-r--r-- | sql/functions/resume.insert_education.sql | 49 | ||||
| -rw-r--r-- | sql/functions/resume.insert_language.sql | 45 | ||||
| -rw-r--r-- | sql/functions/resume.insert_resume.sql | 25 | ||||
| -rw-r--r-- | sql/tables/resume.skill.sql | 1 |
11 files changed, 689 insertions, 428 deletions
diff --git a/lisp/service/menu-service.lisp b/lisp/service/menu-service.lisp index aaff72b..7102f44 100644 --- a/lisp/service/menu-service.lisp +++ b/lisp/service/menu-service.lisp @@ -8,6 +8,7 @@ (:id "a_menu_resumes_contactinfo" :label "Contact Info" :handler "/resumes/contactinfo" :permissions "resume-view") (:id "a_menu_resumes_education" :label "Education" :handler "/resumes/education" :permissions "resume-view") (:id "a_menu_resumes_language" :label "Language" :handler "/resumes/language" :permissions "resume-view") + (:id "a_menu_resumes_skills" :label "Skills" :handler "/resumes/skills" :permissions "resume-view") (:id "a_menu_contact_us" :label "Contact Me" :handler "/contact-us" :permissions "_Public") (:id "a_menu_messages" :label "Messages" :handler "/messages" :permissions "messages-view") (:id "a_menu_users" :label "Users" :handler "/users" :permissions "users-view"))) diff --git a/lisp/service/resume-service.lisp b/lisp/service/resume-service.lisp index a1987d9..68b2c36 100644 --- a/lisp/service/resume-service.lisp +++ b/lisp/service/resume-service.lisp @@ -5,7 +5,7 @@ ;; shared -(defclass resumes-service (auth-service) +(defclass resume-service (auth-service) ((title :initarg :title :initform nil :accessor title)) @@ -13,45 +13,45 @@ ;; resume -(defun resumes-json () - (with-auth (instance resumes-service "resume-view") +(defun resume-json () + (with-auth (instance resume-service "resume-view") (setf (title instance) "Resumes"))) -(defclass resumes/view-service (resumes-service resume) +(defclass resume/view-service (resume-service resume) ((resumes :initarg :resumes :initform nil :accessor resumes) (location-p :initform nil)) (:documentation "")) -(defun resumes-view-json () - (with-auth (instance resumes/view-service "resume-view") +(defun resume-view-json () + (with-auth (instance resume/view-service "resume-view") (with-resume-database (let ((resume-pkg (make-instance 'resume-pkg)) (user (get-user))) - (setf (resumes instance) (get-all-resumes resume-pkg user)))) + (setf (resumes instance) (get-records resume-pkg (make-instance 'resume :user_id (id user)) "name asc")))) (sanitize-rest-json instance) (loop for resume in (resumes instance) do (sanitize-json resume)))) -(defclass resumes/add-service (resumes/view-service) +(defclass resume/add-service (resume/view-service) ((form :initarg :form :initform nil :accessor form)) (:documentation "")) -(defun resumes-add-json () - (with-auth (instance resumes/add-service "resume-modify") +(defun resume-add-json () + (with-auth (instance resume/add-service "resume-modify") (setf (title instance) "Resume - Add") - (setf (form instance) (make-form "resumes-add-form" + (setf (form instance) (make-form "resume-add-form" nil t `((:name "name" :label "Name" :field-type "text" :required "required") - (:label "Add Resume" :field-type "button" :onclick "on_resumes_add_submit_clicked()")))))) + (:label "Add Resume" :field-type "button" :onclick "on_resume_add_submit_clicked()")))))) -(defun resumes-add-submit-json (name) +(defun resume-add-submit-json (name) (declare (special name)) - (with-auth (instance resumes/add-service "resume-modify") + (with-auth (instance resume/add-service "resume-modify") (with-resume-database (handler-case (let* ((resume-pkg (make-instance 'resume-pkg)) @@ -59,36 +59,36 @@ (resume (make-instance 'resume :user_id (id user)))) (loop for param in (remove-if (lambda (x) (intersection `(,x) '(id))) - (sb-introspect:function-lambda-list #'resumes-add-submit-json)) + (sb-introspect:function-lambda-list #'resume-add-submit-json)) do (setf (slot-value resume param) (symbol-value param))) (insert-resume resume-pkg resume) (setf (session-value :message) (format nil "Resume \"~a\" created successfully." (name resume)))) (error (e) (setf (session-value :errormsg) (format nil "Error creating resume \"~a\". ~a" name e))))))) -(defclass resumes/modify-service (resumes/add-service) +(defclass resume/modify-service (resume/add-service) () (:documentation "")) -(defun resumes-modify-json (id) - (with-auth (instance resumes/modify-service "resume-modify") +(defun resume-modify-json (id) + (with-auth (instance resume/modify-service "resume-modify") (setf (title instance) "Resume - Modify") (with-resume-database (let* ((resume-pkg (make-instance 'resume-pkg)) (user (get-user)) (resume (get-record resume-pkg (make-instance 'resume :id id :user_id (id user))))) (if resume - (setf (form instance) (make-form "resumes-modify-form" + (setf (form instance) (make-form "resume-modify-form" nil t `((:name "id" :field-type "hidden" :value ,(id resume) :required "required") (:name "name" :label "Name" :field-type "text" :value ,(name resume) :required "required") - (:label "Modify Resume" :field-type "button" :onclick "on_resumes_modify_submit_clicked()")))) + (:label "Modify Resume" :field-type "button" :onclick "on_resume_modify_submit_clicked()")))) (setf (session-value :errormsg) "Error: could not modify resume. Not found.")))))) -(defun resumes-modify-submit-json (id name) +(defun resume-modify-submit-json (id name) (declare (special id name)) - (with-auth (instance resumes/modify-service "resume-modify") + (with-auth (instance resume/modify-service "resume-modify") (setf (title instance) "Resume - Modify") (with-resume-database (handler-case @@ -97,19 +97,19 @@ (resume (get-record resume-pkg (make-instance 'resume :id id :user_id (id user))))) (loop for param in (remove-if (lambda (x) (intersection `(,x) '(id))) - (sb-introspect:function-lambda-list #'resumes-modify-submit-json)) + (sb-introspect:function-lambda-list #'resume-modify-submit-json)) do (setf (slot-value resume param) (symbol-value param))) (update-record resume-pkg resume) (setf (session-value :message) (format nil "Resume \"~a\" modified successfully." (name resume)))) (error (e) (setf (session-value :errormsg) (format nil "Error modifying resume \"~a\". ~a" name e))))))) -(defclass resumes/delete-service (resumes/add-service) +(defclass resume/delete-service (resume/add-service) () (:documentation "")) -(defun resumes-delete-json (id) - (with-auth (instance resumes/delete-service "resume-modify") +(defun resume-delete-json (id) + (with-auth (instance resume/delete-service "resume-modify") (with-resume-database (let* ((resume-pkg (make-instance 'resume-pkg)) (user (get-user)) @@ -123,10 +123,10 @@ ;; contactinfo (defun contactinfo-json () - (with-auth (instance resumes-service "resume-view") + (with-auth (instance resume-service "resume-view") (setf (title instance) "Contact Information"))) -(defclass contactinfo/view-service (resumes-service contactinfo) +(defclass contactinfo/view-service (resume-service contactinfo) ((contactinfos :initarg :contactinfos :initform nil :accessor contactinfos) @@ -138,7 +138,7 @@ (with-resume-database (let ((resume-pkg (make-instance 'resume-pkg)) (user (get-user))) - (setf (contactinfos instance) (get-all-contactinfo resume-pkg user)))) + (setf (contactinfos instance) (get-records resume-pkg (make-instance 'contactinfo-v :user_id (id user)) "state_name asc, city asc, address asc, email asc, phone asc, visastatus asc")))) (sanitize-rest-json instance) (loop for contactinfo-v in (contactinfos instance) do (sanitize-json contactinfo-v)))) @@ -258,10 +258,10 @@ ;; education (defun education-json () - (with-auth (instance resumes-service "resume-view") + (with-auth (instance resume-service "resume-view") (setf (title instance) "Education"))) -(defclass education/view-service (resumes-service education) +(defclass education/view-service (resume-service education) ((educations :initarg :educations :initform nil :accessor educations) @@ -273,7 +273,7 @@ (with-resume-database (let ((resume-pkg (make-instance 'resume-pkg)) (user (get-user))) - (setf (educations instance) (get-all-education resume-pkg user)))) + (setf (educations instance) (get-records resume-pkg (make-instance 'education :user_id (id user)))))) (sanitize-rest-json instance) (loop for education in (educations instance) do (sanitize-json education)))) @@ -378,10 +378,10 @@ ;; language (defun language-json () - (with-auth (instance resumes-service "resume-view") + (with-auth (instance resume-service "resume-view") (setf (title instance) "Languages"))) -(defclass language/view-service (resumes-service language) +(defclass language/view-service (resume-service language) ((languages :initarg :languages :initform nil :accessor languages) @@ -393,7 +393,7 @@ (with-resume-database (let ((resume-pkg (make-instance 'resume-pkg)) (user (get-user))) - (setf (languages instance) (get-all-languages resume-pkg user)))) + (setf (languages instance) (get-records resume-pkg (make-instance 'language :user_id (id user)))))) (sanitize-rest-json instance) (loop for language in (languages instance) do (sanitize-json language)))) @@ -500,3 +500,278 @@ (setf (session-value :message) (format nil "Language \"~a\" deleted successfully." (name language)))) (setf (session-value :errormsg) "Error: could not delete Language: not found.")))))) +;; skill + +(defun skill-json () + (with-auth (instance resume-service "resume-view") + (setf (title instance) "Skills"))) + +(defclass skill/view-service (resume-service skill) + ((skills :initarg :skills + :initform nil + :accessor skills) + (location-p :initform nil)) + (:documentation "")) + +(defun skill-view-json () + (with-auth (instance skill/view-service "resume-view") + (with-resume-database + (let ((resume-pkg (make-instance 'resume-pkg)) + (user (get-user))) + (setf (skills instance) (get-records resume-pkg (make-instance 'skill :user_id (id user)))))) + (sanitize-rest-json instance) + (loop for skill in (skills instance) + do (sanitize-json skill)))) + +(defclass skill/add-service (skill/view-service) + ((form :initarg :form + :initform nil + :accessor form)) + (:documentation "")) + +(defun skill-add-json () + (with-auth (instance skill/add-service "resume-modify") + (setf (title instance) "Skill - Add") + (setf (form instance) (make-form "skill-add-form" + nil + t + `((:name "skill" :label "Skill" :field-type "text" :required "required") + (:label "Add Skill" :field-type "button" :onclick "on_skill_add_submit_clicked()")))))) + +(defun skill-add-submit-json (skill) + (declare (special skill)) + (with-auth (instance skill/add-service "resume-modify") + (with-resume-database + (handler-case + (let* ((resume-pkg (make-instance 'resume-pkg)) + (user (get-user)) + (skill (make-instance 'skill :user_id (id user)))) + (loop for param in (remove-if (lambda (x) + (intersection `(,x) '(id))) + (sb-introspect:function-lambda-list #'skill-add-submit-json)) + do (setf (slot-value skill param) (symbol-value param))) + (insert-skill resume-pkg skill) + (setf (session-value :message) (format nil "Skill \"~a\" created successfully." skill))) + (error (e) + (setf (session-value :errormsg) (format nil "Error creating Skill \"~a\". ~a" skill e))))))) + +(defclass skill/modify-service (skill/add-service) + () + (:documentation "")) + +(defun skill-modify-json (id) + (with-auth (instance skill/modify-service "resume-modify") + (setf (title instance) "Skill - Modify") + (with-resume-database + (let* ((resume-pkg (make-instance 'resume-pkg)) + (user (get-user)) + (skill (get-record resume-pkg (make-instance 'skill :id id :user_id (id user))))) + (if skill + (setf (form instance) (make-form "skill-modify-form" + nil + t + `((:name "id" :field-type "hidden" :value ,(id skill) :required "required") + (:name "skill" :label "Skill" :field-type "text" :value ,(skill skill) :required "required") + (:label "Modify Skill" :field-type "button" :onclick "on_skill_modify_submit_clicked()")))) + (setf (session-value :errormsg) "Error: could not modify Skill. Not found.")))))) + +(defun skill-modify-submit-json (id skill) + (declare (special id skill)) + (with-auth (instance skill/modify-service "resume-modify") + (setf (title instance) "Skill - Modify") + (with-resume-database + (handler-case + (let* ((resume-pkg (make-instance 'resume-pkg)) + (user (get-user)) + (skill (get-record resume-pkg (make-instance 'skill :id id :user_id (id user))))) + (loop for param in (remove-if (lambda (x) + (intersection `(,x) '(id))) + (sb-introspect:function-lambda-list #'skill-modify-submit-json)) + do (setf (slot-value skill param) (symbol-value param))) + (update-record resume-pkg skill) + (setf (session-value :message) (format nil "Skill \"~a\" modified successfully." skill))) + (error (e) + (setf (session-value :errormsg) (format nil "Error modifying Skill \"~a\". ~a" skill e))))))) + +(defclass skill/delete-service (skill/add-service) + () + (:documentation "")) + +(defun skill-delete-json (id) + (with-auth (instance skill/delete-service "resume-modify") + (with-resume-database + (let* ((resume-pkg (make-instance 'resume-pkg)) + (user (get-user)) + (skill (get-record resume-pkg (make-instance 'skill :id id :user_id (id user))))) + (if skill + (progn + (delete-record resume-pkg skill) + (setf (session-value :message) (format nil "Skill \"~a\" deleted successfully." (skill skill)))) + (setf (session-value :errormsg) "Error: could not delete Skill: not found.")))))) + +;; macro + +(defmacro define-resume-component ((component-s rest-args) &body input-form-fields) + "`component-s' is a symbol that matches the component's record object +name, i.e SKILL, JOB, EDUCATION, LANGUAGE, CONTACTINFO. This will be +used all over the place. The record name equals the component name. + +`rest-args' is the list of REST API arguments for the add and modify +forms. In the form like this example: ((id :parameter-type 'integer)) + +`input-form-fields' is a list of generic form fields that gets +inserted into the add and modify forms." + (let* ((component (symbol-name component-s)) + (component-lcase (string-downcase component)) + (components-s (intern (format nil "~aS" component))) + (components-k (intern (format nil "~aS" component) 'keyword)) + (arg-names (loop for arg in rest-args collect (car arg))) + (macro-root-s (intern (format nil ".~a" component))) + (macro-view-s (intern (format nil "~.a-VIEW" component))) + (macro-add-s (intern (format nil "~.a-ADD" component))) + (macro-add-submit-s (intern (format nil ".~a-ADD-SUBMIT" component))) + (macro-modify-s (intern (format nil ".~a-MODIFY" component))) + (macro-modify-submit-s (intern (format nil ".~a-MODIFY-SUBMIT" component))) + (macro-delete-s (intern (format nil ".~a-DELETE" component))) + (func-root-s (intern (format nil "~a-JSON" component))) + (func-view-s (intern (format nil "~a-VIEW-JSON" component))) + (func-add-s (intern (format nil "~a-ADD-JSON" component))) + (func-add-submit-s (intern (format nil "~a-ADD-SUBMIT-JSON" component))) + (func-modify-s (intern (format nil "~a-MODIFY-JSON" component))) + (func-modify-submit-s (intern (format nil "~a-MODIFY-SUBMIT-JSON" component))) + (func-delete-s (intern (format nil "~a-DELETE-JSON" component))) + (class-view-s (intern (format nil "~a/VIEW-SERVICE" component))) + (class-modify-s (intern (format nil "~a/MODIFY-SERVICE" component))) + (form-add (intern (format nil "~a-add-form" component-lcase))) + (form-modify (format nil "~a-modify-form" component-lcase))) + `(progn + (defmacro ,macro-root-s () + `(,func-root-s)) + + (defmacro ,macro-view-s () + `(,func-view-s)) + + (defmacro ,macro-add-s () + `(,func-add-s)) + + (defmacro ,macro-add-submit-s () + `(,macro-add-submit-s ,arg-names)) + + (defmacro ,macro-modify-s () + `(,func-modify-s id)) + + (defmacro ,macro-modify-submit-s () + `(,func-modify-submit-s ,(append '(id) arg-names))) + + (defmacro ,macro-delete-s () + `(,func-delete-s id)) + + (define-endpoint (,(format nil ("/resume/~a" component-lcase) :method :get) () ,macro-root-s)) + (define-endpoint (,(format nil ("/resume/~a/view" component-lcase) :method :get) () ,macro-view-s)) + (define-endpoint (,(format nil ("/resume/~a/add" component-lcase) :method :post) () ,macro-add-s)) + (define-endpoint (,(format nil ("/resume/~a/add/submit" component-lcase) :method :post) (&post ,@rest-args) ,macro-add-submit-s)) + (define-endpoint (,(format nil ("/resume/~a/modify" component-lcase) :method :post) (&post (id :parameter-type 'integer)) ,macro-modify-s)) + (define-endpoint (,(format nil ("/resume/~a/modify/submit" component-lcase) :method :post) (&post (id :parameter-type 'integer) ,@rest-args) ,macro-modify-submit-s)) + (define-endpoint (,(format nil ("/resume/~a/delete/:id" component-lcase) :method :delete) (&path (id 'integer)) ,macro-delete-s)) + + (defun ,func-root-s () + (with-auth (instance resume-service "resume-view") + (setf (title instance) ,component))) + + (defclass ,class-view-s (resume-service) + ((,components-s :initarg ,components-k + :initform nil + :accessor ,components-s) + (location-p :initform nil)) + (:documentation "")) + + (defun ,func-view-s () + (with-auth (instance ,class-view-s "resume-view") + (with-resume-database + (let ((resume-pkg (make-instance 'resume-pkg)) + (user (get-user))) + (setf (,components-s instance) (get-records resume-pkg (make-instance ',component-s :user_id (id user)))))) + (sanitize-rest-json instance) + (loop for ,component-s in (,components-s instance) + do (sanitize-json ,component-s)))) + + (defclass ,class-modify-s (,class-view-s) + ((form :initarg :form + :initform nil + :accessor form)) + (:documentation "")) + + (defun ,func-add-s () + (with-auth (instance ,class-modify-s "resume-modify") + (setf (title instance) (format nil "~a - Add" ,component)) + (setf (form instance) (make-form ,form-add + nil + t + `(,,@input-form-fields + (:label ,(format nil "Add ~a" ,component) :field-type "button" :onclick ,(format nil "on_~a_add_submit_clicked()" ,component-lcase))))))) + + (defun ,func-add-submit-s (,arg-names) + (declare (special ,arg-names)) + (with-auth (instance ,class-modify-s "resume-modify") + (with-resume-database + (handler-case + (let* ((resume-pkg (make-instance 'resume-pkg)) + (user (get-user)) + (,component-s (make-instance ',component-s :user_id (id user)))) + (loop for param in (remove-if (lambda (x) + (intersection `(,x) '(id))) + (sb-introspect:function-lambda-list #',func-add-submit-s)) + do (setf (slot-value ,component-s param) (symbol-value param))) + (insert-record resume-pkg ,component-s) + (setf (session-value :message) (format nil "~a created successfully." ,component))) + (error (e) + (setf (session-value :errormsg) (format nil "Error creating ~a. ~a" ,component e))))))) + + (defun ,func-modify-s (id) + (with-auth (instance ,class-modify-s "resume-modify") + (setf (title instance) (format nil "~a - Modify" ,component)) + (with-resume-database + (let* ((resume-pkg (make-instance 'resume-pkg)) + (user (get-user)) + (,compnent-s (get-record resume-pkg (make-instance ',component-s :id id :user_id (id user))))) + (if ,component-s + (setf (form instance) (make-form (,form-modify + nil + t + `((:name "id" :field-type "hidden" :value ,(id ,component-s) :required "required") + ,@input-form-fields + (:label ,(format nil "Modify ~a" ,component) :field-type "button" :onclick ,(format nil "on_~a_add_submit_clicked()" ,component-lcase))))) + (setf (session-value :errormsg) (format nil "Error: could not modify ~a. Not found." ,component))))))) + + (defun ,func-modify-submit-s (,(append '(id) arg-names)) + (declare (special ,(append '(id) arg-names)) + (with-auth (instance ,class-modify-s "resume-modify") + (setf (title instance) (format nil "~a - Modify" ,component)) + (with-resume-database + (handler-case + (let* ((resume-pkg (make-instance 'resume-pkg)) + (user (get-user)) + (,compnent-s (get-record resume-pkg (make-instance ',component-s :id id :user_id (id user))))) + (loop for param in (remove-if (lambda (x) + (intersection `(,x) '(id))) + (sb-introspect:function-lambda-list #',func-modify-submit-s)) + do (setf (slot-value ,component-s param) (symbol-value param))) + (update-record resume-pkg ,component-s) + (setf (session-value :message) (format nil "~a modified successfully." ,component))) + (error (e) + (setf (session-value :errormsg) (format nil "Error modifying ~a. ~a" ,component e)))))))) + + (defun ,func-delete-s (id) + (with-auth (instance ,class-modify-s "resume-modify") + (with-resume-database + (let* ((resume-pkg (make-instance 'resume-pkg)) + (user (get-user)) + (,compnent-s (get-record resume-pkg (make-instance ',component-s :id id :user_id (id user))))) + (if ,component-s + (progn + (delete-record resume-pkg ,component-s) + (setf (session-value :message) (format nil "~a deleted successfully." ,componen))) + (setf (session-value :errormsg) (format nil "Error: could not delete ~a: not found." ,component))))))))))) + +(define-resume-component ('contactinfo '((address :parameter-type 'string) (city :parameter-type 'string) (state_id :parameter-type 'integer) (phone :parameter-type 'string) (email :parameter-type 'string) (visastatus_id :parameter-type 'integer))) + input-form-fields) diff --git a/lisp/sql/resume-pkg.lisp b/lisp/sql/resume-pkg.lisp index c45a6e1..b54aa47 100644 --- a/lisp/sql/resume-pkg.lisp +++ b/lisp/sql/resume-pkg.lisp @@ -7,80 +7,10 @@ () (:documentation "")) -;; resumes - -(defmethod get-all-resumes ((resume-pkg resume-pkg) (user user)) - (let ((resume (make-instance 'resume :user_id (id user)))) - (get-records resume-pkg resume "name asc"))) - -(defmethod insert-resume ((resume-pkg resume-pkg) (resume resume)) - (setf (*table resume) (format nil - "resume.insert_resume(~a, '~a')" - (user_id resume) - (name resume))) - (caar (call-pg-function resume-pkg resume))) +;; resume (defmethod delete-resume ((resume-pkg resume-pkg) (resume resume)) (setf (*table resume) (format nil "resume.delete_resume(~a)" (id resume))) (caar (call-pg-function resume-pkg resume))) - -;; contactinfo - -(defmethod get-all-contactinfo ((resume-pkg resume-pkg) (user user)) - (let ((contactinfo-v (make-instance 'contactinfo-v :user_id (id user)))) - (get-records resume-pkg contactinfo-v "state_name asc, city asc, address asc, email asc, phone asc, visastatus asc"))) - -(defmethod insert-contactinfo ((resume-pkg resume-pkg) (contactinfo contactinfo)) - (setf (*table contactinfo) (format nil - "resume.insert_contactinfo(~a, ~a, ~a, '~a', '~a', '~a', '~a')" - (user_id contactinfo) - (state_id contactinfo) - (visastatus_id contactinfo) - (address contactinfo) - (city contactinfo) - (phone contactinfo) - (email contactinfo))) - (caar (call-pg-function resume-pkg contactinfo))) - -;; education - -(defmethod get-all-education ((resume-pkg resume-pkg) (user user)) - (let ((education (make-instance 'education :user_id (id user)))) - (get-records resume-pkg education "school asc, end_date asc, major asc, minor asc"))) - -(defmethod insert-education ((resume-pkg resume-pkg) (education education)) - (setf (*table education) (format nil - "resume.insert_education(~a, '~a', '~a', '~a', '~a', '~a', '~a', '~a')" - (user_id education) - (school education) - (start_date education) - (end_date education) - (major education) - (minor education) - (degree education) - (progress education))) - (caar (call-pg-function resume-pkg education))) - -;; language - -(defmethod get-all-languages ((resume-pkg resume-pkg) (user user)) - (let ((language (make-instance 'language :user_id (id user)))) - (get-records resume-pkg language "name asc"))) - -(defmethod insert-language ((resume-pkg resume-pkg) (language language)) - (setf (*table language) (format nil - "resume.insert_language(~a, '~a', '~a', '~a', '~a', '~a', '~a')" - (user_id language) - (name language) - (understanding_listening language) - (understanding_reading language) - (speaking_interaction language) - (speaking_production language) - (writing language))) - (caar (call-pg-function resume-pkg language))) - -;; job - - diff --git a/lisp/sql/skill.lisp b/lisp/sql/skill.lisp index 3b43d29..c662a6a 100644 --- a/lisp/sql/skill.lisp +++ b/lisp/sql/skill.lisp @@ -7,6 +7,9 @@ ((id :initarg :id :initform nil :accessor id) + (user_id :initarg :user_id + :initform nil + :accessor user_id) (skill :initarg :skill :initform nil :accessor skill) diff --git a/lisp/webapps/resume/clojurescript/resume/src/core.cljs b/lisp/webapps/resume/clojurescript/resume/src/core.cljs index 532a52b..6f21e53 100644 --- a/lisp/webapps/resume/clojurescript/resume/src/core.cljs +++ b/lisp/webapps/resume/clojurescript/resume/src/core.cljs @@ -126,29 +126,29 @@ (declare on-users-delete-clicked) (declare handler-users-delete) (declare render-users-delete) -(declare template-resumes) -(declare handler-resumes) -(declare render-resumes) -(declare template-resumes-view) -(declare handler-resumes-view) -(declare render-resumes-view) -(declare on-resumes-add-clicked) -(declare template-resumes-add) -(declare handler-resumes-add) -(declare render-resumes-add) -(declare on-resumes-add-submit-clicked) -(declare handler-resumes-add-submit) -(declare render-resumes-add-submit) -(declare on-resumes-modify-clicked) -(declare template-resumes-modify) -(declare handler-resumes-modify) -(declare render-resumes-modify) -(declare on-resumes-modify-submit-clicked) -(declare handler-resumes-modify-submit) -(declare render-resumes-modify-submit) -(declare on-resumes-delete-clicked) -(declare handler-resumes-delete) -(declare render-resumes-delete) +(declare template-resume) +(declare handler-resume) +(declare render-resume) +(declare template-resume-view) +(declare handler-resume-view) +(declare render-resume-view) +(declare on-resume-add-clicked) +(declare template-resume-add) +(declare handler-resume-add) +(declare render-resume-add) +(declare on-resume-add-submit-clicked) +(declare handler-resume-add-submit) +(declare render-resume-add-submit) +(declare on-resume-modify-clicked) +(declare template-resume-modify) +(declare handler-resume-modify) +(declare render-resume-modify) +(declare on-resume-modify-submit-clicked) +(declare handler-resume-modify-submit) +(declare render-resume-modify-submit) +(declare on-resume-delete-clicked) +(declare handler-resume-delete) +(declare render-resume-delete) (declare template-contactinfo) (declare handler-contactinfo) (declare render-contactinfo) @@ -218,6 +218,29 @@ (declare on-language-delete-clicked) (declare handler-language-delete) (declare render-language-delete) +(declare template-skill) +(declare handler-skill) +(declare render-skill) +(declare template-skill-view) +(declare handler-skill-view) +(declare render-skill-view) +(declare on-skill-add-clicked) +(declare template-skill-add) +(declare handler-skill-add) +(declare render-skill-add) +(declare on-skill-add-submit-clicked) +(declare handler-skill-add-submit) +(declare render-skill-add-submit) +(declare on-skill-modify-clicked) +(declare template-skill-modify) +(declare handler-skill-modify) +(declare render-skill-modify) +(declare on-skill-modify-submit-clicked) +(declare handler-skill-modify-submit) +(declare render-skill-modify-submit) +(declare on-skill-delete-clicked) +(declare handler-skill-delete) +(declare render-skill-delete) (declare on-menu-clicked) (declare handler-location) (declare goto-location) @@ -1096,9 +1119,9 @@ {:format :raw :handler handler-users-delete})) -;; resumes +;; resume -(hiccups/defhtml template-resumes [jsonobj] +(hiccups/defhtml template-resume [jsonobj] [:h3 {:style "text-align: center"} (get jsonobj "title")] [:div {:id "content"}] [:div {:id "modify" @@ -1123,22 +1146,22 @@ [:span {:class "glyphicon glyphicon-remove"}] "Cancel"]]]]]) -(defn handler-resumes [response] +(defn handler-resume [response] (let [jsonobj (js->clj (js/JSON.parse response))] (notifications jsonobj) - (dommy/set-html! (dommy/sel1 :#body) (template-resumes jsonobj)) - (render-resumes-view))) + (dommy/set-html! (dommy/sel1 :#body) (template-resume jsonobj)) + (render-resume-view))) -(defn render-resumes [] - (GET "/resumes" {:handler handler-resumes})) +(defn render-resume [] + (GET "/resume" {:handler handler-resume})) -;; resumes-view +;; resume-view -(hiccups/defhtml template-resumes-view [jsonobj] +(hiccups/defhtml template-resume-view [jsonobj] [:div {:style "text-align: right"} [:img {:src "/static/images/add.png" :style "cursor:pointer; cursor:hand" - :onclick (str (namespace ::x) ".on_resumes_add_clicked()")}]] + :onclick (str (namespace ::x) ".on_resume_add_clicked()")}]] [:table {:class "table table-striped table-hover table-sm"} [:thead [:tr @@ -1151,113 +1174,113 @@ [:td (get resume "name")] [:td {:width "30"} [:img {:src "/static/images/modify.png" - :onclick (str (namespace ::x) ".on_resumes_modify_clicked(" (get resume "id") ")")}]] + :onclick (str (namespace ::x) ".on_resume_modify_clicked(" (get resume "id") ")")}]] [:td {:width "30"} [:img {:src "/static/images/delete.png" - :onclick (str (namespace ::x) ".on_resumes_delete_clicked(" (get resume "id") ", '" (get resume "name") "')")}]]])]]) + :onclick (str (namespace ::x) ".on_resume_delete_clicked(" (get resume "id") ", '" (get resume "name") "')")}]]])]]) -(defn handler-resumes-view [response] +(defn handler-resume-view [response] (let [jsonobj (js->clj (js/JSON.parse response))] - (dommy/set-html! (dommy/sel1 :#content) (template-resumes-view jsonobj)))) + (dommy/set-html! (dommy/sel1 :#content) (template-resume-view jsonobj)))) -(defn render-resumes-view [] - (GET "/resumes/view" {:handler handler-resumes-view})) +(defn render-resume-view [] + (GET "/resume/view" {:handler handler-resume-view})) -;; resumes-add +;; resume-add -(defn on-resumes-add-clicked [] - (render-resumes-add)) +(defn on-resume-add-clicked [] + (render-resume-add)) -(hiccups/defhtml template-resumes-add [jsonobj] +(hiccups/defhtml template-resume-add [jsonobj] (ck-form/template-generic-form (get jsonobj "form") (namespace ::x))) -(defn handler-resumes-add [response] +(defn handler-resume-add [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-resumes-add jsonobj)) + (dommy/set-html! (dommy/sel1 :#modify-body) (template-resume-add jsonobj)) (.modal (jquery "#modify")))) -(defn render-resumes-add [] - (POST "/resumes/add" {:handler handler-resumes-add})) +(defn render-resume-add [] + (POST "/resume/add" {:handler handler-resume-add})) -;; resumes-add-submit +;; resume-add-submit -(defn on-resumes-add-submit-clicked [] - (when (-> (jquery "#resumes-add-form") +(defn on-resume-add-submit-clicked [] + (when (-> (jquery "#resume-add-form") (.get "0") (.checkValidity)) (.modal (jquery "#modify") "hide") - (render-resumes-add-submit))) + (render-resume-add-submit))) -(defn handler-resumes-add-submit [response] +(defn handler-resume-add-submit [response] (let [jsonobj (js->clj (js/JSON.parse response))] (auth-notifications jsonobj) - (on-menu-clicked "/resumes"))) + (on-menu-clicked "/resume"))) -(defn render-resumes-add-submit [] - (POST "/resumes/add/submit" +(defn render-resume-add-submit [] + (POST "/resume/add/submit" {:format :raw :params {:name (dommy/value (dommy/sel1 :#name))} - :handler handler-resumes-add-submit})) + :handler handler-resume-add-submit})) -;; resumes-modify +;; resume-modify -(defn on-resumes-modify-clicked [id] - (render-resumes-modify id)) +(defn on-resume-modify-clicked [id] + (render-resume-modify id)) -(hiccups/defhtml template-resumes-modify [jsonobj] +(hiccups/defhtml template-resume-modify [jsonobj] (ck-form/template-generic-form (get jsonobj "form") (namespace ::x))) -(defn handler-resumes-modify [response] +(defn handler-resume-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-resumes-modify jsonobj)) + (dommy/set-html! (dommy/sel1 :#modify-body) (template-resume-modify jsonobj)) (.modal (jquery "#modify")))) -(defn render-resumes-modify [id] - (POST "/resumes/modify" +(defn render-resume-modify [id] + (POST "/resume/modify" {:format :raw :params {:id id} - :handler handler-resumes-modify})) + :handler handler-resume-modify})) -;; resumes-modify-submit +;; resume-modify-submit -(defn on-resumes-modify-submit-clicked [] - (when (-> (jquery "#resumes-modify-form") +(defn on-resume-modify-submit-clicked [] + (when (-> (jquery "#resume-modify-form") (.get "0") (.checkValidity)) (.modal (jquery "#modify") "hide") - (render-resumes-modify-submit))) + (render-resume-modify-submit))) -(defn handler-resumes-modify-submit [response] +(defn handler-resume-modify-submit [response] (let [jsonobj (js->clj (js/JSON.parse response))] (auth-notifications jsonobj) - (on-menu-clicked "/resumes"))) + (on-menu-clicked "/resume"))) -(defn render-resumes-modify-submit [] - (POST "/resumes/modify/submit" +(defn render-resume-modify-submit [] + (POST "/resume/modify/submit" {:format :raw :params {:id (dommy/value (dommy/sel1 :#id)) :name (dommy/value (dommy/sel1 :#name))} - :handler handler-resumes-modify-submit})) + :handler handler-resume-modify-submit})) -;; resumes-delete +;; resume-delete -(defn on-resumes-delete-clicked [id name] +(defn on-resume-delete-clicked [id name] (when (js/confirm (str "Are you sure you want to delete " name "? This action cannot be undone.")) - (render-resumes-delete id))) + (render-resume-delete id))) -(defn handler-resumes-delete [response] +(defn handler-resume-delete [response] (let [jsonobj (js->clj (js/JSON.parse response))] (auth-notifications jsonobj) - (on-menu-clicked "/resumes"))) + (on-menu-clicked "/resume"))) -(defn render-resumes-delete [id] - (DELETE (str "/resumes/delete/" id) +(defn render-resume-delete [id] + (DELETE (str "/resume/delete/" id) {:format :raw - :handler handler-resumes-delete})) + :handler handler-resume-delete})) ;; contactinfo @@ -1293,7 +1316,7 @@ (render-contactinfo-view))) (defn render-contactinfo [] - (GET "/resumes/contactinfo" {:handler handler-contactinfo})) + (GET "/resume/contactinfo" {:handler handler-contactinfo})) ;; contactinfo-view @@ -1334,7 +1357,7 @@ (dommy/set-html! (dommy/sel1 :#content) (template-contactinfo-view jsonobj)))) (defn render-contactinfo-view [] - (GET "/resumes/contactinfo/view" {:handler handler-contactinfo-view})) + (GET "/resume/contactinfo/view" {:handler handler-contactinfo-view})) ;; contactinfo-add @@ -1352,7 +1375,7 @@ (.modal (jquery "#modify")))) (defn render-contactinfo-add [] - (POST "/resumes/contactinfo/add" {:handler handler-contactinfo-add})) + (POST "/resume/contactinfo/add" {:handler handler-contactinfo-add})) ;; contactinfo-add-submit @@ -1366,10 +1389,10 @@ (defn handler-contactinfo-add-submit [response] (let [jsonobj (js->clj (js/JSON.parse response))] (auth-notifications jsonobj) - (on-menu-clicked "/resumes/contactinfo"))) + (on-menu-clicked "/resume/contactinfo"))) (defn render-contactinfo-add-submit [] - (POST "/resumes/contactinfo/add/submit" + (POST "/resume/contactinfo/add/submit" {:format :raw :params {:address (dommy/value (dommy/sel1 :#address)) :city (dommy/value (dommy/sel1 :#city)) @@ -1395,7 +1418,7 @@ (.modal (jquery "#modify")))) (defn render-contactinfo-modify [id] - (POST "/resumes/contactinfo/modify" + (POST "/resume/contactinfo/modify" {:format :raw :params {:id id} :handler handler-contactinfo-modify})) @@ -1412,10 +1435,10 @@ (defn handler-contactinfo-modify-submit [response] (let [jsonobj (js->clj (js/JSON.parse response))] (auth-notifications jsonobj) - (on-menu-clicked "/resumes/contactinfo"))) + (on-menu-clicked "/resume/contactinfo"))) (defn render-contactinfo-modify-submit [] - (POST "/resumes/contactinfo/modify/submit" + (POST "/resume/contactinfo/modify/submit" {:format :raw :params {:id (dommy/value (dommy/sel1 :#id)) :address (dommy/value (dommy/sel1 :#address)) @@ -1435,10 +1458,10 @@ (defn handler-contactinfo-delete [response] (let [jsonobj (js->clj (js/JSON.parse response))] (auth-notifications jsonobj) - (on-menu-clicked "/resumes/contactinfo"))) + (on-menu-clicked "/resume/contactinfo"))) (defn render-contactinfo-delete [id] - (DELETE (str "/resumes/contactinfo/delete/" id) + (DELETE (str "/resume/contactinfo/delete/" id) {:format :raw :handler handler-contactinfo-delete})) @@ -1476,7 +1499,7 @@ (render-education-view))) (defn render-education [] - (GET "/resumes/education" {:handler handler-education})) + (GET "/resume/education" {:handler handler-education})) ;; education-view @@ -1519,7 +1542,7 @@ (dommy/set-html! (dommy/sel1 :#content) (template-education-view jsonobj)))) (defn render-education-view [] - (GET "/resumes/education/view" {:handler handler-education-view})) + (GET "/resume/education/view" {:handler handler-education-view})) ;; education-add @@ -1537,7 +1560,7 @@ (.modal (jquery "#modify")))) (defn render-education-add [] - (POST "/resumes/education/add" {:handler handler-education-add})) + (POST "/resume/education/add" {:handler handler-education-add})) ;; education-add-submit @@ -1551,10 +1574,10 @@ (defn handler-education-add-submit [response] (let [jsonobj (js->clj (js/JSON.parse response))] (auth-notifications jsonobj) - (on-menu-clicked "/resumes/education"))) + (on-menu-clicked "/resume/education"))) (defn render-education-add-submit [] - (POST "/resumes/education/add/submit" + (POST "/resume/education/add/submit" {:format :raw :params {:school (dommy/value (dommy/sel1 :#school)) :major (dommy/value (dommy/sel1 :#major)) @@ -1581,7 +1604,7 @@ (.modal (jquery "#modify")))) (defn render-education-modify [id] - (POST "/resumes/education/modify" + (POST "/resume/education/modify" {:format :raw :params {:id id} :handler handler-education-modify})) @@ -1598,10 +1621,10 @@ (defn handler-education-modify-submit [response] (let [jsonobj (js->clj (js/JSON.parse response))] (auth-notifications jsonobj) - (on-menu-clicked "/resumes/education"))) + (on-menu-clicked "/resume/education"))) (defn render-education-modify-submit [] - (POST "/resumes/education/modify/submit" + (POST "/resume/education/modify/submit" {:format :raw :params {:id (dommy/value (dommy/sel1 :#id)) :school (dommy/value (dommy/sel1 :#school)) @@ -1622,10 +1645,10 @@ (defn handler-education-delete [response] (let [jsonobj (js->clj (js/JSON.parse response))] (auth-notifications jsonobj) - (on-menu-clicked "/resumes/education"))) + (on-menu-clicked "/resume/education"))) (defn render-education-delete [id] - (DELETE (str "/resumes/education/delete/" id) + (DELETE (str "/resume/education/delete/" id) {:format :raw :handler handler-education-delete})) @@ -1663,7 +1686,7 @@ (render-language-view))) (defn render-language [] - (GET "/resumes/language" {:handler handler-language})) + (GET "/resume/language" {:handler handler-language})) ;; language-view @@ -1704,7 +1727,7 @@ (dommy/set-html! (dommy/sel1 :#content) (template-language-view jsonobj)))) (defn render-language-view [] - (GET "/resumes/language/view" {:handler handler-language-view})) + (GET "/resume/language/view" {:handler handler-language-view})) ;; language-add @@ -1722,7 +1745,7 @@ (.modal (jquery "#modify")))) (defn render-language-add [] - (POST "/resumes/language/add" {:handler handler-language-add})) + (POST "/resume/language/add" {:handler handler-language-add})) ;; language-add-submit @@ -1736,10 +1759,10 @@ (defn handler-language-add-submit [response] (let [jsonobj (js->clj (js/JSON.parse response))] (auth-notifications jsonobj) - (on-menu-clicked "/resumes/language"))) + (on-menu-clicked "/resume/language"))) (defn render-language-add-submit [] - (POST "/resumes/language/add/submit" + (POST "/resume/language/add/submit" {:format :raw :params {:name (dommy/value (dommy/sel1 :#name)) :understanding_listening (dommy/value (dommy/sel1 :#understanding_listening)) @@ -1765,7 +1788,7 @@ (.modal (jquery "#modify")))) (defn render-language-modify [id] - (POST "/resumes/language/modify" + (POST "/resume/language/modify" {:format :raw :params {:id id} :handler handler-language-modify})) @@ -1782,10 +1805,10 @@ (defn handler-language-modify-submit [response] (let [jsonobj (js->clj (js/JSON.parse response))] (auth-notifications jsonobj) - (on-menu-clicked "/resumes/language"))) + (on-menu-clicked "/resume/language"))) (defn render-language-modify-submit [] - (POST "/resumes/language/modify/submit" + (POST "/resume/language/modify/submit" {:format :raw :params {:id (dommy/value (dommy/sel1 :#id)) :name (dommy/value (dommy/sel1 :#name)) @@ -1805,13 +1828,176 @@ (defn handler-language-delete [response] (let [jsonobj (js->clj (js/JSON.parse response))] (auth-notifications jsonobj) - (on-menu-clicked "/resumes/language"))) + (on-menu-clicked "/resume/language"))) (defn render-language-delete [id] - (DELETE (str "/resumes/language/delete/" id) + (DELETE (str "/resume/language/delete/" id) {:format :raw :handler handler-language-delete})) +;; skill + +(hiccups/defhtml template-skill [jsonobj] + [:h3 {:style "text-align: center"} (get jsonobj "title")] + [:div {:id "content"}] + [:div {:id "modify" + :class "modal fade" + :role "dialog" + :tabindex "-1"} + [:div {:class "modal-dialog modal-lg"} + [:div {:class "modal-content"} + [:div {:class "modal-header"} + [:h5 [:span {:id "modify-title"}]] + [:button {:type "button" + :class "close" + :data-dismiss "modal"} + "×"]] + [:div {:id "modify-body" + :class "modal-body" + :style "height: 450px;"}] + [:div {:class "modal-footer"} + [:button {:type "submit" + :class "btn btn-danger btn-default" + :data-dismiss "modal"} + [:span {:class "glyphicon glyphicon-remove"}] + "Cancel"]]]]]) + +(defn handler-skill [response] + (let [jsonobj (js->clj (js/JSON.parse response))] + (notifications jsonobj) + (dommy/set-html! (dommy/sel1 :#body) (template-skill jsonobj)) + (render-skill-view))) + +(defn render-skill [] + (GET "/resume/skill" {:handler handler-skill})) + +;; skill-view + +(hiccups/defhtml template-skill-view [jsonobj] + [:div {:style "text-align: right"} + [:img {:src "/static/images/add.png" + :style "cursor:pointer; cursor:hand" + :onclick (str (namespace ::x) ".on_skill_add_clicked()")}]] + [:table {:class "table table-striped table-hover table-sm"} + [:thead + [:tr + [:th {:scope "col"} "Skill"] + [:th {:scope "col"} "Mod"] + [:th {:scope "col"} "Del"]]] + [:tbody + (for [skill (get jsonobj "skills")] + [:tr + [:td (get skill "skill")] + [:td {:width "30"} + [:img {:src "/static/images/modify.png" + :onclick (str (namespace ::x) ".on_skill_modify_clicked(" (get skill "id") ")")}]] + [:td {:width "30"} + [:img {:src "/static/images/delete.png" + :onclick (str (namespace ::x) ".on_skill_delete_clicked(" (get skill "id") ", '" (get skill "skill") "')")}]]])]]) + +(defn handler-skill-view [response] + (let [jsonobj (js->clj (js/JSON.parse response))] + (dommy/set-html! (dommy/sel1 :#content) (template-skill-view jsonobj)))) + +(defn render-skill-view [] + (GET "/resume/skill/view" {:handler handler-skill-view})) + +;; skill-add + +(defn on-skill-add-clicked [] + (render-skill-add)) + +(hiccups/defhtml template-skill-add [jsonobj] + (ck-form/template-generic-form (get jsonobj "form") (namespace ::x))) + +(defn handler-skill-add [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-skill-add jsonobj)) + (.modal (jquery "#modify")))) + +(defn render-skill-add [] + (POST "/resume/skill/add" {:handler handler-skill-add})) + +;; skill-add-submit + +(defn on-skill-add-submit-clicked [] + (when (-> (jquery "#skill-add-form") + (.get "0") + (.checkValidity)) + (.modal (jquery "#modify") "hide") + (render-skill-add-submit))) + +(defn handler-skill-add-submit [response] + (let [jsonobj (js->clj (js/JSON.parse response))] + (auth-notifications jsonobj) + (on-menu-clicked "/resume/skill"))) + +(defn render-skill-add-submit [] + (POST "/resume/skill/add/submit" + {:format :raw + :params {:skill (dommy/value (dommy/sel1 :#skill))} + :handler handler-skill-add-submit})) + +;; skill-modify + +(defn on-skill-modify-clicked [id] + (render-skill-modify id)) + +(hiccups/defhtml template-skill-modify [jsonobj] + (ck-form/template-generic-form (get jsonobj "form") (namespace ::x))) + +(defn handler-skill-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-skill-modify jsonobj)) + (.modal (jquery "#modify")))) + +(defn render-skill-modify [id] + (POST "/resume/skill/modify" + {:format :raw + :params {:id id} + :handler handler-skill-modify})) + +;; skill-modify-submit + +(defn on-skill-modify-submit-clicked [] + (when (-> (jquery "#skill-modify-form") + (.get "0") + (.checkValidity)) + (.modal (jquery "#modify") "hide") + (render-skill-modify-submit))) + +(defn handler-skill-modify-submit [response] + (let [jsonobj (js->clj (js/JSON.parse response))] + (auth-notifications jsonobj) + (on-menu-clicked "/resume/skill"))) + +(defn render-skill-modify-submit [] + (POST "/resume/skill/modify/submit" + {:format :raw + :params {:id (dommy/value (dommy/sel1 :#id)) + :skill (dommy/value (dommy/sel1 :#skill))} + :handler handler-skill-modify-submit})) + +;; skill-delete + +(defn on-skill-delete-clicked [id name] + (when (js/confirm (str "Are you sure you want to delete " name "? This action cannot be undone.")) + (render-skill-delete id))) + +(defn handler-skill-delete [response] + (let [jsonobj (js->clj (js/JSON.parse response))] + (auth-notifications jsonobj) + (on-menu-clicked "/resume/skill"))) + +(defn render-skill-delete [id] + (DELETE (str "/resume/skill/delete/" id) + {:format :raw + :handler handler-skill-delete})) + ;; location (defn on-menu-clicked [handler] @@ -1825,10 +2011,11 @@ (= handler "/contact-us") (render-contact-us) (= handler "/messages") (render-messages) (= handler "/users") (render-users) - (= handler "/resumes") (render-resumes) - (= handler "/resumes/contactinfo") (render-contactinfo) - (= handler "/resumes/education") (render-education) - (= handler "/resumes/language") (render-language))) + (= handler "/resume") (render-resume) + (= handler "/resume/contactinfo") (render-contactinfo) + (= handler "/resume/education") (render-education) + (= handler "/resume/language") (render-language) + (= handler "/resume/skill") (render-skill))) (defn handler-location [response] (let [jsonobj (js->clj (js/JSON.parse response))] diff --git a/lisp/webapps/resume/site.lisp b/lisp/webapps/resume/site.lisp index 584c0b7..a8af2d6 100644 --- a/lisp/webapps/resume/site.lisp +++ b/lisp/webapps/resume/site.lisp @@ -131,26 +131,26 @@ (defmacro .users-delete () `(users-delete-json id)) -(defmacro .resumes () - `(resumes-json)) +(defmacro .resume () + `(resume-json)) -(defmacro .resumes-view () - `(resumes-view-json)) +(defmacro .resume-view () + `(resume-view-json)) -(defmacro .resumes-add () - `(resumes-add-json)) +(defmacro .resume-add () + `(resume-add-json)) -(defmacro .resumes-add-submit () - `(resumes-add-submit-json name)) +(defmacro .resume-add-submit () + `(resume-add-submit-json name)) -(defmacro .resumes-modify () - `(resumes-modify-json id)) +(defmacro .resume-modify () + `(resume-modify-json id)) -(defmacro .resumes-modify-submit () - `(resumes-modify-submit-json id name)) +(defmacro .resume-modify-submit () + `(resume-modify-submit-json id name)) -(defmacro .resumes-delete () - `(resumes-delete-json id)) +(defmacro .resume-delete () + `(resume-delete-json id)) (defmacro .contactinfo () `(contactinfo-json)) @@ -215,6 +215,27 @@ (defmacro .language-delete () `(language-delete-json id)) +(defmacro .skill () + `(skill-json)) + +(defmacro .skill-view () + `(skill-view-json)) + +(defmacro .skill-add () + `(skill-add-json)) + +(defmacro .skill-add-submit () + `(skill-add-submit-json skill)) + +(defmacro .skill-modify () + `(skill-modify-json id)) + +(defmacro .skill-modify-submit () + `(skill-modify-submit-json id skill)) + +(defmacro .skill-delete () + `(skill-delete-json id)) + (define-endpoint ("/" :method :get) () .base) (define-endpoint ("/location" :method :post) (&post (location :parameter-type 'string)) .location) (define-endpoint ("/home" :method :get) () .home-get) @@ -252,31 +273,38 @@ (define-endpoint ("/users/modify/submit" :method :post) (&post (id :parameter-type 'integer) (role_groups :parameter-type 'string) (username :parameter-type 'string) (first_name :parameter-type 'string) (last_name :parameter-type 'string) (email :parameter-type 'string) (phone :parameter-type 'string)) .users-modify-submit) (define-endpoint ("/users/toggle-active" :method :post) (&post (id :parameter-type 'integer)) .users-toggle-active) (define-endpoint ("/users/delete/:id" :method :delete) (&path (id 'integer)) .users-delete) -(define-endpoint ("/resumes" :method :get) () .resumes) -(define-endpoint ("/resumes/view" :method :get) () .resumes-view) -(define-endpoint ("/resumes/add" :method :post) () .resumes-add) -(define-endpoint ("/resumes/add/submit" :method :post) (&post (name :parameter-type 'string)) .resumes-add-submit) -(define-endpoint ("/resumes/modify" :method :post) (&post (id :parameter-type 'integer)) .resumes-modify) -(define-endpoint ("/resumes/modify/submit" :method :post) (&post (id :parameter-type 'integer) (name :parameter-type 'string)) .resumes-modify-submit) -(define-endpoint ("/resumes/delete/:id" :method :delete) (&path (id 'integer)) .resumes-delete) -(define-endpoint ("/resumes/contactinfo" :method :get) () .contactinfo) -(define-endpoint ("/resumes/contactinfo/view" :method :get) () .contactinfo-view) -(define-endpoint ("/resumes/contactinfo/add" :method :post) () .contactinfo-add) -(define-endpoint ("/resumes/contactinfo/add/submit" :method :post) (&post (address :parameter-type 'string) (city :parameter-type 'string) (state_id :parameter-type 'integer) (phone :parameter-type 'string) (email :parameter-type 'string) (visastatus_id :parameter-type 'integer)) .contactinfo-add-submit) -(define-endpoint ("/resumes/contactinfo/modify" :method :post) (&post (id :parameter-type 'integer)) .contactinfo-modify) -(define-endpoint ("/resumes/contactinfo/modify/submit" :method :post) (&post (id :parameter-type 'integer) (address :parameter-type 'string) (city :parameter-type 'string) (state_id :parameter-type 'integer) (phone :parameter-type 'string) (email :parameter-type 'string) (visastatus_id :parameter-type 'integer)) .contactinfo-modify-submit) -(define-endpoint ("/resumes/contactinfo/delete/:id" :method :delete) (&path (id 'integer)) .contactinfo-delete) -(define-endpoint ("/resumes/education" :method :get) () .education) -(define-endpoint ("/resumes/education/view" :method :get) () .education-view) -(define-endpoint ("/resumes/education/add" :method :post) () .education-add) -(define-endpoint ("/resumes/education/add/submit" :method :post) (&post (school :parameter-type 'string) (major :parameter-type 'string) (minor :parameter-type 'string) (degree :parameter-type 'string) (progress :parameter-type 'string) (start_date :parameter-type 'string) (end_date :parameter-type 'string)) .education-add-submit) -(define-endpoint ("/resumes/education/modify" :method :post) (&post (id :parameter-type 'integer)) .education-modify) -(define-endpoint ("/resumes/education/modify/submit" :method :post) (&post (id :parameter-type 'integer) (school :parameter-type 'string) (major :parameter-type 'string) (minor :parameter-type 'string) (degree :parameter-type 'string) (progress :parameter-type 'string) (start_date :parameter-type 'string) (end_date :parameter-type 'string)) .education-modify-submit) -(define-endpoint ("/resumes/education/delete/:id" :method :delete) (&path (id 'integer)) .education-delete) -(define-endpoint ("/resumes/language" :method :get) () .language) -(define-endpoint ("/resumes/language/view" :method :get) () .language-view) -(define-endpoint ("/resumes/language/add" :method :post) () .language-add) -(define-endpoint ("/resumes/language/add/submit" :method :post) (&post (name :parameter-type 'string) (understanding_listening :parameter-type 'string) (understanding_reading :parameter-type 'string) (speaking_interaction :parameter-type 'string) (speaking_production :parameter-type 'string) (writing :parameter-type 'string)) .language-add-submit) -(define-endpoint ("/resumes/language/modify" :method :post) (&post (id :parameter-type 'integer)) .language-modify) -(define-endpoint ("/resumes/language/modify/submit" :method :post) (&post (id :parameter-type 'integer) (name :parameter-type 'string) (understanding_listening :parameter-type 'string) (understanding_reading :parameter-type 'string) (speaking_interaction :parameter-type 'string) (speaking_production :parameter-type 'string) (writing :parameter-type 'string)) .language-modify-submit) -(define-endpoint ("/resumes/language/delete/:id" :method :delete) (&path (id 'integer)) .language-delete) +(define-endpoint ("/resume" :method :get) () .resume) +(define-endpoint ("/resume/view" :method :get) () .resume-view) +(define-endpoint ("/resume/add" :method :post) () .resume-add) +(define-endpoint ("/resume/add/submit" :method :post) (&post (name :parameter-type 'string)) .resume-add-submit) +(define-endpoint ("/resume/modify" :method :post) (&post (id :parameter-type 'integer)) .resume-modify) +(define-endpoint ("/resume/modify/submit" :method :post) (&post (id :parameter-type 'integer) (name :parameter-type 'string)) .resume-modify-submit) +(define-endpoint ("/resume/delete/:id" :method :delete) (&path (id 'integer)) .resume-delete) +(define-endpoint ("/resume/contactinfo" :method :get) () .contactinfo) +(define-endpoint ("/resume/contactinfo/view" :method :get) () .contactinfo-view) +(define-endpoint ("/resume/contactinfo/add" :method :post) () .contactinfo-add) +(define-endpoint ("/resume/contactinfo/add/submit" :method :post) (&post (address :parameter-type 'string) (city :parameter-type 'string) (state_id :parameter-type 'integer) (phone :parameter-type 'string) (email :parameter-type 'string) (visastatus_id :parameter-type 'integer)) .contactinfo-add-submit) +(define-endpoint ("/resume/contactinfo/modify" :method :post) (&post (id :parameter-type 'integer)) .contactinfo-modify) +(define-endpoint ("/resume/contactinfo/modify/submit" :method :post) (&post (id :parameter-type 'integer) (address :parameter-type 'string) (city :parameter-type 'string) (state_id :parameter-type 'integer) (phone :parameter-type 'string) (email :parameter-type 'string) (visastatus_id :parameter-type 'integer)) .contactinfo-modify-submit) +(define-endpoint ("/resume/contactinfo/delete/:id" :method :delete) (&path (id 'integer)) .contactinfo-delete) +(define-endpoint ("/resume/education" :method :get) () .education) +(define-endpoint ("/resume/education/view" :method :get) () .education-view) +(define-endpoint ("/resume/education/add" :method :post) () .education-add) +(define-endpoint ("/resume/education/add/submit" :method :post) (&post (school :parameter-type 'string) (major :parameter-type 'string) (minor :parameter-type 'string) (degree :parameter-type 'string) (progress :parameter-type 'string) (start_date :parameter-type 'string) (end_date :parameter-type 'string)) .education-add-submit) +(define-endpoint ("/resume/education/modify" :method :post) (&post (id :parameter-type 'integer)) .education-modify) +(define-endpoint ("/resume/education/modify/submit" :method :post) (&post (id :parameter-type 'integer) (school :parameter-type 'string) (major :parameter-type 'string) (minor :parameter-type 'string) (degree :parameter-type 'string) (progress :parameter-type 'string) (start_date :parameter-type 'string) (end_date :parameter-type 'string)) .education-modify-submit) +(define-endpoint ("/resume/education/delete/:id" :method :delete) (&path (id 'integer)) .education-delete) +(define-endpoint ("/resume/language" :method :get) () .language) +(define-endpoint ("/resume/language/view" :method :get) () .language-view) +(define-endpoint ("/resume/language/add" :method :post) () .language-add) +(define-endpoint ("/resume/language/add/submit" :method :post) (&post (name :parameter-type 'string) (understanding_listening :parameter-type 'string) (understanding_reading :parameter-type 'string) (speaking_interaction :parameter-type 'string) (speaking_production :parameter-type 'string) (writing :parameter-type 'string)) .language-add-submit) +(define-endpoint ("/resume/language/modify" :method :post) (&post (id :parameter-type 'integer)) .language-modify) +(define-endpoint ("/resume/language/modify/submit" :method :post) (&post (id :parameter-type 'integer) (name :parameter-type 'string) (understanding_listening :parameter-type 'string) (understanding_reading :parameter-type 'string) (speaking_interaction :parameter-type 'string) (speaking_production :parameter-type 'string) (writing :parameter-type 'string)) .language-modify-submit) +(define-endpoint ("/resume/language/delete/:id" :method :delete) (&path (id 'integer)) .language-delete) +(define-endpoint ("/resume/skill" :method :get) () .skill) +(define-endpoint ("/resume/skill/view" :method :get) () .skill-view) +(define-endpoint ("/resume/skill/add" :method :post) () .skill-add) +(define-endpoint ("/resume/skill/add/submit" :method :post) (&post (skill :parameter-type 'string)) .skill-add-submit) +(define-endpoint ("/resume/skill/modify" :method :post) (&post (id :parameter-type 'integer)) .skill-modify) +(define-endpoint ("/resume/skill/modify/submit" :method :post) (&post (id :parameter-type 'integer) (skill :parameter-type 'string)) .skill-modify-submit) +(define-endpoint ("/resume/skill/delete/:id" :method :delete) (&path (id 'integer)) .skill-delete) diff --git a/sql/functions/resume.insert_contactinfo.sql b/sql/functions/resume.insert_contactinfo.sql deleted file mode 100644 index 428e69b..0000000 --- a/sql/functions/resume.insert_contactinfo.sql +++ /dev/null @@ -1,45 +0,0 @@ -drop function resume.insert_contactinfo ( - p_user_id int, - p_state_id bigint, - p_visastatus_id bigint, - p_address character varying, - p_city character varying, - p_phone character varying, - p_email character varying -); - -create or replace function resume.insert_contactinfo ( - p_user_id int, - p_state_id bigint, - p_visastatus_id bigint, - p_address character varying, - p_city character varying, - p_phone character varying, - p_email character varying -) -returns bigint -as $$ -declare - l_id bigint; -begin - insert into resume.contactinfo ( - user_id, - state_id, - visastatus_id, - address, - city, - phone, - email - ) values ( - p_user_id, - p_state_id, - p_visastatus_id, - p_address, - p_city, - p_phone, - p_email - ) returning id into l_id; - - return l_id; -end; -$$ language plpgsql; diff --git a/sql/functions/resume.insert_education.sql b/sql/functions/resume.insert_education.sql deleted file mode 100644 index 59ba98b..0000000 --- a/sql/functions/resume.insert_education.sql +++ /dev/null @@ -1,49 +0,0 @@ -drop function resume.insert_education ( - p_user_id int, - p_school character varying, - p_start_date character varying, - p_end_date character varying, - p_major character varying, - p_minor character varying, - p_degree character varying, - p_progress character varying -); - -create or replace function resume.insert_education ( - p_user_id int, - p_school character varying, - p_start_date character varying, - p_end_date character varying, - p_major character varying, - p_minor character varying, - p_degree character varying, - p_progress character varying -) -returns bigint -as $$ -declare - l_id bigint; -begin - insert into resume.education ( - user_id, - school, - start_date, - end_date, - major, - minor, - degree, - progress - ) values ( - p_user_id, - p_school, - p_start_date, - p_end_date, - p_major, - p_minor, - p_degree, - p_progress - ) returning id into l_id; - - return l_id; -end; -$$ language plpgsql; diff --git a/sql/functions/resume.insert_language.sql b/sql/functions/resume.insert_language.sql deleted file mode 100644 index 92ce6b9..0000000 --- a/sql/functions/resume.insert_language.sql +++ /dev/null @@ -1,45 +0,0 @@ -drop function resume.insert_language ( - p_user_id int, - p_name character varying, - p_understanding_listening character varying, - p_understanding_reading character varying, - p_speaking_interaction character varying, - p_speaking_production character varying, - p_writing character varying -); - -create or replace function resume.insert_language ( - p_user_id int, - p_name character varying, - p_understanding_listening character varying, - p_understanding_reading character varying, - p_speaking_interaction character varying, - p_speaking_production character varying, - p_writing character varying -) -returns bigint -as $$ -declare - l_id bigint; -begin - insert into resume.language ( - user_id, - name, - understanding_listening, - understanding_reading, - speaking_interaction, - speaking_production, - writing - ) values ( - p_user_id, - p_name, - p_understanding_listening, - p_understanding_reading, - p_speaking_interaction, - p_speaking_production, - p_writing - ) returning id into l_id; - - return l_id; -end; -$$ language plpgsql; diff --git a/sql/functions/resume.insert_resume.sql b/sql/functions/resume.insert_resume.sql deleted file mode 100644 index 99ac786..0000000 --- a/sql/functions/resume.insert_resume.sql +++ /dev/null @@ -1,25 +0,0 @@ -drop function resume.insert_resume ( - p_user_id int, - p_name character varying -); - -create or replace function resume.insert_resume ( - p_user_id int, - p_name character varying -) -returns bigint -as $$ -declare - l_id bigint; -begin - insert into resume.resume ( - user_id, - name - ) values ( - p_user_id, - p_name - ) returning id into l_id; - - return l_id; -end; -$$ language plpgsql; diff --git a/sql/tables/resume.skill.sql b/sql/tables/resume.skill.sql index 5085cf1..d7ad218 100644 --- a/sql/tables/resume.skill.sql +++ b/sql/tables/resume.skill.sql @@ -2,5 +2,6 @@ drop table resume.skill cascade; create table resume.skill ( id serial8 primary key, + user_id bigint not null references auth.users(id), skill text not null ); |
