Print status backend + FE integration [SCI-5942]

This commit is contained in:
Martin Artnik 2021-08-02 11:11:11 +02:00
parent 43571b5692
commit 123e415a4f
15 changed files with 171 additions and 81 deletions

View file

@ -0,0 +1,24 @@
$(document).on('click', '.label-printing-progress-modal .close', function() {
$(this).parent().parent().remove();
});
$(document).on('turbolinks:load', function() {
var modal = $(document).find('.label-printing-progress-modal');
if (modal.length > 0) {
window.printerModalReloadInterval = setInterval(function() {
modal = $(document).find('.label-printing-progress-modal');
if (modal.length === 0) {
clearInterval(window.printerModalReloadInterval);
return;
}
$.getJSON(
`/label_printers/${modal.data('labelPrinterId')}/update_progress_modal`
+ `?starting_item_count=${modal.data('startingItemCount')}`,
function(data) { modal.replaceWith(data.html); }
);
}, 3000);
} else if (window.printerModalReloadInterval) {
clearInterval(window.printerModalReloadInterval);
}
});

View file

@ -67,7 +67,7 @@
$(this).remove(); $(this).remove();
}); });
dropdownSelector.init('#modal-print-repository-row-label #printers', { dropdownSelector.init('#modal-print-repository-row-label #label_printer_id', {
noEmptyOption: true, noEmptyOption: true,
singleSelect: true, singleSelect: true,
closeOnSelect: true, closeOnSelect: true,

View file

@ -3,7 +3,7 @@
class LabelPrintersController < ApplicationController class LabelPrintersController < ApplicationController
include InputSanitizeHelper include InputSanitizeHelper
before_action :check_manage_permissions, except: :index before_action :check_manage_permissions, except: %i(index update_progress_modal)
before_action :find_label_printer, only: %i(edit update destroy) before_action :find_label_printer, only: %i(edit update destroy)
def index def index
@ -59,8 +59,22 @@ class LabelPrintersController < ApplicationController
render json: { job_id: print_job.job_id } render json: { job_id: print_job.job_id }
end end
def update_progress_modal
render(
json: {
html:
render_to_string(
partial: 'label_printers/print_progress_modal',
locals: {
starting_item_count: params[:starting_item_count].to_i,
label_printer: LabelPrinter.find(params[:id])
}
)
}
)
end
def create_fluics def create_fluics
# Placeholder for FLUICS printer management
begin begin
printers = LabelPrinters::Fluics::ApiClient.new(label_printer_params[:fluics_api_key]).list printers = LabelPrinters::Fluics::ApiClient.new(label_printer_params[:fluics_api_key]).list

View file

@ -49,12 +49,8 @@ class RepositoriesController < ApplicationController
@display_delete_button = can_delete_repository_rows?(@repository) @display_delete_button = can_delete_repository_rows?(@repository)
@display_duplicate_button = can_create_repository_rows?(@repository) @display_duplicate_button = can_create_repository_rows?(@repository)
@snapshot_provisioning = @repository.repository_snapshots.provisioning.any? @snapshot_provisioning = @repository.repository_snapshots.provisioning.any?
@printing = {
printer_name: 'Fluics label printer', @busy_printer = LabelPrinter.where.not(current_print_job_ids: []).first
printer_status: :out_of_labels,
items: RepositoryRow.all,
printing_status: :waiting_labels
}
end end
def table_toolbar def table_toolbar

View file

@ -73,7 +73,7 @@ class RepositoryRowsController < ApplicationController
def print_modal def print_modal
@repository_rows = @repository.repository_rows.where(id: params[:rows]) @repository_rows = @repository.repository_rows.where(id: params[:rows])
@printers = [] @printers = LabelPrinter.all
respond_to do |format| respond_to do |format|
format.json do format.json do
render json: { render json: {
@ -85,6 +85,27 @@ class RepositoryRowsController < ApplicationController
end end
end end
def print
label_printer = LabelPrinter.find(params[:label_printer_id])
label_printer.update!(status: :ready) # reset potential error state
job_ids = RepositoryRow.where(id: params[:repository_row_ids]).flat_map do |repository_row|
Array.new(params[:copies].to_i).map do
LabelPrinters::PrintJob.perform_later(
label_printer,
LabelTemplate.first.render( # Currently we will only use the default template
item_id: repository_row.code,
item_name: repository_row.name
)
).job_id
end
end
label_printer.update!(current_print_job_ids: job_ids)
redirect_to repository_path(@repository)
end
def update def update
row_update = RepositoryRows::UpdateRepositoryRowService row_update = RepositoryRows::UpdateRepositoryRowService
.call(repository_row: @repository_row, user: current_user, params: update_params) .call(repository_row: @repository_row, user: current_user, params: update_params)

View file

@ -14,8 +14,26 @@ module LabelPrinters
api_client.print(label_printer.fluics_lid, payload) api_client.print(label_printer.fluics_lid, payload)
# wait for FLUICS printer to stop being busy # wait for FLUICS printer to stop being busy
sleep(5) while api_clinet.status(label_printer.fluics_lid).dig('printerState', 'printerStatus') != '00' loop do
status =
LabelPrinters::FLUICS_STATUS_MAP(
api_client.status(label_printer.fluics_lid).dig('printerState', 'printerStatus')
)
label_printer.update!(status: status)
break if status == :ready
sleep 5
end end
end end
label_printer.with_lock do
label_printer.current_print_job_ids.delete(job_id)
label_printer.save!
end
end
rescue StandardError => e
label_printer.update(status: :error)
raise e
end end
end end

View file

@ -1,14 +1,25 @@
# frozen_string_literal: true # frozen_string_literal: true
class LabelPrinter < ApplicationRecord class LabelPrinter < ApplicationRecord
FLUICS_STATUS_MAP = Hash.new(:error).merge(
{
'00' => :ready,
'50' => :busy,
'60' => :busy,
'01' => :out_of_labels,
'02' => :out_of_labels
}
).freeze
enum type_of: { fluics: 0 } enum type_of: { fluics: 0 }
enum language_type: { zpl: 0 } enum language_type: { zpl: 0 }
enum status: { ready: 0, busy: 1, out_of_labels: 2, unreachable: 3, error: 4 }
validates :name, presence: true validates :name, presence: true
validates :type_of, presence: true validates :type_of, presence: true
validates :language_type, presence: true validates :language_type, presence: true
def ready? def display_name
true # TODO "#{name}#{description}"
end end
end end

View file

@ -0,0 +1,25 @@
<div class="label-printing-progress-modal" data-label-printer-id="<%= label_printer.id %>" data-starting-item-count="<%= starting_item_count %>">
<div class="modal-header">
<div class="title">
<%= label_printer.name %>
</div>
<div class="printer-status" data-status="<%= label_printer.status %>">
<% if label_printer.ready? %>
<%= t('label_printers.modal_printing_status.printer_status.ready') %>
<% elsif label_printer.out_of_labels? %>
<%= t('label_printers.modal_printing_status.printer_status.out_of_labels') %>
<% else %>
<%= t('label_printers.modal_printing_status.printer_status.not_ready') %>
<% end %>
</div>
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span></button>
</div>
<div class="modal-body">
<div class="printing-items">
<%= t('label_printers.modal_printing_status.multiple_items', starting_item_count: starting_item_count, item_count: starting_item_count - label_printer.current_print_job_ids.length) %>
</div>
<div class="printing-status" data-status="<%= label_printer.status %>">
<%= t("label_printers.modal_printing_status.printing_status.#{label_printer.current_print_job_ids.length == 0 ? 'done' : 'printing'}") %>
</div>
</div>
</div>

View file

@ -1,8 +1,8 @@
<div class="modal fade" id="modal-print-repository-row-label" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> <div class="modal fade" id="modal-print-repository-row-label" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document"> <div class="modal-dialog" role="document">
<div class="modal-content"> <div class="modal-content">
<% if @printers.size > 0 %> <% if @printers.size > 0 %>
<%= form_tag print_repository_repository_rows_path do %>
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title"> <h4 class="modal-title">
@ -17,9 +17,12 @@
</h4> </h4>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<% @repository_rows.each do |repository_row| %>
<%= hidden_field_tag 'repository_row_ids[]', repository_row.id %>
<% end %>
<div class=printers-container> <div class=printers-container>
<label><%= t('repository_row.modal_print_label.printer') %></label> <label><%= t('repository_row.modal_print_label.printer') %></label>
<%= select_tag "printers", options_for_select(@printers) %> <%= select_tag :label_printer_id, options_for_select(@printers.map { |p| [p.display_name, p.id] }) %>
</div> </div>
<p class="sci-input-container"> <p class="sci-input-container">
<label><%= t('repository_row.modal_print_label.number_of_copies') %></label> <label><%= t('repository_row.modal_print_label.number_of_copies') %></label>
@ -27,8 +30,9 @@
</p> </p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal"><%= t('repository_row.modal_print_label.print_label') %></button> <%= submit_tag t('repository_row.modal_print_label.print_label'), class: 'btn btn-primary' %>
</div> </div>
<% end %>
<% else %> <% else %>
<div class="modal-body no-printers-container"> <div class="modal-body no-printers-container">
<%= image_tag 'printers/no_available_printers' %> <%= image_tag 'printers/no_available_printers' %>

View file

@ -1,38 +0,0 @@
<div class="label-printing-progress-modal">
<div class="modal-header">
<div class="title">
<%= @printing[:printer_name] %>
</div>
<div class="printer-status" data-status="<%= @printing[:printer_status] %>">
<% if @printing[:printer_status] == :ready %>
<%= t('repository_row.modal_printing_status.printer_status.ready') %>
<% elsif @printing[:printer_status] == :out_of_labels %>
<%= t('repository_row.modal_printing_status.printer_status.not_ready') %>
<% else %>
<%= t('repository_row.modal_printing_status.printer_status.out_of_label') %>
<% end %>
</div>
<button type="button" class="close"><span aria-hidden="true">&times;</span></button>
</div>
<div class="modal-body">
<div class="printing-items">
<% if @printing[:items].size == 1 %>
<%= @printing[:items].first.name %>
<span class="id-label">
<%= t('repository_row.modal_printing_status.id_label', repository_row_id: @printing[:items].first.id) %>
</span>
<% else %>
<%= t('repository_row.modal_printing_status.multiple_items', repository_rows_count: @printing[:items].length) %>
<% end %>
</div>
<div class="printing-status" data-status="<%= @printing[:printing_status] %>">
<% if @printing[:printing_status] == :done %>
<%= t('repository_row.modal_printing_status.printing_status.done') %>
<% elsif @printing[:printing_status] == :waiting_labels %>
<%= t('repository_row.modal_printing_status.printing_status.waiting_labels') %>
<% else %>
<%= t('repository_row.modal_printing_status.printing_status.printing') %>
<% end %>
</div>
</div>
</div>

View file

@ -159,7 +159,11 @@
<%= render partial: 'repositories/import_repository_records_modal', <%= render partial: 'repositories/import_repository_records_modal',
locals: { repository: @repository } %> locals: { repository: @repository } %>
<%= render partial: 'repositories/print_progress_modal' %> <% if @busy_printer %>
<%= render(
partial: 'label_printers/print_progress_modal',
locals: { starting_item_count: @busy_printer.current_print_job_ids.length, label_printer: @busy_printer }) %>
<% end %>
<%= render partial: "repositories/delete_record_modal" %> <%= render partial: "repositories/delete_record_modal" %>
<%= render partial: 'repositories/export_repository_modal', <%= render partial: 'repositories/export_repository_modal',

View file

@ -1630,17 +1630,17 @@ en:
title: "There seems to be no printer available" title: "There seems to be no printer available"
description: "To learn more about printing labels and label printers please visit our blog." description: "To learn more about printing labels and label printers please visit our blog."
visit_blog: "Visit blog" visit_blog: "Visit blog"
label_printers:
modal_printing_status: modal_printing_status:
printer_status: printer_status:
ready: "Ready" ready: "Ready"
not_ready: "Not Ready" not_ready: "Not Ready"
out_of_labels: "Out of labels" out_of_labels: "Out of labels"
id_label: "ID: %{repository_row_id}" multiple_items: "%{item_count}/%{starting_item_count} labels"
multiple_items: "%{repository_rows_count} labels"
printing_status: printing_status:
done: "Done" done: "Done"
printing: "Printing" printing: "Printing"
waiting_labels: "Waiting for labels. Please, insert labels." out_of_labels: "Waiting for labels. Please, insert labels."
activities: activities:
index: index:
global_activities_title: "Global activities" global_activities_title: "Global activities"

View file

@ -46,7 +46,11 @@ Rails.application.routes.draw do
resources :label_printers, except: :show, path: 'users/settings/account/addons/label_printers' do resources :label_printers, except: :show, path: 'users/settings/account/addons/label_printers' do
post :create_fluics, on: :collection post :create_fluics, on: :collection
end
resources :label_printers, only: [] do
post :print, on: :member post :print, on: :member
get :update_progress_modal, on: :member
end end
get 'users/settings/account/connected_accounts', get 'users/settings/account/connected_accounts',
@ -567,6 +571,7 @@ Rails.application.routes.draw do
resources :repository_rows, only: %i(create show update) do resources :repository_rows, only: %i(create show update) do
collection do collection do
get :print_modal get :print_modal
post :print
end end
member do member do
get :assigned_task_list get :assigned_task_list

View file

@ -4,12 +4,15 @@ class CreateLabelPrinters < ActiveRecord::Migration[6.1]
def change def change
create_table :label_printers do |t| create_table :label_printers do |t|
t.string :name, null: false t.string :name, null: false
t.string :description
t.integer :type_of, null: false t.integer :type_of, null: false
t.integer :language_type, null: false t.integer :language_type, null: false
t.string :host t.string :host
t.integer :port t.integer :port
t.string :fluics_api_key t.string :fluics_api_key
t.string :fluics_lid t.string :fluics_lid
t.string :current_print_job_ids, array: true, default: []
t.integer :status, default: 0
t.timestamps t.timestamps
end end

View file

@ -562,12 +562,15 @@ ALTER SEQUENCE public.experiments_id_seq OWNED BY public.experiments.id;
CREATE TABLE public.label_printers ( CREATE TABLE public.label_printers (
id bigint NOT NULL, id bigint NOT NULL,
name character varying NOT NULL, name character varying NOT NULL,
description character varying,
type_of integer NOT NULL, type_of integer NOT NULL,
language_type integer NOT NULL, language_type integer NOT NULL,
host character varying, host character varying,
port integer, port integer,
fluics_api_key character varying, fluics_api_key character varying,
fluics_lid character varying, fluics_lid character varying,
current_print_job_ids character varying[] DEFAULT '{}'::character varying[],
status integer DEFAULT 0,
created_at timestamp(6) without time zone NOT NULL, created_at timestamp(6) without time zone NOT NULL,
updated_at timestamp(6) without time zone NOT NULL updated_at timestamp(6) without time zone NOT NULL
); );