summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorckonstanski <kostcarl@isu.edu>2026-07-22 22:41:16 -0600
committerckonstanski <kostcarl@isu.edu>2026-07-22 22:41:16 -0600
commit7a902d7dec9e0ea2a35610bebac2e217340deb40 (patch)
tree986111ad86ec227edc7f4b12e542a2ff0c2bcee5
parent51aa4409c58625687445f3d176e3f6bfa5281153 (diff)
stuff
-rw-r--r--lisp/service/menu-service.lisp1
-rw-r--r--lisp/service/resume-service.lisp345
-rw-r--r--lisp/sql/resume-pkg.lisp72
-rw-r--r--lisp/sql/skill.lisp3
-rw-r--r--lisp/webapps/resume/clojurescript/resume/src/core.cljs419
-rw-r--r--lisp/webapps/resume/site.lisp112
-rw-r--r--sql/functions/resume.insert_contactinfo.sql45
-rw-r--r--sql/functions/resume.insert_education.sql49
-rw-r--r--sql/functions/resume.insert_language.sql45
-rw-r--r--sql/functions/resume.insert_resume.sql25
-rw-r--r--sql/tables/resume.skill.sql1
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"}
+ "&times;"]]
+ [: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
);