From 9cadc3e94f8bac9fab8e521d41e2970faf3637ed Mon Sep 17 00:00:00 2001 From: Benjamin ter Kuile Date: Mon, 17 Aug 2015 19:13:35 +0200 Subject: [PATCH] Add my-schedule and some other things --- app/abilities/employees/ability.rb | 1 + .../app/components/qr-codes-link.js.coffee | 4 +- .../app/components/section/area.js.coffee | 9 ++-- .../app/components/section/table.js.coffee | 3 ++ .../app/controllers/my-schedule.js.coffee | 3 ++ .../controllers/schedule_controller.js.coffee | 2 +- .../app/models/employee-shift.js.coffee | 13 ++++++ .../supplier/app/models/supplier.js.coffee | 1 + .../javascripts/supplier/app/router.js.coffee | 3 +- .../supplier/app/routes/my-schedule.js.coffee | 5 +++ .../app/routes/schedule_route.js.coffee | 2 +- .../app/templates/global/_top_menu.emblem | 1 + .../app/templates/modals/table_edit.emblem | 1 + .../supplier/app/templates/my-schedule.emblem | 3 ++ .../supplier/app/views/my-schedule.js.coffee | 43 +++++++++++++++++++ .../supplier/app/views/schedule.js.coffee | 2 +- .../supplier/foundation1/_ember_dropdown.sass | 4 ++ .../supplier/foundation1/_mixins.sass | 2 + .../foundation1/components/_modal.sass | 4 ++ .../components/_section_tables.sass | 4 ++ .../employees/employee_shifts_controller.rb | 8 ++++ .../suppliers/employee_shifts_controller.rb | 2 +- .../suppliers/tables_controller.rb | 1 + app/models/employee_shift.rb | 14 +++++- .../employees/employee_shift_serializer.rb | 5 +++ .../suppliers/employee_shift_serializer.rb | 3 +- config/locales/supplier.en.yml | 3 ++ config/locales/supplier.nl.yml | 3 ++ config/routes.rb | 1 + wip.md | 12 ++---- 30 files changed, 139 insertions(+), 23 deletions(-) create mode 100644 app/assets/javascripts/supplier/app/controllers/my-schedule.js.coffee create mode 100644 app/assets/javascripts/supplier/app/routes/my-schedule.js.coffee create mode 100644 app/assets/javascripts/supplier/app/templates/my-schedule.emblem create mode 100644 app/assets/javascripts/supplier/app/views/my-schedule.js.coffee create mode 100644 app/controllers/employees/employee_shifts_controller.rb create mode 100644 app/serializers/employees/employee_shift_serializer.rb diff --git a/app/abilities/employees/ability.rb b/app/abilities/employees/ability.rb index d7b7a1e2..9fa89d23 100644 --- a/app/abilities/employees/ability.rb +++ b/app/abilities/employees/ability.rb @@ -2,5 +2,6 @@ class Employees::Ability include CanCan::Ability def initialize(employee) can :read, Supplier + can :read, EmployeeShift end end diff --git a/app/assets/javascripts/supplier/app/components/qr-codes-link.js.coffee b/app/assets/javascripts/supplier/app/components/qr-codes-link.js.coffee index a2605ff9..7a6a7ab0 100644 --- a/app/assets/javascripts/supplier/app/components/qr-codes-link.js.coffee +++ b/app/assets/javascripts/supplier/app/components/qr-codes-link.js.coffee @@ -3,6 +3,6 @@ App.QrCodesLinkComponent = Ember.Component.extend target: '_blank' classNames: ["table-qr-codes"] attributeBindings: ['href', 'target'] - href: Ember.computed 'section.id', -> - Routes.qr_codes_suppliers_tables_path(section_id: @get('section.id')) + href: Ember.computed 'section.id', 'table.id', -> + Routes.qr_codes_suppliers_tables_path(section_id: @get('section.id'), table_id: @get('table.id')) diff --git a/app/assets/javascripts/supplier/app/components/section/area.js.coffee b/app/assets/javascripts/supplier/app/components/section/area.js.coffee index 3163aea6..344c674a 100644 --- a/app/assets/javascripts/supplier/app/components/section/area.js.coffee +++ b/app/assets/javascripts/supplier/app/components/section/area.js.coffee @@ -5,11 +5,11 @@ App.SectionAreaComponent = Ember.Component.extend DragNDrop.Draggable, classNameBindings: ['vertical', 'right_half:right-half', 'section_area.rounded:rounded'] pixelWidth: Ember.computed 'section_area.width', 'dpm', -> @get('dpm') * @get('section_area.width') pixelHeight: Ember.computed 'section_area.height', 'dpm', -> @get('dpm') * @get('section_area.height') - offsetX: Ember.computed.product 'dpm', 'content.position_x' - offsetY: Ember.computed.product 'dpm', 'content.position_y' + offsetX: Ember.computed.product 'dpm', 'section_area.position_x' + offsetY: Ember.computed.product 'dpm', 'section_area.position_y' vertical: Ember.computed 'section_area.width', 'section_area.height', 'section.editmode', -> not @get('section.editmode') and @get('section_area.height') > @get('section_area.width') - right_half: Ember.computed 'section_area.position_x', 'section_area.width', 'section_area.sectino.width', -> + right_half: Ember.computed 'section_area.position_x', 'section_area.width', 'section_area.section.width', -> @get('section_area.position_x') + (@get('section_area.width') / 2) > (@get('section_area.section.width') / 2) style: Ember.computed 'offsetX', 'offsetY', 'pixelWidth', 'pixelHeight', -> App.CssObject.create( @@ -19,12 +19,11 @@ App.SectionAreaComponent = Ember.Component.extend DragNDrop.Draggable, top: @get('offsetY') "line-height": @get('pixelHeight') ).toString() - content: Ember.computed.alias 'section_area' draggable: (-> if @get('section.editmode') then true else false ).property('section.editmode') positionChange: (position)-> dpm = @get('dpm') return if !dpm or parseFloat(dpm) is 0 - @get('content').setProperties + @get('section_area').setProperties position_x: position.left / dpm position_y: position.top / dpm click: -> diff --git a/app/assets/javascripts/supplier/app/components/section/table.js.coffee b/app/assets/javascripts/supplier/app/components/section/table.js.coffee index d047e53a..e32fc5b2 100644 --- a/app/assets/javascripts/supplier/app/components/section/table.js.coffee +++ b/app/assets/javascripts/supplier/app/components/section/table.js.coffee @@ -14,11 +14,14 @@ App.SectionTableComponent = Ember.Component.extend DragNDrop.Draggable, 'table.active_list.needs_help:needs_help', 'table.active_list.needs_payment:needs_payment', 'table.active_list.has_active_orders:active_order', + 'right_half:right-half', 'uniqueClass' ] uniqueClass: (-> "section-table-#{@get('table.id')}" ).property('table.id') + right_half: Ember.computed 'table.position_x', 'table.width', 'table.section.width', -> + @get('table.position_x') + (@get('table.width') / 2) > (@get('table.section.width') / 2) offsetX: (-> (@get('dpm') || 0) * (@get('table.position_x') || 0) ).property('dpm', 'table.position_x') diff --git a/app/assets/javascripts/supplier/app/controllers/my-schedule.js.coffee b/app/assets/javascripts/supplier/app/controllers/my-schedule.js.coffee new file mode 100644 index 00000000..211ade4e --- /dev/null +++ b/app/assets/javascripts/supplier/app/controllers/my-schedule.js.coffee @@ -0,0 +1,3 @@ +App.MyScheduleController = Ember.Controller.extend + actions: + debugger: -> debugger diff --git a/app/assets/javascripts/supplier/app/controllers/schedule_controller.js.coffee b/app/assets/javascripts/supplier/app/controllers/schedule_controller.js.coffee index 91f5420f..b0746e75 100644 --- a/app/assets/javascripts/supplier/app/controllers/schedule_controller.js.coffee +++ b/app/assets/javascripts/supplier/app/controllers/schedule_controller.js.coffee @@ -5,7 +5,7 @@ App.ScheduleController = Ember.Controller.extend employee_shift.set 'end_on', event.end employee_shift.save() editEvent: (id, callbacks)-> - if employee_shift = @store.all('employee-shift').findBy('id', id) + if employee_shift = @store.peekRecord('employee-shift', id) @modal 'employee_shift', title_path: 'employee_shift.modal.title' destroy_text_path: 'employee_shift.modal.destroy_confirmation' diff --git a/app/assets/javascripts/supplier/app/models/employee-shift.js.coffee b/app/assets/javascripts/supplier/app/models/employee-shift.js.coffee index 97ae7b1a..dde94f39 100644 --- a/app/assets/javascripts/supplier/app/models/employee-shift.js.coffee +++ b/app/assets/javascripts/supplier/app/models/employee-shift.js.coffee @@ -11,9 +11,22 @@ App.EmployeeShift = DS.Model.extend end: @get('end_on') color: @get('employee.color') ).property('start_from', 'end_on', 'title') + supplier: DS.belongsTo('supplier') title: Ember.computed 'employee.name', 'description', -> if @get('description') [@get('employee.name'), @get('description')].join(' - ') else @get 'employee.name' + calendar_event_for_employee: (-> + id: @id + title: @get('title_for_employee') + start: @get('start_from') + end: @get('end_on') + color: @get('employee.color') + ).property('start_from', 'end_on', 'title_for_employee') + title_for_employee: Ember.computed 'supplier.name', 'description', -> + if @get('description') + [@get('supplier.name'), @get('description')].join(' - ') + else + @get 'supplier.name' diff --git a/app/assets/javascripts/supplier/app/models/supplier.js.coffee b/app/assets/javascripts/supplier/app/models/supplier.js.coffee index 267c71b4..bfb4aa3c 100644 --- a/app/assets/javascripts/supplier/app/models/supplier.js.coffee +++ b/app/assets/javascripts/supplier/app/models/supplier.js.coffee @@ -18,6 +18,7 @@ App.Supplier = DS.Model.extend product_categories: DS.hasMany 'product_category' orders_in_process_count: attr('number') orders_placed_count: attr('number') + employee_shifts: DS.hasMany('employee-shift') close: -> $.post Routes.mark_as_closed_suppliers_supplier_path(@id), => diff --git a/app/assets/javascripts/supplier/app/router.js.coffee b/app/assets/javascripts/supplier/app/router.js.coffee index 13ac490a..41c64ae1 100644 --- a/app/assets/javascripts/supplier/app/router.js.coffee +++ b/app/assets/javascripts/supplier/app/router.js.coffee @@ -19,7 +19,8 @@ App.Router.map -> @route 'orders_display' # chromecast etc @route 'menu' @route 'settings' - @route 'my_account' @route 'schedule' + @route 'my_account' + @route 'my-schedule' @route 'empty' #@resource 'lists', queryParams: ['state'] diff --git a/app/assets/javascripts/supplier/app/routes/my-schedule.js.coffee b/app/assets/javascripts/supplier/app/routes/my-schedule.js.coffee new file mode 100644 index 00000000..e149c4ba --- /dev/null +++ b/app/assets/javascripts/supplier/app/routes/my-schedule.js.coffee @@ -0,0 +1,5 @@ +App.MyScheduleRoute = Ember.Route.extend + model: -> + $.getJSON(Routes.employees_employee_shifts_path()).then (payload)=> + @store.pushPayload payload + @store.peekAll('employee-shift') diff --git a/app/assets/javascripts/supplier/app/routes/schedule_route.js.coffee b/app/assets/javascripts/supplier/app/routes/schedule_route.js.coffee index 784f0541..24cb582c 100644 --- a/app/assets/javascripts/supplier/app/routes/schedule_route.js.coffee +++ b/app/assets/javascripts/supplier/app/routes/schedule_route.js.coffee @@ -1,2 +1,2 @@ App.ScheduleRoute = Ember.Route.extend - model: -> @store.find 'employee-shift' + model: -> @store.findAll 'employee-shift' diff --git a/app/assets/javascripts/supplier/app/templates/global/_top_menu.emblem b/app/assets/javascripts/supplier/app/templates/global/_top_menu.emblem index 19c85d96..76193ff5 100644 --- a/app/assets/javascripts/supplier/app/templates/global/_top_menu.emblem +++ b/app/assets/javascripts/supplier/app/templates/global/_top_menu.emblem @@ -21,6 +21,7 @@ header.top-menu ul li li= link-to 'my_account': span.current-employee-my-account-icon= t 'current_employee.my_account.link' + li= link-to 'my-schedule': span.current-employee-my-schedule-icon= t 'current_employee.my_schedule.link' li: a{action "signOut"}: span.sign-out-icon= t 'supplier.sign_out' if globals.current_supplier.open /a.supplier-is-closed-indication.is-open{ action "markSupplierClosed" }: span.fa.fa-beer.fa-2x diff --git a/app/assets/javascripts/supplier/app/templates/modals/table_edit.emblem b/app/assets/javascripts/supplier/app/templates/modals/table_edit.emblem index 6af110ab..3ba1fcea 100644 --- a/app/assets/javascripts/supplier/app/templates/modals/table_edit.emblem +++ b/app/assets/javascripts/supplier/app/templates/modals/table_edit.emblem @@ -14,3 +14,4 @@ p=t 'table.modal.body_header' hr button.modal-close{action "close"}=t 'table.modal.close_button' button.modal-confirm.right{action "save"}=t 'table.modal.save_button' += qr-codes-link table=model diff --git a/app/assets/javascripts/supplier/app/templates/my-schedule.emblem b/app/assets/javascripts/supplier/app/templates/my-schedule.emblem new file mode 100644 index 00000000..4fbf1833 --- /dev/null +++ b/app/assets/javascripts/supplier/app/templates/my-schedule.emblem @@ -0,0 +1,3 @@ +.row: .small-12.columns: h2=t 'current_employee.my_schedule.title' +.row: .small-12.columns + #schedule-placeholder diff --git a/app/assets/javascripts/supplier/app/views/my-schedule.js.coffee b/app/assets/javascripts/supplier/app/views/my-schedule.js.coffee new file mode 100644 index 00000000..0cdb0b71 --- /dev/null +++ b/app/assets/javascripts/supplier/app/views/my-schedule.js.coffee @@ -0,0 +1,43 @@ +App.MyScheduleView = Ember.View.extend + classNames: ['schedule-view'] + didInsertElement: -> + placeholder = @$('#schedule-placeholder') + controller = @get('controller') + events = @get('globals.current_employee.employee_shifts').map( (employee_shift)->employee_shift.get('calendar_event_for_employee') ) + placeholder.fullCalendar + header: + left: 'prev,next,today' + center: 'title' + right: 'month,agendaWeek,agendaDay' + selectable: false + #selectHelper: true + #select: (start, end)=> + #format = 'dddd h:mm' + #controller.modal 'select_employee', + #ok: -> + ##this context is SelectEmployeeController + #if employee = @get('employee') + #shift = controller.store.createRecord 'employee-shift', start_from: start, end_on: end + #shift.set 'employee', employee + #shift.save().then -> + #placeholder.fullCalendar('renderEvent', shift.get('calendar_event'), true) + #header: t('employee_shift.time_window', start: start.format(format), end: end.format(format)) + #editable: true + defaultView: 'agendaWeek' + events: events + timezone: 'UTC' + #eventDrop: controller.event_changed.bind(controller) + #eventResize: controller.event_changed.bind(controller) + #eventClick: (event)-> + #controller.editEvent event.id, + #save: (shift)-> + #placeholder.fullCalendar('removeEvents', [event.id]) + #placeholder.fullCalendar('renderEvent', shift.get('calendar_event'), true) + #destroy: (shift)-> + #placeholder.fullCalendar('removeEvents', [event.id]) + timeFormat: 'H(:mm)' + axisFormat: 'H:mm' + lang: moment.locale() + + + diff --git a/app/assets/javascripts/supplier/app/views/schedule.js.coffee b/app/assets/javascripts/supplier/app/views/schedule.js.coffee index c4d63d3f..0baeef26 100644 --- a/app/assets/javascripts/supplier/app/views/schedule.js.coffee +++ b/app/assets/javascripts/supplier/app/views/schedule.js.coffee @@ -3,7 +3,7 @@ App.ScheduleView = Ember.View.extend didInsertElement: -> placeholder = @$('#schedule-placeholder') controller = @get('controller') - events = controller.get('model').filter((employee_shift) -> employee_shift.get('employee.active') ).map( (employee_shift)->employee_shift.get('calendar_event') ) + events = @get('globals.current_supplier.employee_shifts').filter((employee_shift) -> employee_shift.get('employee.active') ).map( (employee_shift)->employee_shift.get('calendar_event') ) placeholder.fullCalendar header: left: 'prev,next,today' diff --git a/app/assets/stylesheets/supplier/foundation1/_ember_dropdown.sass b/app/assets/stylesheets/supplier/foundation1/_ember_dropdown.sass index b27b9c07..a814325f 100644 --- a/app/assets/stylesheets/supplier/foundation1/_ember_dropdown.sass +++ b/app/assets/stylesheets/supplier/foundation1/_ember_dropdown.sass @@ -97,6 +97,10 @@ @extend .fa, .fa-user span padding-left: 7px + span.current-employee-my-schedule-icon + @extend .fa, .fa-calendar + span + padding-left: 7px &.active .dropdown-list-container display: block diff --git a/app/assets/stylesheets/supplier/foundation1/_mixins.sass b/app/assets/stylesheets/supplier/foundation1/_mixins.sass index 5d561e49..f1fe93ee 100644 --- a/app/assets/stylesheets/supplier/foundation1/_mixins.sass +++ b/app/assets/stylesheets/supplier/foundation1/_mixins.sass @@ -1,6 +1,8 @@ @mixin button-icon-only padding: 2px 5px margin: 0 + &.hide + display: none @mixin table-fit width: 1px diff --git a/app/assets/stylesheets/supplier/foundation1/components/_modal.sass b/app/assets/stylesheets/supplier/foundation1/components/_modal.sass index 2e11c2a9..ef1f0a6c 100644 --- a/app/assets/stylesheets/supplier/foundation1/components/_modal.sass +++ b/app/assets/stylesheets/supplier/foundation1/components/_modal.sass @@ -21,6 +21,10 @@ .handle @extend .fa, .fa-arrows-v margin-right: 10px + .table-qr-codes + //+button($bg: $button-qr-code-color, $padding: $button-sml) + +button($bg: $button-qr-code-color) + margin-left: 10px .modal-alert color: $alert-color diff --git a/app/assets/stylesheets/supplier/foundation1/components/_section_tables.sass b/app/assets/stylesheets/supplier/foundation1/components/_section_tables.sass index fd438f94..e62d74cd 100644 --- a/app/assets/stylesheets/supplier/foundation1/components/_section_tables.sass +++ b/app/assets/stylesheets/supplier/foundation1/components/_section_tables.sass @@ -82,6 +82,10 @@ .status-icons .active_order display: inline-block //background-color: #f77 + &.right-half + .table-actions + right: 100% + left: initial a color: black &:hover diff --git a/app/controllers/employees/employee_shifts_controller.rb b/app/controllers/employees/employee_shifts_controller.rb new file mode 100644 index 00000000..cad9825f --- /dev/null +++ b/app/controllers/employees/employee_shifts_controller.rb @@ -0,0 +1,8 @@ +module Employees + class EmployeeShiftsController < Employees::ApplicationController + def index + @employee_shifts = EmployeeShift.for_employee(current_employee).include_relation(:supplier) + render json: @employee_shifts, each_serializer: Employees::EmployeeShiftSerializer + end + end +end diff --git a/app/controllers/suppliers/employee_shifts_controller.rb b/app/controllers/suppliers/employee_shifts_controller.rb index 8aedab55..39e1058e 100644 --- a/app/controllers/suppliers/employee_shifts_controller.rb +++ b/app/controllers/suppliers/employee_shifts_controller.rb @@ -2,7 +2,7 @@ module Suppliers class EmployeeShiftsController < Suppliers::ApplicationController def index @employee_shifts = EmployeeShift.for_supplier(current_supplier, relevant_from: 1.week.ago) - @employee_shifts.include_relation(:employee) + @employee_shifts.include_relations(:employee, :supplier) # Only select shifts from currently linked and employees @employee_shifts.select! do |shift| current_supplier.employee_ids.include?(shift.employee.try(:id)) diff --git a/app/controllers/suppliers/tables_controller.rb b/app/controllers/suppliers/tables_controller.rb index 82f13a90..13a70e3a 100644 --- a/app/controllers/suppliers/tables_controller.rb +++ b/app/controllers/suppliers/tables_controller.rb @@ -88,6 +88,7 @@ module Suppliers def qr_codes @tables = Table.for_supplier(current_supplier, from_number: params[:from_number], to_number: params[:to_number]) @tables.select!{|t| t.section_id == params[:section_id]} if params[:section_id].present? + @tables.select!{|t| t.id == params[:table_id]} if params[:table_id].present? render layout: 'qr_sheet' end diff --git a/app/models/employee_shift.rb b/app/models/employee_shift.rb index c745feb3..2c1a75c8 100644 --- a/app/models/employee_shift.rb +++ b/app/models/employee_shift.rb @@ -8,13 +8,23 @@ class EmployeeShift belongs_to :supplier belongs_to :employee - view :relevants_view, type: :custom, map_function: %|function(doc){ + view :for_supplier_view, type: :custom, map_function: %|function(doc){ if(doc.ruby_class == 'EmployeeShift' && doc.start_from && doc.end_on){ emit([doc.supplier_id, doc.end_on], 1) } }|, reduce_function: '_sum' + view :for_employee_view, type: :custom, map_function: %|function(doc){ + if(doc.ruby_class == 'EmployeeShift' && doc.start_from && doc.end_on){ + emit([doc.employee_id, doc.end_on], 1) + } + }|, reduce_function: '_sum' + def self.for_supplier(supplier, relevant_from: 1.week.ago) - database.view relevants_view(startkey: [supplier.id, relevant_from], endkey: [supplier.id, {}], reduce: false, include_docs: true) + database.view for_supplier_view(startkey: [supplier.id, relevant_from.iso8601], endkey: [supplier.id, {}], reduce: false, include_docs: true) + end + + def self.for_employee(employee, relevant_from: 1.week.ago) + database.view for_employee_view(startkey: [employee.id, relevant_from.iso8601], endkey: [employee.id, {}], reduce: false, include_docs: true) end end diff --git a/app/serializers/employees/employee_shift_serializer.rb b/app/serializers/employees/employee_shift_serializer.rb new file mode 100644 index 00000000..3ad162b7 --- /dev/null +++ b/app/serializers/employees/employee_shift_serializer.rb @@ -0,0 +1,5 @@ +class Employees::EmployeeShiftSerializer < Qwaiter::Serializer + self.root = :employee_shift + attributes :start_from, :end_on, :employee_id, :description + has_one :supplier +end diff --git a/app/serializers/suppliers/employee_shift_serializer.rb b/app/serializers/suppliers/employee_shift_serializer.rb index 4ae9e432..202efab6 100644 --- a/app/serializers/suppliers/employee_shift_serializer.rb +++ b/app/serializers/suppliers/employee_shift_serializer.rb @@ -1,5 +1,6 @@ class Suppliers::EmployeeShiftSerializer < Qwaiter::Serializer self.root = :employee_shift #embed :ids, include: true - attributes :start_from, :end_on, :employee_id, :description + attributes :start_from, :end_on, :employee_id + has_one :supplier end diff --git a/config/locales/supplier.en.yml b/config/locales/supplier.en.yml index 2cc22df3..e0418909 100644 --- a/config/locales/supplier.en.yml +++ b/config/locales/supplier.en.yml @@ -241,4 +241,7 @@ en: my_account: link: My account title: My account + my_schedule: + title: My schedule + link: My schedule diff --git a/config/locales/supplier.nl.yml b/config/locales/supplier.nl.yml index d1d923be..efd02981 100644 --- a/config/locales/supplier.nl.yml +++ b/config/locales/supplier.nl.yml @@ -244,3 +244,6 @@ nl: my_account: link: Mijn account title: Mijn account + my_schedule: + title: Mijn schema + link: Mijn schema diff --git a/config/routes.rb b/config/routes.rb index 226cf2a5..958ee333 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -172,6 +172,7 @@ Qwaiter::Application.routes.draw do namespace :employees, path: '/employee' do resources :suppliers + resources :employee_shifts end #DEMO & DEVELOPMENT diff --git a/wip.md b/wip.md index 52ab77f1..a42d47ad 100644 --- a/wip.md +++ b/wip.md @@ -3,12 +3,10 @@ Release Supplier -------- - -- Allow table drag rollback same as area and element in section edit - mode view -- Move arrange tables logic to the client -- Show menu next to table in section view at the left side for tables at - the right side of the section +- collapse top menu on small screens +- Add supplier specific name field to my_account +- Add styling to active class active navigation items in top menu, side + and dropdown menus - Proper emails when an employee is created or added to a supplier - Add section-area colors - Add snap_code toggle to svg elements @@ -16,8 +14,6 @@ Supplier - Employee personal schedule - english emails - Add qr print functionality offering to send the stickers -- Add qr-print button to tables -- Order product buttons to views - Use modernizr svg to determine svg handling capabilities - Add spec for switching from non-manager supplier to other supplier