feat(POS): hide images & auto add item checkbox (#24102)
This commit is contained in:
parent
009721a3b2
commit
7acb42d6df
@ -14,7 +14,6 @@
|
|||||||
"column_break_9",
|
"column_break_9",
|
||||||
"update_stock",
|
"update_stock",
|
||||||
"ignore_pricing_rule",
|
"ignore_pricing_rule",
|
||||||
"hide_unavailable_items",
|
|
||||||
"warehouse",
|
"warehouse",
|
||||||
"campaign",
|
"campaign",
|
||||||
"company_address",
|
"company_address",
|
||||||
@ -23,6 +22,9 @@
|
|||||||
"section_break_11",
|
"section_break_11",
|
||||||
"payments",
|
"payments",
|
||||||
"section_break_14",
|
"section_break_14",
|
||||||
|
"hide_images",
|
||||||
|
"hide_unavailable_items",
|
||||||
|
"auto_add_item_to_cart",
|
||||||
"item_groups",
|
"item_groups",
|
||||||
"column_break_16",
|
"column_break_16",
|
||||||
"customer_groups",
|
"customer_groups",
|
||||||
@ -124,7 +126,8 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"fieldname": "section_break_14",
|
"fieldname": "section_break_14",
|
||||||
"fieldtype": "Section Break"
|
"fieldtype": "Section Break",
|
||||||
|
"label": "Configuration"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"description": "Only show Items from these Item Groups",
|
"description": "Only show Items from these Item Groups",
|
||||||
@ -314,13 +317,25 @@
|
|||||||
"fieldname": "hide_unavailable_items",
|
"fieldname": "hide_unavailable_items",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Hide Unavailable Items"
|
"label": "Hide Unavailable Items"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fieldname": "hide_images",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"label": "Hide Images"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fieldname": "auto_add_item_to_cart",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"label": "Automatically Add Filtered Item To Cart"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"icon": "icon-cog",
|
"icon": "icon-cog",
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
"index_web_pages_for_search": 1,
|
"index_web_pages_for_search": 1,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2020-10-29 13:18:38.795925",
|
"modified": "2020-12-10 13:59:28.877572",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "POS Profile",
|
"name": "POS Profile",
|
||||||
|
@ -111,24 +111,24 @@ erpnext.PointOfSale.Controller = class {
|
|||||||
dialog.show();
|
dialog.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
prepare_app_defaults(data) {
|
async prepare_app_defaults(data) {
|
||||||
this.pos_opening = data.name;
|
this.pos_opening = data.name;
|
||||||
this.company = data.company;
|
this.company = data.company;
|
||||||
this.pos_profile = data.pos_profile;
|
this.pos_profile = data.pos_profile;
|
||||||
this.pos_opening_time = data.period_start_date;
|
this.pos_opening_time = data.period_start_date;
|
||||||
|
this.item_stock_map = {};
|
||||||
|
this.settings = {};
|
||||||
|
|
||||||
frappe.db.get_value('Stock Settings', undefined, 'allow_negative_stock').then(({ message }) => {
|
frappe.db.get_value('Stock Settings', undefined, 'allow_negative_stock').then(({ message }) => {
|
||||||
this.allow_negative_stock = flt(message.allow_negative_stock) || false;
|
this.allow_negative_stock = flt(message.allow_negative_stock) || false;
|
||||||
});
|
});
|
||||||
|
|
||||||
frappe.db.get_doc("POS Profile", this.pos_profile).then((profile) => {
|
frappe.db.get_doc("POS Profile", this.pos_profile).then((profile) => {
|
||||||
this.customer_groups = profile.customer_groups.map(group => group.customer_group);
|
this.settings.customer_groups = profile.customer_groups.map(group => group.customer_group);
|
||||||
this.cart.make_customer_selector();
|
this.settings.hide_images = profile.hide_images;
|
||||||
});
|
this.settings.auto_add_item_to_cart = profile.auto_add_item_to_cart;
|
||||||
|
|
||||||
this.item_stock_map = {};
|
|
||||||
|
|
||||||
this.make_app();
|
this.make_app();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
set_opening_entry_status() {
|
set_opening_entry_status() {
|
||||||
@ -238,12 +238,11 @@ erpnext.PointOfSale.Controller = class {
|
|||||||
this.item_selector = new erpnext.PointOfSale.ItemSelector({
|
this.item_selector = new erpnext.PointOfSale.ItemSelector({
|
||||||
wrapper: this.$components_wrapper,
|
wrapper: this.$components_wrapper,
|
||||||
pos_profile: this.pos_profile,
|
pos_profile: this.pos_profile,
|
||||||
|
settings: this.settings,
|
||||||
events: {
|
events: {
|
||||||
item_selected: args => this.on_cart_update(args),
|
item_selected: args => this.on_cart_update(args),
|
||||||
|
|
||||||
get_frm: () => this.frm || {},
|
get_frm: () => this.frm || {}
|
||||||
|
|
||||||
get_allowed_item_group: () => this.item_groups
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -251,6 +250,7 @@ erpnext.PointOfSale.Controller = class {
|
|||||||
init_item_cart() {
|
init_item_cart() {
|
||||||
this.cart = new erpnext.PointOfSale.ItemCart({
|
this.cart = new erpnext.PointOfSale.ItemCart({
|
||||||
wrapper: this.$components_wrapper,
|
wrapper: this.$components_wrapper,
|
||||||
|
settings: this.settings,
|
||||||
events: {
|
events: {
|
||||||
get_frm: () => this.frm,
|
get_frm: () => this.frm,
|
||||||
|
|
||||||
@ -273,9 +273,7 @@ erpnext.PointOfSale.Controller = class {
|
|||||||
this.customer_details = details;
|
this.customer_details = details;
|
||||||
// will add/remove LP payment method
|
// will add/remove LP payment method
|
||||||
this.payment.render_loyalty_points_payment_mode();
|
this.payment.render_loyalty_points_payment_mode();
|
||||||
},
|
}
|
||||||
|
|
||||||
get_allowed_customer_group: () => this.customer_groups
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
erpnext.PointOfSale.ItemCart = class {
|
erpnext.PointOfSale.ItemCart = class {
|
||||||
constructor({ wrapper, events }) {
|
constructor({ wrapper, events, settings }) {
|
||||||
this.wrapper = wrapper;
|
this.wrapper = wrapper;
|
||||||
this.events = events;
|
this.events = events;
|
||||||
this.customer_info = undefined;
|
this.customer_info = undefined;
|
||||||
|
this.hide_images = settings.hide_images;
|
||||||
|
this.allowed_customer_groups = settings.customer_groups;
|
||||||
|
|
||||||
this.init_component();
|
this.init_component();
|
||||||
}
|
}
|
||||||
@ -32,6 +34,7 @@ erpnext.PointOfSale.ItemCart = class {
|
|||||||
`<div class="customer-section rounded flex flex-col m-8 mb-0"></div>`
|
`<div class="customer-section rounded flex flex-col m-8 mb-0"></div>`
|
||||||
)
|
)
|
||||||
this.$customer_section = this.$component.find('.customer-section');
|
this.$customer_section = this.$component.find('.customer-section');
|
||||||
|
this.make_customer_selector();
|
||||||
}
|
}
|
||||||
|
|
||||||
reset_customer_selector() {
|
reset_customer_selector() {
|
||||||
@ -302,7 +305,7 @@ erpnext.PointOfSale.ItemCart = class {
|
|||||||
this.$customer_section.html(`<div class="customer-search-field flex flex-1 items-center"></div>`);
|
this.$customer_section.html(`<div class="customer-search-field flex flex-1 items-center"></div>`);
|
||||||
const me = this;
|
const me = this;
|
||||||
const query = { query: 'erpnext.controllers.queries.customer_query' };
|
const query = { query: 'erpnext.controllers.queries.customer_query' };
|
||||||
const allowed_customer_group = this.events.get_allowed_customer_group() || [];
|
const allowed_customer_group = this.allowed_customer_groups || [];
|
||||||
if (allowed_customer_group.length) {
|
if (allowed_customer_group.length) {
|
||||||
query.filters = {
|
query.filters = {
|
||||||
customer_group: ['in', allowed_customer_group]
|
customer_group: ['in', allowed_customer_group]
|
||||||
@ -423,6 +426,7 @@ erpnext.PointOfSale.ItemCart = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
update_customer_section() {
|
update_customer_section() {
|
||||||
|
const me = this;
|
||||||
const { customer, email_id='', mobile_no='', image } = this.customer_info || {};
|
const { customer, email_id='', mobile_no='', image } = this.customer_info || {};
|
||||||
|
|
||||||
if (customer) {
|
if (customer) {
|
||||||
@ -460,7 +464,7 @@ erpnext.PointOfSale.ItemCart = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function get_customer_image() {
|
function get_customer_image() {
|
||||||
if (image) {
|
if (!me.hide_images && image) {
|
||||||
return `<div class="icon flex items-center justify-center w-12 h-12 rounded bg-light-grey mr-4 text-grey-200">
|
return `<div class="icon flex items-center justify-center w-12 h-12 rounded bg-light-grey mr-4 text-grey-200">
|
||||||
<img class="h-full" src="${image}" alt="${image}" style="object-fit: cover;">
|
<img class="h-full" src="${image}" alt="${image}" style="object-fit: cover;">
|
||||||
</div>`
|
</div>`
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
erpnext.PointOfSale.ItemSelector = class {
|
erpnext.PointOfSale.ItemSelector = class {
|
||||||
constructor({ frm, wrapper, events, pos_profile }) {
|
constructor({ frm, wrapper, events, pos_profile, settings }) {
|
||||||
this.wrapper = wrapper;
|
this.wrapper = wrapper;
|
||||||
this.events = events;
|
this.events = events;
|
||||||
this.pos_profile = pos_profile;
|
this.pos_profile = pos_profile;
|
||||||
|
this.hide_images = settings.hide_images;
|
||||||
|
this.auto_add_item = settings.auto_add_item_to_cart;
|
||||||
|
|
||||||
this.inti_component();
|
this.inti_component();
|
||||||
}
|
}
|
||||||
@ -33,6 +35,7 @@ erpnext.PointOfSale.ItemSelector = class {
|
|||||||
);
|
);
|
||||||
|
|
||||||
this.$component = this.wrapper.find('.items-selector');
|
this.$component = this.wrapper.find('.items-selector');
|
||||||
|
this.$items_container = this.$component.find('.items-container');
|
||||||
}
|
}
|
||||||
|
|
||||||
async load_items_data() {
|
async load_items_data() {
|
||||||
@ -65,7 +68,6 @@ erpnext.PointOfSale.ItemSelector = class {
|
|||||||
|
|
||||||
|
|
||||||
render_item_list(items) {
|
render_item_list(items) {
|
||||||
this.$items_container = this.$component.find('.items-container');
|
|
||||||
this.$items_container.html('');
|
this.$items_container.html('');
|
||||||
|
|
||||||
items.forEach(item => {
|
items.forEach(item => {
|
||||||
@ -75,11 +77,12 @@ erpnext.PointOfSale.ItemSelector = class {
|
|||||||
}
|
}
|
||||||
|
|
||||||
get_item_html(item) {
|
get_item_html(item) {
|
||||||
|
const me = this;
|
||||||
const { item_image, serial_no, batch_no, barcode, actual_qty, stock_uom } = item;
|
const { item_image, serial_no, batch_no, barcode, actual_qty, stock_uom } = item;
|
||||||
const indicator_color = actual_qty > 10 ? "green" : actual_qty <= 0 ? "red" : "orange";
|
const indicator_color = actual_qty > 10 ? "green" : actual_qty <= 0 ? "red" : "orange";
|
||||||
|
|
||||||
function get_item_image_html() {
|
function get_item_image_html() {
|
||||||
if (item_image) {
|
if (!me.hide_images && item_image) {
|
||||||
return `<div class="flex items-center justify-center h-32 border-b-grey text-6xl text-grey-100">
|
return `<div class="flex items-center justify-center h-32 border-b-grey text-6xl text-grey-100">
|
||||||
<img class="h-full" src="${item_image}" alt="${frappe.get_abbr(item.item_name)}" style="object-fit: cover;">
|
<img class="h-full" src="${item_image}" alt="${frappe.get_abbr(item.item_name)}" style="object-fit: cover;">
|
||||||
</div>`
|
</div>`
|
||||||
@ -203,6 +206,7 @@ erpnext.PointOfSale.ItemSelector = class {
|
|||||||
ignore_inputs: true,
|
ignore_inputs: true,
|
||||||
page: cur_page.page.page
|
page: cur_page.page.page
|
||||||
});
|
});
|
||||||
|
|
||||||
// for selecting the last filtered item on search
|
// for selecting the last filtered item on search
|
||||||
frappe.ui.keys.on("enter", () => {
|
frappe.ui.keys.on("enter", () => {
|
||||||
const selector_is_visible = this.$component.is(':visible');
|
const selector_is_visible = this.$component.is(':visible');
|
||||||
@ -235,6 +239,7 @@ erpnext.PointOfSale.ItemSelector = class {
|
|||||||
const items = this.search_index[search_term];
|
const items = this.search_index[search_term];
|
||||||
this.items = items;
|
this.items = items;
|
||||||
this.render_item_list(items);
|
this.render_item_list(items);
|
||||||
|
this.auto_add_item && this.items.length == 1 && this.add_filtered_item_to_cart();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -247,9 +252,14 @@ erpnext.PointOfSale.ItemSelector = class {
|
|||||||
}
|
}
|
||||||
this.items = items;
|
this.items = items;
|
||||||
this.render_item_list(items);
|
this.render_item_list(items);
|
||||||
|
this.auto_add_item && this.items.length == 1 && this.add_filtered_item_to_cart();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
add_filtered_item_to_cart() {
|
||||||
|
this.$items_container.find(".item-wrapper").click();
|
||||||
|
}
|
||||||
|
|
||||||
resize_selector(minimize) {
|
resize_selector(minimize) {
|
||||||
minimize ?
|
minimize ?
|
||||||
this.$component.find('.search-field').removeClass('mr-8') :
|
this.$component.find('.search-field').removeClass('mr-8') :
|
||||||
|
Loading…
x
Reference in New Issue
Block a user