From 451fa2a5331c12295f9e78858f934bc583c85d47 Mon Sep 17 00:00:00 2001 From: Daniel Illi Date: Tue, 22 Aug 2023 16:57:51 +0200 Subject: [PATCH] Implement vcard qrcode, fixes #176 --- app/assets/images/qr-code-scan-icon.svg | 1 + app/assets/stylesheets/_employees.scss | 1 + .../employee_master_data_controller.rb | 12 +++++-- app/presenters/employees/vcard.rb | 32 +++++++++++++++++++ app/presenters/employees/vcard.vcf.haml | 19 +++++++++++ .../employee_master_data/_attrs.html.haml | 3 +- app/views/employee_master_data/show.vcf.haml | 20 ------------ 7 files changed, 64 insertions(+), 24 deletions(-) create mode 100644 app/assets/images/qr-code-scan-icon.svg create mode 100644 app/presenters/employees/vcard.rb create mode 100644 app/presenters/employees/vcard.vcf.haml delete mode 100644 app/views/employee_master_data/show.vcf.haml diff --git a/app/assets/images/qr-code-scan-icon.svg b/app/assets/images/qr-code-scan-icon.svg new file mode 100644 index 000000000..9f0068e83 --- /dev/null +++ b/app/assets/images/qr-code-scan-icon.svg @@ -0,0 +1 @@ +qr-code-scan \ No newline at end of file diff --git a/app/assets/stylesheets/_employees.scss b/app/assets/stylesheets/_employees.scss index 3c79ac828..73b6f6a17 100644 --- a/app/assets/stylesheets/_employees.scss +++ b/app/assets/stylesheets/_employees.scss @@ -7,6 +7,7 @@ .master-data-vcard-qrcode { display: block; width: 100px; + padding-bottom: 1em; @media (min-width: $screen-md-min) { padding-top: 20px; diff --git a/app/controllers/employee_master_data_controller.rb b/app/controllers/employee_master_data_controller.rb index 60cb282a4..3b9aca5c5 100644 --- a/app/controllers/employee_master_data_controller.rb +++ b/app/controllers/employee_master_data_controller.rb @@ -39,8 +39,9 @@ def show respond_to do |format| format.html - format.vcf - format.svg { render plain: qr_code.as_svg } + format.vcf { render plain: vcard } + format.svg { render plain: qr_code.as_svg(fill: :white) } + format.png { render plain: qr_code.as_png(fill: :white) } end end @@ -102,8 +103,13 @@ def sort_by_latest_employment(list) end end + def vcard(include: nil) + Employees::Vcard.new(@employee, include: include).render + end + def qr_code - RQRCode::QRCode.new(employee_master_datum_url(id: params[:id], format: :vcf)) + vcf = vcard(include: %i[firstname lastname fullname phone_office phone_private email]) + RQRCode::QRCode.new(vcf) end # Must be included after the #list_entries method is defined. diff --git a/app/presenters/employees/vcard.rb b/app/presenters/employees/vcard.rb new file mode 100644 index 000000000..bd2ca6524 --- /dev/null +++ b/app/presenters/employees/vcard.rb @@ -0,0 +1,32 @@ +module Employees + class Vcard + TEMPLATE_FILE = File.expand_path('vcard.vcf.haml', __dir__) + + attr_reader :employee, :include + + def initialize(employee, include: nil) + @employee = employee + @include = include + end + + def render + Haml::Template.new(TEMPLATE_FILE).render(nil, :employee => self) + end + + def method_missing(method_name, *args) + return employee.send(method_name, *args) if include.blank? || include.include?(method_name) + nil + end + + def respond_to_missing?(method_name, include_private = false) + return employee.respond_to?(method_name, include_private) + super + end + + private + + def template + @template ||= File.read(TEMPLATE_FILE) + end + end +end diff --git a/app/presenters/employees/vcard.vcf.haml b/app/presenters/employees/vcard.vcf.haml new file mode 100644 index 000000000..6085346cd --- /dev/null +++ b/app/presenters/employees/vcard.vcf.haml @@ -0,0 +1,19 @@ +-# Copyright (c) 2006-2023, Puzzle ITC GmbH. This file is part of +-# PuzzleTime and licensed under the Affero General Public License version 3 +-# or later. See the COPYING file at the top-level directory or at +-# https://github.com/puzzle/puzzletime. + +BEGIN:VCARD +VERSION:3.0 +N:#{employee.lastname};#{employee.firstname};;; +FN:#{employee.firstname} #{employee.lastname} +- if employee.street.present? || employee.city.present? || employee.postal_code.present? + ADR;TYPE=HOME,PREF:;;#{employee.street};#{employee.city};;#{employee.postal_code}; +- if employee.phone_office.present? + TEL;TYPE=WORK,VOICE:#{employee.phone_office} +- if employee.phone_private.present? + TEL;TYPE=CELL,PREF,VOICE:#{employee.phone_private} +EMAIL;TYPE=WORK,PREF:#{employee.email} +- if employee.birthday.present? + BDAY:#{employee.birthday.strftime('%Y%m%d')} +END:VCARD diff --git a/app/views/employee_master_data/_attrs.html.haml b/app/views/employee_master_data/_attrs.html.haml index 2b4ba9b2e..e11a9a71a 100644 --- a/app/views/employee_master_data/_attrs.html.haml +++ b/app/views/employee_master_data/_attrs.html.haml @@ -32,8 +32,9 @@ %i.glyphicon.glyphicon-envelope = link_to @employee.email, "mailto:#{@employee.email}" .col-md-6 + = link_to({format: :png}, target: :_blank) do + = image_tag('qr-code-scan-icon.svg', class: 'qr-code master-data-vcard-qrcode') = link_to format: :vcf do - %img.master-data-vcard-qrcode{ class: 'qr-code', src: employee_master_datum_url(id: @employee.id, format: :svg) } vCard herunterladen .row diff --git a/app/views/employee_master_data/show.vcf.haml b/app/views/employee_master_data/show.vcf.haml deleted file mode 100644 index ccb3182d2..000000000 --- a/app/views/employee_master_data/show.vcf.haml +++ /dev/null @@ -1,20 +0,0 @@ --# Copyright (c) 2006-2017, Puzzle ITC GmbH. This file is part of --# PuzzleTime and licensed under the Affero General Public License version 3 --# or later. See the COPYING file at the top-level directory or at --# https://github.com/puzzle/puzzletime. - - -BEGIN:VCARD -VERSION:3.0 -N:#{@employee.lastname};#{@employee.firstname};;; -FN:#{@employee.to_s} -- if @employee.street.present? || @employee.city.present? || @employee.postal_code.present? - ADR;TYPE=HOME,PREF:;;#{@employee.street};#{@employee.city};;#{@employee.postal_code}; -- if @employee.phone_office.present? - TEL;TYPE=WORK,VOICE:#{@employee.phone_office} -- if @employee.phone_private.present? - TEL;TYPE=CELL,PREF,VOICE:#{@employee.phone_private} -EMAIL;TYPE=WORK,PREF:#{@employee.email} -- if @employee.birthday.present? - BDAY:#{@employee.birthday.strftime('%Y%m%d')} -END:VCARD