diff --git a/app/admin/cover_letters_admin.rb b/app/admin/cover_letters_admin.rb index 7888b31..8fd0119 100644 --- a/app/admin/cover_letters_admin.rb +++ b/app/admin/cover_letters_admin.rb @@ -1,8 +1,4 @@ Trestle.resource(:cover_letters) do - menu do - item :cover_letters, icon: "fa fa-envelope", priority: 2 - end - form do |item| concat Trestle::Form::Automatic.new(admin).render(self, item) # text_area :objective diff --git a/app/admin/education_entries_admin.rb b/app/admin/education_entries_admin.rb index b33bdda..47f294e 100644 --- a/app/admin/education_entries_admin.rb +++ b/app/admin/education_entries_admin.rb @@ -1,8 +1,4 @@ Trestle.resource(:education_entries) do - menu do - item :education_entries, icon: "fa fa-graduation-cap", priority: 4 - end - form do |item| concat Trestle::Form::Automatic.new(admin).render(self, item) end diff --git a/app/admin/skills_admin.rb b/app/admin/skills_admin.rb index 213a79f..6cd429f 100644 --- a/app/admin/skills_admin.rb +++ b/app/admin/skills_admin.rb @@ -1,8 +1,4 @@ Trestle.resource(:skills) do - menu do - item :skills, icon: "fa fa-toolbox", priority: 5 - end - form do |item| concat Trestle::Form::Automatic.new(admin).render(self, item) end diff --git a/app/admin/users_admin.rb b/app/admin/users_admin.rb index 8441608..3b21ee0 100644 --- a/app/admin/users_admin.rb +++ b/app/admin/users_admin.rb @@ -1,24 +1,120 @@ Trestle.resource(:users) do menu do - item :users, icon: "fa fa-user", priority: 1 + item :resumes, icon: "fa fa-file-alt", priority: 1 end form do |item| - concat Trestle::Form::Automatic.new(admin).render(self, item) - - text_area :objective + tab :details, label: "Details" do + concat Trestle::Form::Automatic.new(admin).render(self, item) + text_area :objective + end + + tab :export, label: "Export Resume" do + safe_join([ + link_to("Export as PDF", generate_users_admin_path(item), class: "btn btn-primary has-icon", target: "_blank"), + link_to("Export as TeX", generate_cls_users_admin_path(item), class: "btn btn-secondary has-icon", target: "_blank"), + link_to("Export as JSON", generate_json_users_admin_path(item), class: "btn btn-secondary has-icon", target: "_blank") + ], " ") + end + + tab :work_experiences, badge: (item.persisted? ? item.work_experiences.size : 0) do + concat content_tag(:p, "User: #{item.to_s}") + if item.persisted? + concat link_to("Add Work Experience", WorkExperiencesAdmin.path(:new, user_id: item.id)) + + table item.work_experiences do + column :employer + column :title + column :period + column :reference_date, align: :center + column :actions, align: :right do |experience| + # TODO: The redirect after succesful delete goes back to the index page.. it should go back to the user page + safe_join([ + link_to("Edit", WorkExperiencesAdmin.path(:edit, id: experience.id), class: "btn btn-secondary has-icon"), + link_to("Delete", work_experiences_admin_path(experience), class: "btn btn-danger has-icon", method: :delete, data: { confirm: "Are you sure?" }) + ], " | ") + end + end + else + concat content_tag(:p, "Save the user before adding work experiences.") + end + end + + tab :education_entries, badge: (item.persisted? ? item.education_entries.size : 0) do + concat content_tag(:p, "User: #{item.to_s}") + if item.persisted? + concat link_to("Add Education Entry", EducationEntriesAdmin.path(:new, user_id: item.id)) + + table item.education_entries do + column :institution + column :title + column :period + column :location + column :actions, align: :right do |entry| + safe_join([ + link_to("Edit", EducationEntriesAdmin.path(:edit, id: entry.id), class: "btn btn-secondary has-icon"), + link_to("Delete", EducationEntriesAdmin.path(:destroy, id: entry.id), class: "btn btn-danger has-icon", method: :delete, data: { confirm: "Are you sure?" }) + ], " | ") + end + end + else + concat content_tag(:p, "Save the user before adding education entries.") + end + end + + tab :skills, badge: (item.persisted? ? item.skills.size : 0) do + concat content_tag(:p, "User: #{item.to_s}") + if item.persisted? + concat link_to("Add Skill", SkillsAdmin.path(:new, user_id: item.id)) + + table item.skills do + column :title + column :detail + column :order, align: :center + column :actions, align: :right do |skill| + safe_join([ + link_to("Edit", SkillsAdmin.path(:edit, id: skill.id), class: "btn btn-secondary has-icon"), + link_to("Delete", SkillsAdmin.path(:destroy, id: skill.id), class: "btn btn-danger has-icon", method: :delete, data: { confirm: "Are you sure?" }) + ], " | ") + end + end + else + concat content_tag(:p, "Save the user before adding skills.") + end + end + + tab :cover_letters, badge: (item.persisted? ? item.cover_letters.size : 0) do + concat content_tag(:p, "User: #{item.to_s}") + if item.persisted? + concat link_to("Add Cover Letter", CoverLettersAdmin.path(:new, user_id: item.id)) + + table item.cover_letters do + column :title + column :company_name + column :job_application + column :order, align: :center + column :actions, align: :right do |cover_letter| + safe_join([ + link_to("Edit", CoverLettersAdmin.path(:edit, id: cover_letter.id), class: "btn btn-secondary has-icon"), + link_to("Delete", CoverLettersAdmin.path(:destroy, id: cover_letter.id), class: "btn btn-danger has-icon", method: :delete, data: { confirm: "Are you sure?" }) + ], " | ") + end + end + else + concat content_tag(:p, "Save the user before adding cover letters.") + end + end end # Customize the table columns shown on the index view. table do column :name + column :label column :created_at, align: :center actions do |toolbar, instance, admin| toolbar.edit if admin && admin.actions.include?(:edit) toolbar.delete if admin && admin.actions.include?(:destroy) - toolbar.link 'CV', instance, action: :generate, method: :get, style: :primary, icon: "fa fa-file-pdf", target: "_blank" - toolbar.link 'CLS', instance, action: :generate_cls, method: :get, style: :secondary, icon: "fa", target: "_blank" - toolbar.link 'JSON', instance, action: :generate_json, method: :get, style: :secondary, icon: "fa", target: "_blank" + toolbar.link 'Clone', instance, action: :clone, method: :post, style: :secondary, icon: "fa fa-copy" end end @@ -44,11 +140,8 @@ Trestle.resource(:users) do end def generate_json - generate_json_resume - end - - def generate_json_resume @user = admin.find_instance(params) + response.headers["Content-Disposition"] = "attachment; filename=resume.json" render template: "users/show", formats: [:json], layout: false end @@ -57,11 +150,19 @@ Trestle.resource(:users) do ac = ActionController::Base.new() ac.render_to_string(layout: false, template: "templates/awesome/#{template}", locals: { "@user": user } ) end + + def clone + user = admin.find_instance(params) + cloned_user = user.clone!(label: "cloned") + flash[:message] = "User cloned as ##{cloned_user.id}." + redirect_to users_admin_path(cloned_user) + end end routes do get :generate, on: :member get :generate_cls, on: :member get :generate_json, on: :member + post :clone, on: :member end end diff --git a/app/admin/work_experiences_admin.rb b/app/admin/work_experiences_admin.rb index 0a21592..69bd30f 100644 --- a/app/admin/work_experiences_admin.rb +++ b/app/admin/work_experiences_admin.rb @@ -1,5 +1,2 @@ Trestle.resource(:work_experiences) do - menu do - item :work_experiences, icon: "fa fa-user-nurse", priority: 3 - end end diff --git a/app/models/user.rb b/app/models/user.rb index ec7f2c2..b3723fd 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -2,4 +2,25 @@ class User < ApplicationRecord has_many :work_experiences has_many :skills has_many :education_entries + has_many :cover_letters + + def clone!(label:) + self.class.transaction do + cloned_user = dup + cloned_user.label = label + cloned_user.save! + + self.class.reflect_on_all_associations(:has_many).each do |association| + next if association.options[:through] + + public_send(association.name).find_each do |record| + cloned_record = record.dup + cloned_record[association.foreign_key] = cloned_user.id + cloned_record.save! + end + end + + cloned_user + end + end end diff --git a/db/migrate/20260224131848_add_label_to_users.rb b/db/migrate/20260224131848_add_label_to_users.rb new file mode 100644 index 0000000..0700785 --- /dev/null +++ b/db/migrate/20260224131848_add_label_to_users.rb @@ -0,0 +1,5 @@ +class AddLabelToUsers < ActiveRecord::Migration[7.0] + def change + add_column :users, :label, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index e344d4b..39b4227 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2024_11_04_003755) do +ActiveRecord::Schema[7.0].define(version: 2026_02_24_131848) do create_table "cover_letters", force: :cascade do |t| t.string "title" t.string "company_name" @@ -62,6 +62,7 @@ ActiveRecord::Schema[7.0].define(version: 2024_11_04_003755) do t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "title" + t.string "label" end create_table "work_experiences", force: :cascade do |t|