Auto-update off

This commit is contained in:
2026-07-07 14:46:43 +02:00
parent 2a1c10ad4e
commit a69daa1294
4 changed files with 582 additions and 36 deletions

113
dist/tryton-sao.css vendored
View File

@@ -10237,25 +10237,35 @@ img.icon {
} }
.form fieldset.form-panel { .form fieldset.form-panel {
background: #fff; background: #fff;
border: 1px solid #d7e3de; border: 0;
border-radius: 8px; border-radius: 8px;
box-shadow: 0 3px 10px rgba(30, 55, 58, 0.075); box-shadow:
margin: 8px 0; inset 0 0 0 1px #d3e1dc,
overflow: visible; 0 3px 10px rgba(30, 55, 58, 0.075);
padding: 14px 16px 16px; margin: 4px 0;
overflow-x: hidden;
overflow-y: visible;
padding: 42px 16px 16px;
position: relative;
} }
.form fieldset.form-panel > legend { .form fieldset.form-panel > legend {
align-items: center; align-items: center;
background: #fff;
border-bottom: 1px solid #e6eee9; border-bottom: 1px solid #e6eee9;
color: #145369; color: #145369;
display: flex; display: flex;
font-size: 15px; font-size: 15px;
font-weight: 700; font-weight: 700;
gap: 8px; gap: 8px;
height: 25px;
left: 16px;
line-height: 1.35; line-height: 1.35;
margin: 0 0 12px; margin: 0;
padding: 0 0 9px; padding: 0 0 8px;
width: 100%; position: absolute;
right: 16px;
top: 12px;
width: auto;
} }
.form fieldset.form-panel > legend .form-panel-icon { .form fieldset.form-panel > legend .form-panel-icon {
height: 18px; height: 18px;
@@ -10270,6 +10280,11 @@ img.icon {
min-width: 0; min-width: 0;
padding: 2px; padding: 2px;
} }
.form fieldset.form-panel > .form-container > .form-item {
justify-self: stretch;
justify-content: flex-start;
align-self: center;
}
.form fieldset.form-panel .form-label { .form fieldset.form-panel .form-label {
color: #4b5f60; color: #4b5f60;
font-weight: 600; font-weight: 600;
@@ -10285,16 +10300,59 @@ img.icon {
align-items: center; align-items: center;
gap: 10px 18px; gap: 10px 18px;
} }
.form fieldset.form-panel-summary > .form-container > .form-item {
align-items: center;
align-self: center;
}
.form fieldset.form-panel-summary .form-label {
align-self: center;
}
.form fieldset.form-panel-sidebar { .form fieldset.form-panel-sidebar {
box-shadow: 0 4px 14px rgba(30, 55, 58, 0.08); box-shadow: 0 4px 14px rgba(30, 55, 58, 0.08);
padding: 32px 10px 9px;
} }
.form fieldset.form-panel-sidebar > .form-container, .form fieldset.form-panel-sidebar > .form-container,
.form .form-panel-sidebar-grid { .form .form-panel-sidebar-grid {
gap: 8px 10px; gap: 4px 8px;
} }
.form fieldset.form-panel-sidebar .form-label { .form fieldset.form-panel-sidebar .form-label {
color: #145369; color: #145369;
font-size: 12px; font-size: 11px;
line-height: 1.2;
white-space: nowrap;
}
.form fieldset.form-panel-sidebar .form-item {
padding: 1px;
}
.form fieldset.form-panel-sidebar input.form-control,
.form fieldset.form-panel-sidebar .input-group > .form-control,
.form fieldset.form-panel-sidebar .input-group-addon,
.form fieldset.form-panel-sidebar .selection {
background: transparent;
border-color: transparent;
box-shadow: none;
min-height: 20px;
padding-bottom: 1px;
padding-top: 1px;
}
.form fieldset.form-panel-sidebar input.form-control,
.form fieldset.form-panel-sidebar .input-group > .form-control {
font-size: 11px;
font-weight: 700;
height: 22px;
padding-left: 0;
padding-right: 0;
}
.form fieldset.form-panel-sidebar .input-group-addon {
font-size: 11px;
height: 22px;
padding: 1px 4px;
}
.form fieldset#purchase_recap.form-panel-sidebar,
.form fieldset[id="purchase_recap"].form-panel-sidebar,
.form fieldset#sale_recap.form-panel-sidebar,
.form fieldset[id="sale_recap"].form-panel-sidebar {
min-height: 172px;
} }
.form fieldset.form-panel-plain { .form fieldset.form-panel-plain {
background: transparent; background: transparent;
@@ -11048,13 +11106,24 @@ body {
html[theme="default"] .screen-container > .filter-box, html[theme="default"] .screen-container > .filter-box,
html[theme="default"] .screen-container .content-box > .form, html[theme="default"] .screen-container .content-box > .form,
html[theme="default"] .screen-container .content-box > form { html[theme="default"] .screen-container .content-box > form {
background: linear-gradient(180deg, #f4f8f6 0%, #edf4f1 100%); background: linear-gradient(180deg, #fbfcfb 0%, #f6faf8 100%);
border: 1px solid #dfe8e3; border: 1px solid #dfe8e3;
border-radius: 12px; border-radius: 12px;
padding: 14px 16px 10px; padding: 14px 16px 10px;
box-shadow: 0 3px 12px rgba(53, 81, 84, 0.06); box-shadow: 0 3px 12px rgba(53, 81, 84, 0.06);
} }
html[theme="default"] .form .tab-pane:has(> .form-container > .form-item > fieldset.form-panel) {
background: #f7faf8;
border-radius: 10px;
padding: 8px;
}
html[theme="default"] .form .tab-pane:has(> .form-container > .form-item > fieldset.form-panel)
> .form-container {
gap: 4px 14px;
}
html[theme="default"] .screen-container .form-group { html[theme="default"] .screen-container .form-group {
margin-bottom: 12px; margin-bottom: 12px;
} }
@@ -11084,6 +11153,28 @@ html[theme="default"] .screen-container input[type="search"]:not(.ag-grid-tree-p
-webkit-box-shadow: inset 0 1px 2px rgba(53, 81, 84, 0.03); -webkit-box-shadow: inset 0 1px 2px rgba(53, 81, 84, 0.03);
} }
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar input.form-control:not([type="checkbox"]):not([type="radio"]),
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar select.form-control,
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar textarea.form-control,
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar .input-group > .form-control,
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar .input-group > .form-control[readonly],
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar .input-group-addon,
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar input[type="text"]:not(.ag-grid-tree-panel-checkbox),
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar input[type="date"]:not(.ag-grid-tree-panel-checkbox),
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar input[type="datetime-local"]:not(.ag-grid-tree-panel-checkbox),
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar input[type="number"]:not(.ag-grid-tree-panel-checkbox),
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar input[type="search"]:not(.ag-grid-tree-panel-checkbox) {
background: transparent !important;
border-color: transparent !important;
box-shadow: none !important;
-webkit-box-shadow: none !important;
font-size: 11px !important;
font-weight: 700;
height: 22px !important;
min-height: 20px !important;
padding: 0 !important;
}
html[theme="default"] .screen-container .input-group-sm.input-icon-primary > .form-control, html[theme="default"] .screen-container .input-group-sm.input-icon-primary > .form-control,
html[theme="default"] .screen-container .input-icon-primary > .form-control { html[theme="default"] .screen-container .input-icon-primary > .form-control {
padding-left: 33px; padding-left: 33px;

196
dist/tryton-sao.js vendored
View File

@@ -21313,6 +21313,167 @@ function eval_pyson(value){
const json = value.slice(3); const json = value.slice(3);
const config = JSON.parse(json); // doit contenir { highlightedCountry: '250' } const config = JSON.parse(json); // doit contenir { highlightedCountry: '250' }
if (config.type === 'execution-summary') {
let d3Div = container.find('.d3-execution-summary-container');
if (d3Div.length === 0) {
d3Div = $('<div/>', {
class: 'd3-execution-summary-container',
css: {
width: '100%',
height: height.toString() + 'px',
overflow: 'hidden',
background: 'transparent'
}
}).appendTo(container);
} else {
d3Div.empty();
}
const loadD3ExecutionSummary = () => {
const node = d3Div[0];
const w = Math.max(300, node.clientWidth || width || 360);
const h = Math.max(125, height || 160);
const totals = config.totals || {};
const rows = config.rows || [];
const totalQty = Math.max(1, Number(totals.quantity || 0));
const matched = Number(totals.matched || 0);
const shipped = Number(totals.shipped || 0);
const matchedPct = Math.min(100, Math.round((matched / totalQty) * 100));
const shippedPct = Math.min(100, Math.round((shipped / totalQty) * 100));
const fmt = d3.format(',.0f');
const hasTitle = Boolean(config.title);
const statsY = hasTitle ? 30 : 8;
const barY = hasTitle ? 58 : 36;
const rowY = hasTitle ? 84 : 62;
const palette = {
matched: '#2b8c87',
shipped: '#145369',
open: '#dbe8e3',
text: '#24484d',
muted: '#6b7d7b',
line: '#e3ede8'
};
const svg = d3.select(node).append('svg')
.attr('width', w)
.attr('height', h)
.attr('viewBox', `0 0 ${w} ${h}`);
if (hasTitle) {
svg.append('text')
.attr('x', 4)
.attr('y', 15)
.attr('font-family', 'Inter, sans-serif')
.attr('font-size', 12)
.attr('font-weight', 700)
.attr('fill', palette.text)
.text(config.title);
}
const stats = [
{label: 'Lines', value: fmt(totals.lines || rows.length || 0)},
{label: 'Matched', value: matchedPct + '%'},
{label: 'Shipped', value: shippedPct + '%'}
];
const stat = svg.selectAll('g.stat')
.data(stats)
.join('g')
.attr('class', 'stat')
.attr('transform', (d, i) => `translate(${4 + i * Math.min(95, (w - 16) / 3)}, ${statsY})`);
stat.append('text')
.attr('font-family', 'Inter, sans-serif')
.attr('font-size', 10)
.attr('fill', palette.muted)
.text(d => d.label);
stat.append('text')
.attr('y', 16)
.attr('font-family', 'Inter, sans-serif')
.attr('font-size', 14)
.attr('font-weight', 700)
.attr('fill', palette.text)
.text(d => d.value);
const barX = 4;
const barW = Math.max(160, w - 8);
const barH = 8;
svg.append('rect')
.attr('x', barX)
.attr('y', barY)
.attr('width', barW)
.attr('height', barH)
.attr('rx', 4)
.attr('fill', palette.open);
svg.append('rect')
.attr('x', barX)
.attr('y', barY)
.attr('width', barW * Math.min(1, matched / totalQty))
.attr('height', barH)
.attr('rx', 4)
.attr('fill', palette.matched);
svg.append('rect')
.attr('x', barX)
.attr('y', barY)
.attr('width', barW * Math.min(1, shipped / totalQty))
.attr('height', barH)
.attr('rx', 4)
.attr('fill', palette.shipped);
const row = svg.selectAll('g.exec-row')
.data(rows.slice(0, 3))
.join('g')
.attr('class', 'exec-row')
.attr('transform', (d, i) => `translate(4, ${rowY + i * 24})`);
row.append('line')
.attr('x1', 0)
.attr('x2', w - 8)
.attr('y1', -8)
.attr('y2', -8)
.attr('stroke', palette.line);
row.append('text')
.attr('font-family', 'Inter, sans-serif')
.attr('font-size', 10)
.attr('font-weight', 700)
.attr('fill', palette.text)
.text(d => (d.product || 'Line').slice(0, 18));
row.append('text')
.attr('x', 170)
.attr('font-family', 'Inter, sans-serif')
.attr('font-size', 10)
.attr('fill', palette.muted)
.text(d => `${fmt(d.shipped || 0)}/${fmt(d.quantity || 0)} ${d.unit || ''}`);
row.append('text')
.attr('x', 250)
.attr('font-family', 'Inter, sans-serif')
.attr('font-size', 10)
.attr('fill', palette.muted)
.text(d => (d.route || '').slice(0, 32));
if (!rows.length) {
svg.append('text')
.attr('x', 4)
.attr('y', 90)
.attr('font-family', 'Inter, sans-serif')
.attr('font-size', 11)
.attr('fill', palette.muted)
.text('No purchase lines to summarize');
}
};
const ensureD3 = (cb) => {
if (typeof d3 !== 'undefined') {
cb();
return;
}
const script = document.createElement('script');
script.src = 'https://d3js.org/d3.v7.min.js';
script.onload = cb;
document.head.appendChild(script);
};
ensureD3(loadD3ExecutionSummary);
return;
}
// Réutilise le conteneur si déjà présent // Réutilise le conteneur si déjà présent
let d3Div = container.find('.d3-map-container'); let d3Div = container.find('.d3-map-container');
if (d3Div.length === 0) { if (d3Div.length === 0) {
@@ -23181,9 +23342,24 @@ function eval_pyson(value){
var save_options = this._pending_state_save_options || {}; var save_options = this._pending_state_save_options || {};
this._pending_state_save_options = null; this._pending_state_save_options = null;
this._state_save_timer = null; this._state_save_timer = null;
this._persist_grid_state(save_options); this._mark_grid_state_dirty(save_options);
}, 80); }, 80);
}, },
_mark_grid_state_dirty: function(options) {
options = options || {};
var state = this._capture_grid_state();
var active_preset = this._find_layout_preset(this._active_layout_id);
this._layout_dirty = active_preset ?
!Sao.common.compare(active_preset.state, state) :
!this._is_standard_layout_state(state);
this._render_column_menu();
this._render_grouping_panel();
this._render_layout_panel();
this._update_layout_button();
if (!options.skipLayoutRefresh) {
this._schedule_grid_layout_refresh();
}
},
_on_grid_column_layout_changed: function(options) { _on_grid_column_layout_changed: function(options) {
options = options || {}; options = options || {};
this._schedule_state_save(options); this._schedule_state_save(options);
@@ -23672,7 +23848,7 @@ function eval_pyson(value){
this._persisted_state = jQuery.extend({}, this._persisted_state || {}); this._persisted_state = jQuery.extend({}, this._persisted_state || {});
this._persisted_state.grouping = this._build_grouping_state( this._persisted_state.grouping = this._build_grouping_state(
this._get_default_grouping_state(), state); this._get_default_grouping_state(), state);
this._save_persisted_state(this._persisted_state); this._mark_grid_state_dirty();
this._force_rowdata_reset = true; this._force_rowdata_reset = true;
this.display(this.get_selected_paths()); this.display(this.get_selected_paths());
this._render_column_menu(); this._render_column_menu();
@@ -24837,7 +25013,7 @@ function eval_pyson(value){
}], }],
}); });
this._syncing_grid = false; this._syncing_grid = false;
this._persist_grid_state(); this._mark_grid_state_dirty();
this._schedule_grid_layout_refresh(); this._schedule_grid_layout_refresh();
}, },
_sync_optional_columns_from_grid_state: function(column_states) { _sync_optional_columns_from_grid_state: function(column_states) {
@@ -27439,7 +27615,7 @@ function eval_pyson(value){
} else { } else {
this.screen.order = [order[0]]; this.screen.order = [order[0]];
} }
this._persist_grid_state(); this._mark_grid_state_dirty();
if (filter_model && Object.keys(filter_model).length) { if (filter_model && Object.keys(filter_model).length) {
return; return;
} }
@@ -28146,6 +28322,7 @@ function eval_pyson(value){
var rect = this.grid_host[0].getBoundingClientRect(); var rect = this.grid_host[0].getBoundingClientRect();
var content_box = this.grid_host.closest('.content-box.ag-grid-content-box'); var content_box = this.grid_host.closest('.content-box.ag-grid-content-box');
var screen_container = this.grid_host.closest('.screen-container'); var screen_container = this.grid_host.closest('.screen-container');
var modal_body = this.grid_host.closest('.modal-body');
var toolbar_height = this.toolbar && this.toolbar.length ? var toolbar_height = this.toolbar && this.toolbar.length ?
Math.ceil(this.toolbar.outerHeight(true)) : 0; Math.ceil(this.toolbar.outerHeight(true)) : 0;
var summary_height = this.summary_bar && this.summary_bar.length ? var summary_height = this.summary_bar && this.summary_bar.length ?
@@ -28161,9 +28338,14 @@ function eval_pyson(value){
window.innerHeight - content_rect.top - toolbar_height - window.innerHeight - content_rect.top - toolbar_height -
summary_height - external_scroll_height - bottom_margin); summary_height - external_scroll_height - bottom_margin);
} }
var compact_min_height = 260; var embedded_auto_height = this.is_embedded_one2many &&
var readable_min_height = 420; !this._embedded_height;
var maximum_height = 720; var compact_min_height = (modal_body.length || embedded_auto_height) ?
170 : 260;
var readable_min_height = modal_body.length ? 240 :
(embedded_auto_height ? 220 : 420);
var maximum_height = modal_body.length ? 360 :
(embedded_auto_height ? 300 : 720);
var height; var height;
if (this.is_embedded_one2many && this._embedded_height) { if (this.is_embedded_one2many && this._embedded_height) {
height = Math.max(80, this._embedded_height - toolbar_height - height = Math.max(80, this._embedded_height - toolbar_height -

View File

@@ -10237,25 +10237,35 @@ img.icon {
} }
.form fieldset.form-panel { .form fieldset.form-panel {
background: #fff; background: #fff;
border: 1px solid #d7e3de; border: 0;
border-radius: 8px; border-radius: 8px;
box-shadow: 0 3px 10px rgba(30, 55, 58, 0.075); box-shadow:
margin: 8px 0; inset 0 0 0 1px #d3e1dc,
overflow: visible; 0 3px 10px rgba(30, 55, 58, 0.075);
padding: 14px 16px 16px; margin: 4px 0;
overflow-x: hidden;
overflow-y: visible;
padding: 42px 16px 16px;
position: relative;
} }
.form fieldset.form-panel > legend { .form fieldset.form-panel > legend {
align-items: center; align-items: center;
background: #fff;
border-bottom: 1px solid #e6eee9; border-bottom: 1px solid #e6eee9;
color: #145369; color: #145369;
display: flex; display: flex;
font-size: 15px; font-size: 15px;
font-weight: 700; font-weight: 700;
gap: 8px; gap: 8px;
height: 25px;
left: 16px;
line-height: 1.35; line-height: 1.35;
margin: 0 0 12px; margin: 0;
padding: 0 0 9px; padding: 0 0 8px;
width: 100%; position: absolute;
right: 16px;
top: 12px;
width: auto;
} }
.form fieldset.form-panel > legend .form-panel-icon { .form fieldset.form-panel > legend .form-panel-icon {
height: 18px; height: 18px;
@@ -10270,6 +10280,11 @@ img.icon {
min-width: 0; min-width: 0;
padding: 2px; padding: 2px;
} }
.form fieldset.form-panel > .form-container > .form-item {
justify-self: stretch;
justify-content: flex-start;
align-self: center;
}
.form fieldset.form-panel .form-label { .form fieldset.form-panel .form-label {
color: #4b5f60; color: #4b5f60;
font-weight: 600; font-weight: 600;
@@ -10285,16 +10300,59 @@ img.icon {
align-items: center; align-items: center;
gap: 10px 18px; gap: 10px 18px;
} }
.form fieldset.form-panel-summary > .form-container > .form-item {
align-items: center;
align-self: center;
}
.form fieldset.form-panel-summary .form-label {
align-self: center;
}
.form fieldset.form-panel-sidebar { .form fieldset.form-panel-sidebar {
box-shadow: 0 4px 14px rgba(30, 55, 58, 0.08); box-shadow: 0 4px 14px rgba(30, 55, 58, 0.08);
padding: 32px 10px 9px;
} }
.form fieldset.form-panel-sidebar > .form-container, .form fieldset.form-panel-sidebar > .form-container,
.form .form-panel-sidebar-grid { .form .form-panel-sidebar-grid {
gap: 8px 10px; gap: 4px 8px;
} }
.form fieldset.form-panel-sidebar .form-label { .form fieldset.form-panel-sidebar .form-label {
color: #145369; color: #145369;
font-size: 12px; font-size: 11px;
line-height: 1.2;
white-space: nowrap;
}
.form fieldset.form-panel-sidebar .form-item {
padding: 1px;
}
.form fieldset.form-panel-sidebar input.form-control,
.form fieldset.form-panel-sidebar .input-group > .form-control,
.form fieldset.form-panel-sidebar .input-group-addon,
.form fieldset.form-panel-sidebar .selection {
background: transparent;
border-color: transparent;
box-shadow: none;
min-height: 20px;
padding-bottom: 1px;
padding-top: 1px;
}
.form fieldset.form-panel-sidebar input.form-control,
.form fieldset.form-panel-sidebar .input-group > .form-control {
font-size: 11px;
font-weight: 700;
height: 22px;
padding-left: 0;
padding-right: 0;
}
.form fieldset.form-panel-sidebar .input-group-addon {
font-size: 11px;
height: 22px;
padding: 1px 4px;
}
.form fieldset#purchase_recap.form-panel-sidebar,
.form fieldset[id="purchase_recap"].form-panel-sidebar,
.form fieldset#sale_recap.form-panel-sidebar,
.form fieldset[id="sale_recap"].form-panel-sidebar {
min-height: 172px;
} }
.form fieldset.form-panel-plain { .form fieldset.form-panel-plain {
background: transparent; background: transparent;
@@ -11048,13 +11106,24 @@ body {
html[theme="default"] .screen-container > .filter-box, html[theme="default"] .screen-container > .filter-box,
html[theme="default"] .screen-container .content-box > .form, html[theme="default"] .screen-container .content-box > .form,
html[theme="default"] .screen-container .content-box > form { html[theme="default"] .screen-container .content-box > form {
background: linear-gradient(180deg, #f4f8f6 0%, #edf4f1 100%); background: linear-gradient(180deg, #fbfcfb 0%, #f6faf8 100%);
border: 1px solid #dfe8e3; border: 1px solid #dfe8e3;
border-radius: 12px; border-radius: 12px;
padding: 14px 16px 10px; padding: 14px 16px 10px;
box-shadow: 0 3px 12px rgba(53, 81, 84, 0.06); box-shadow: 0 3px 12px rgba(53, 81, 84, 0.06);
} }
html[theme="default"] .form .tab-pane:has(> .form-container > .form-item > fieldset.form-panel) {
background: #f7faf8;
border-radius: 10px;
padding: 8px;
}
html[theme="default"] .form .tab-pane:has(> .form-container > .form-item > fieldset.form-panel)
> .form-container {
gap: 4px 14px;
}
html[theme="default"] .screen-container .form-group { html[theme="default"] .screen-container .form-group {
margin-bottom: 12px; margin-bottom: 12px;
} }
@@ -11084,6 +11153,28 @@ html[theme="default"] .screen-container input[type="search"]:not(.ag-grid-tree-p
-webkit-box-shadow: inset 0 1px 2px rgba(53, 81, 84, 0.03); -webkit-box-shadow: inset 0 1px 2px rgba(53, 81, 84, 0.03);
} }
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar input.form-control:not([type="checkbox"]):not([type="radio"]),
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar select.form-control,
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar textarea.form-control,
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar .input-group > .form-control,
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar .input-group > .form-control[readonly],
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar .input-group-addon,
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar input[type="text"]:not(.ag-grid-tree-panel-checkbox),
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar input[type="date"]:not(.ag-grid-tree-panel-checkbox),
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar input[type="datetime-local"]:not(.ag-grid-tree-panel-checkbox),
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar input[type="number"]:not(.ag-grid-tree-panel-checkbox),
html[theme="default"] .screen-container .form fieldset.form-panel-sidebar input[type="search"]:not(.ag-grid-tree-panel-checkbox) {
background: transparent !important;
border-color: transparent !important;
box-shadow: none !important;
-webkit-box-shadow: none !important;
font-size: 11px !important;
font-weight: 700;
height: 22px !important;
min-height: 20px !important;
padding: 0 !important;
}
html[theme="default"] .screen-container .input-group-sm.input-icon-primary > .form-control, html[theme="default"] .screen-container .input-group-sm.input-icon-primary > .form-control,
html[theme="default"] .screen-container .input-icon-primary > .form-control { html[theme="default"] .screen-container .input-icon-primary > .form-control {
padding-left: 33px; padding-left: 33px;

View File

@@ -21313,6 +21313,167 @@ function eval_pyson(value){
const json = value.slice(3); const json = value.slice(3);
const config = JSON.parse(json); // doit contenir { highlightedCountry: '250' } const config = JSON.parse(json); // doit contenir { highlightedCountry: '250' }
if (config.type === 'execution-summary') {
let d3Div = container.find('.d3-execution-summary-container');
if (d3Div.length === 0) {
d3Div = $('<div/>', {
class: 'd3-execution-summary-container',
css: {
width: '100%',
height: height.toString() + 'px',
overflow: 'hidden',
background: 'transparent'
}
}).appendTo(container);
} else {
d3Div.empty();
}
const loadD3ExecutionSummary = () => {
const node = d3Div[0];
const w = Math.max(300, node.clientWidth || width || 360);
const h = Math.max(125, height || 160);
const totals = config.totals || {};
const rows = config.rows || [];
const totalQty = Math.max(1, Number(totals.quantity || 0));
const matched = Number(totals.matched || 0);
const shipped = Number(totals.shipped || 0);
const matchedPct = Math.min(100, Math.round((matched / totalQty) * 100));
const shippedPct = Math.min(100, Math.round((shipped / totalQty) * 100));
const fmt = d3.format(',.0f');
const hasTitle = Boolean(config.title);
const statsY = hasTitle ? 30 : 8;
const barY = hasTitle ? 58 : 36;
const rowY = hasTitle ? 84 : 62;
const palette = {
matched: '#2b8c87',
shipped: '#145369',
open: '#dbe8e3',
text: '#24484d',
muted: '#6b7d7b',
line: '#e3ede8'
};
const svg = d3.select(node).append('svg')
.attr('width', w)
.attr('height', h)
.attr('viewBox', `0 0 ${w} ${h}`);
if (hasTitle) {
svg.append('text')
.attr('x', 4)
.attr('y', 15)
.attr('font-family', 'Inter, sans-serif')
.attr('font-size', 12)
.attr('font-weight', 700)
.attr('fill', palette.text)
.text(config.title);
}
const stats = [
{label: 'Lines', value: fmt(totals.lines || rows.length || 0)},
{label: 'Matched', value: matchedPct + '%'},
{label: 'Shipped', value: shippedPct + '%'}
];
const stat = svg.selectAll('g.stat')
.data(stats)
.join('g')
.attr('class', 'stat')
.attr('transform', (d, i) => `translate(${4 + i * Math.min(95, (w - 16) / 3)}, ${statsY})`);
stat.append('text')
.attr('font-family', 'Inter, sans-serif')
.attr('font-size', 10)
.attr('fill', palette.muted)
.text(d => d.label);
stat.append('text')
.attr('y', 16)
.attr('font-family', 'Inter, sans-serif')
.attr('font-size', 14)
.attr('font-weight', 700)
.attr('fill', palette.text)
.text(d => d.value);
const barX = 4;
const barW = Math.max(160, w - 8);
const barH = 8;
svg.append('rect')
.attr('x', barX)
.attr('y', barY)
.attr('width', barW)
.attr('height', barH)
.attr('rx', 4)
.attr('fill', palette.open);
svg.append('rect')
.attr('x', barX)
.attr('y', barY)
.attr('width', barW * Math.min(1, matched / totalQty))
.attr('height', barH)
.attr('rx', 4)
.attr('fill', palette.matched);
svg.append('rect')
.attr('x', barX)
.attr('y', barY)
.attr('width', barW * Math.min(1, shipped / totalQty))
.attr('height', barH)
.attr('rx', 4)
.attr('fill', palette.shipped);
const row = svg.selectAll('g.exec-row')
.data(rows.slice(0, 3))
.join('g')
.attr('class', 'exec-row')
.attr('transform', (d, i) => `translate(4, ${rowY + i * 24})`);
row.append('line')
.attr('x1', 0)
.attr('x2', w - 8)
.attr('y1', -8)
.attr('y2', -8)
.attr('stroke', palette.line);
row.append('text')
.attr('font-family', 'Inter, sans-serif')
.attr('font-size', 10)
.attr('font-weight', 700)
.attr('fill', palette.text)
.text(d => (d.product || 'Line').slice(0, 18));
row.append('text')
.attr('x', 170)
.attr('font-family', 'Inter, sans-serif')
.attr('font-size', 10)
.attr('fill', palette.muted)
.text(d => `${fmt(d.shipped || 0)}/${fmt(d.quantity || 0)} ${d.unit || ''}`);
row.append('text')
.attr('x', 250)
.attr('font-family', 'Inter, sans-serif')
.attr('font-size', 10)
.attr('fill', palette.muted)
.text(d => (d.route || '').slice(0, 32));
if (!rows.length) {
svg.append('text')
.attr('x', 4)
.attr('y', 90)
.attr('font-family', 'Inter, sans-serif')
.attr('font-size', 11)
.attr('fill', palette.muted)
.text('No purchase lines to summarize');
}
};
const ensureD3 = (cb) => {
if (typeof d3 !== 'undefined') {
cb();
return;
}
const script = document.createElement('script');
script.src = 'https://d3js.org/d3.v7.min.js';
script.onload = cb;
document.head.appendChild(script);
};
ensureD3(loadD3ExecutionSummary);
return;
}
// Réutilise le conteneur si déjà présent // Réutilise le conteneur si déjà présent
let d3Div = container.find('.d3-map-container'); let d3Div = container.find('.d3-map-container');
if (d3Div.length === 0) { if (d3Div.length === 0) {
@@ -23181,9 +23342,24 @@ function eval_pyson(value){
var save_options = this._pending_state_save_options || {}; var save_options = this._pending_state_save_options || {};
this._pending_state_save_options = null; this._pending_state_save_options = null;
this._state_save_timer = null; this._state_save_timer = null;
this._persist_grid_state(save_options); this._mark_grid_state_dirty(save_options);
}, 80); }, 80);
}, },
_mark_grid_state_dirty: function(options) {
options = options || {};
var state = this._capture_grid_state();
var active_preset = this._find_layout_preset(this._active_layout_id);
this._layout_dirty = active_preset ?
!Sao.common.compare(active_preset.state, state) :
!this._is_standard_layout_state(state);
this._render_column_menu();
this._render_grouping_panel();
this._render_layout_panel();
this._update_layout_button();
if (!options.skipLayoutRefresh) {
this._schedule_grid_layout_refresh();
}
},
_on_grid_column_layout_changed: function(options) { _on_grid_column_layout_changed: function(options) {
options = options || {}; options = options || {};
this._schedule_state_save(options); this._schedule_state_save(options);
@@ -23672,7 +23848,7 @@ function eval_pyson(value){
this._persisted_state = jQuery.extend({}, this._persisted_state || {}); this._persisted_state = jQuery.extend({}, this._persisted_state || {});
this._persisted_state.grouping = this._build_grouping_state( this._persisted_state.grouping = this._build_grouping_state(
this._get_default_grouping_state(), state); this._get_default_grouping_state(), state);
this._save_persisted_state(this._persisted_state); this._mark_grid_state_dirty();
this._force_rowdata_reset = true; this._force_rowdata_reset = true;
this.display(this.get_selected_paths()); this.display(this.get_selected_paths());
this._render_column_menu(); this._render_column_menu();
@@ -24837,7 +25013,7 @@ function eval_pyson(value){
}], }],
}); });
this._syncing_grid = false; this._syncing_grid = false;
this._persist_grid_state(); this._mark_grid_state_dirty();
this._schedule_grid_layout_refresh(); this._schedule_grid_layout_refresh();
}, },
_sync_optional_columns_from_grid_state: function(column_states) { _sync_optional_columns_from_grid_state: function(column_states) {
@@ -27439,7 +27615,7 @@ function eval_pyson(value){
} else { } else {
this.screen.order = [order[0]]; this.screen.order = [order[0]];
} }
this._persist_grid_state(); this._mark_grid_state_dirty();
if (filter_model && Object.keys(filter_model).length) { if (filter_model && Object.keys(filter_model).length) {
return; return;
} }
@@ -28146,6 +28322,7 @@ function eval_pyson(value){
var rect = this.grid_host[0].getBoundingClientRect(); var rect = this.grid_host[0].getBoundingClientRect();
var content_box = this.grid_host.closest('.content-box.ag-grid-content-box'); var content_box = this.grid_host.closest('.content-box.ag-grid-content-box');
var screen_container = this.grid_host.closest('.screen-container'); var screen_container = this.grid_host.closest('.screen-container');
var modal_body = this.grid_host.closest('.modal-body');
var toolbar_height = this.toolbar && this.toolbar.length ? var toolbar_height = this.toolbar && this.toolbar.length ?
Math.ceil(this.toolbar.outerHeight(true)) : 0; Math.ceil(this.toolbar.outerHeight(true)) : 0;
var summary_height = this.summary_bar && this.summary_bar.length ? var summary_height = this.summary_bar && this.summary_bar.length ?
@@ -28161,9 +28338,14 @@ function eval_pyson(value){
window.innerHeight - content_rect.top - toolbar_height - window.innerHeight - content_rect.top - toolbar_height -
summary_height - external_scroll_height - bottom_margin); summary_height - external_scroll_height - bottom_margin);
} }
var compact_min_height = 260; var embedded_auto_height = this.is_embedded_one2many &&
var readable_min_height = 420; !this._embedded_height;
var maximum_height = 720; var compact_min_height = (modal_body.length || embedded_auto_height) ?
170 : 260;
var readable_min_height = modal_body.length ? 240 :
(embedded_auto_height ? 220 : 420);
var maximum_height = modal_body.length ? 360 :
(embedded_auto_height ? 300 : 720);
var height; var height;
if (this.is_embedded_one2many && this._embedded_height) { if (this.is_embedded_one2many && this._embedded_height) {
height = Math.max(80, this._embedded_height - toolbar_height - height = Math.max(80, this._embedded_height - toolbar_height -