Skip to content

Commit

Permalink
Merge PR #14 into 16.0
Browse files Browse the repository at this point in the history
Signed-off-by etobella
  • Loading branch information
OCA-git-bot committed Jul 9, 2023
2 parents db8bcbe + d3f274d commit ce9802a
Show file tree
Hide file tree
Showing 9 changed files with 475 additions and 5 deletions.
3 changes: 3 additions & 0 deletions spreadsheet_oca/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,13 @@
"spreadsheet_oca/static/src/spreadsheet/spreadsheet_action.esm.js",
"spreadsheet_oca/static/src/spreadsheet/pivot_controller.esm.js",
"spreadsheet_oca/static/src/spreadsheet/graph_controller.esm.js",
"spreadsheet_oca/static/src/spreadsheet/list_controller.esm.js",
"spreadsheet_oca/static/src/spreadsheet/list_renderer.esm.js",
],
"spreadsheet.o_spreadsheet": [
"spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml",
"spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js",
"spreadsheet_oca/static/src/spreadsheet/bundle/filter_panel_datasources.esm.js",
"spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_renderer.esm.js",
"spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_controlpanel.esm.js",
"spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet_action.esm.js",
Expand Down
7 changes: 3 additions & 4 deletions spreadsheet_oca/static/src/spreadsheet/bundle/filter.esm.js
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,12 @@ export class EditFilterPanel extends Component {
objectClass.getFieldMatching(objectId, this.props.filter.id) ||
{},
fields: fields,
type: objectType,
model: objectClass.getModel(objectId),
};
ModelFields.push(fields);
}
}
console.log(this.state.objects);
this.models = [
...new Set(
ModelFields.map((field_items) => Object.values(field_items))
Expand Down Expand Up @@ -133,7 +133,6 @@ export class EditFilterPanel extends Component {
? "EDIT_GLOBAL_FILTER"
: "ADD_GLOBAL_FILTER";
this.env.openSidePanel("FilterPanel", {});

var filter = {
id: this.props.filter.id || uuidGenerator.uuidv4(),
type: this.state.type,
Expand All @@ -146,7 +145,7 @@ export class EditFilterPanel extends Component {
var filterMatching = {};
Object.values(this.state.objects).forEach((object) => {
filterMatching[object.type] = filterMatching[object.type] || {};
filterMatching[object.type][object.id] = {...object.fieldMatch};
filterMatching[object.type][object.objectId] = {...object.fieldMatch};
});
this.env.model.dispatch(action, {id: filter.id, filter, ...filterMatching});

Expand All @@ -162,7 +161,7 @@ export class EditFilterPanel extends Component {
this.env.openSidePanel("FilterPanel", {});
}
onFieldMatchUpdate(object, name) {
this.state.objects[object.id].fieldMatch.chain = name.chain;
this.state.objects[object.id].fieldMatch.chain = name;
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
/** @odoo-module **/

import {Component, onWillStart, onWillUpdateProps} from "@odoo/owl";
import {Domain} from "@web/core/domain";
import {DomainSelector} from "@web/core/domain_selector/domain_selector";
import {DomainSelectorDialog} from "@web/core/domain_selector_dialog/domain_selector_dialog";
import {_t} from "web.core";
import spreadsheet from "@spreadsheet/o_spreadsheet/o_spreadsheet_extended";
import {time_to_str} from "web.time";
import {useService} from "@web/core/utils/hooks";

const {sidePanelRegistry, topbarMenuRegistry} = spreadsheet.registries;
const {createFullMenuItem} = spreadsheet.helpers;

topbarMenuRegistry.addChild("data_sources", ["data"], (env) => {
const children = env.model.getters.getPivotIds().map((pivotId, index) =>
createFullMenuItem(`data_source_pivot_ ${pivotId}`, {
name: env.model.getters.getPivotDisplayName(pivotId),
sequence: 100,
action: (child_env) => {
child_env.model.dispatch("SELECT_PIVOT", {
pivotId: pivotId,
});
child_env.openSidePanel("PivotPanel", {});
},
icon: "fa fa-table",
separator: index === env.model.getters.getPivotIds().length - 1,
})
);
const lists = env.model.getters.getListIds().map((listId, index) => {
return createFullMenuItem(`data_source_list_${listId}`, {
name: env.model.getters.getListDisplayName(listId),
sequence: 1010,
action: (child_env) => {
child_env.model.dispatch("SELECT_ODOO_LIST", {listId: listId});
child_env.openSidePanel("ListPanel", {});
},
icon: "fa fa-list",
separator: index === env.model.getters.getListIds().length - 1,
});
});
return children.concat(lists).concat([
createFullMenuItem(`refresh_all_data`, {
name: _t("Refresh all data"),
sequence: 110,
action: (child_env) => {
child_env.model.dispatch("REFRESH_ALL_DATA_SOURCES");
},
separator: true,
}),
]);
});

export class PivotPanelDisplay extends Component {
setup() {
this.dialog = useService("dialog");
onWillStart(this.modelData.bind(this));
onWillUpdateProps(this.modelData.bind(this));
}
async modelData() {
this.PivotDataSource = await this.env.model.getters.getAsyncPivotDataSource(
this.props.pivotId
);
this.modelLabel = await this.PivotDataSource.getModelLabel();
}
get domain() {
return new Domain(this.props.pivotDefinition.domain).toString();
}
get pivotDimensions() {
return [
...this.props.pivotDefinition.rowGroupBys,
...this.props.pivotDefinition.colGroupBys,
].map((fieldName) => this.PivotDataSource.getFormattedGroupBy(fieldName));
}
get sortInformation() {
const sortedColumn = this.props.pivotDefinition.sortedColumn;
const orderTranslate =
sortedColumn.order === "asc" ? _t("ascending") : _t("descending");
const GroupByDisplayLabel = this.PivotDataSource.getGroupByDisplayLabel(
"measure",
sortedColumn.measure
);
return `${GroupByDisplayLabel} (${orderTranslate})`;
}
get lastUpdate() {
const lastUpdate = this.PivotDataSource.lastUpdate;
if (lastUpdate) {
return time_to_str(new Date(lastUpdate));
}
return _t("not updated");
}
editDomain() {
this.dialog.add(DomainSelectorDialog, {
resModel: this.props.pivotDefinition.model,
initialValue: this.domain,
readonly: false,
isDebugMode: Boolean(this.env.debug),
onSelected: this.onSelectDomain.bind(this),
});
}
onSelectDomain(domain) {
this.env.model.dispatch("UPDATE_ODOO_PIVOT_DOMAIN", {
pivotId: this.props.pivotId,
domain: new Domain(domain).toList(),
});
}
async insertPivot() {
const datasourceModel = await this.env.model.getters
.getPivotDataSource(this.props.pivotId)
.copyModelWithOriginalDomain();
const tableStructure = datasourceModel.getTableStructure().export();
const selectedZone = this.env.model.getters.getSelectedZone();
this.env.model.dispatch("RE_INSERT_PIVOT", {
id: this.props.pivotId,
col: selectedZone.left,
row: selectedZone.top,
sheetId: this.env.model.getters.getActiveSheetId(),
table: tableStructure,
});
this.env.model.dispatch("REFRESH_PIVOT", {id: this.props.pivotId});
}
}

PivotPanelDisplay.template = "spreadsheet_oca.PivotPanelDisplay";
PivotPanelDisplay.components = {
DomainSelector,
};
PivotPanelDisplay.properties = {
pivotId: String,
pivotDefinition: Object,
};

export class PivotPanel extends Component {
get pivotId() {
return this.env.model.getters.getSelectedPivotId();
}
get pivotDefinition() {
return this.env.model.getters.getPivotDefinition(this.pivotId);
}
}

PivotPanel.template = "spreadsheet_oca.PivotPanel";
PivotPanel.components = {
PivotPanelDisplay,
};

sidePanelRegistry.add("PivotPanel", {
title: "Pivot table information",
Body: PivotPanel,
});

export class ListPanelDisplay extends Component {
setup() {
this.dialog = useService("dialog");
onWillStart(this.modelData.bind(this));
onWillUpdateProps(this.modelData.bind(this));
}
async modelData() {
this.ListDataSource = await this.env.model.getters.getAsyncListDataSource(
this.props.listId
);
this.modelLabel = await this.ListDataSource.getModelLabel();
}
get domain() {
return new Domain(this.props.listDefinition.domain).toString();
}
get lastUpdate() {
const lastUpdate = this.ListDataSource.lastUpdate;
if (lastUpdate) {
return time_to_str(new Date(lastUpdate));
}
return _t("not updated");
}
editDomain() {
this.dialog.add(DomainSelectorDialog, {
resModel: this.props.listDefinition.model,
initialValue: this.domain,
readonly: false,
isDebugMode: Boolean(this.env.debug),
onSelected: this.onSelectDomain.bind(this),
});
}
onSelectDomain(domain) {
this.env.model.dispatch("UPDATE_ODOO_LIST_DOMAIN", {
listId: this.props.listId,
domain: new Domain(domain).toList(),
});
}
}

ListPanelDisplay.template = "spreadsheet_oca.ListPanelDisplay";
ListPanelDisplay.components = {
DomainSelector,
};
ListPanelDisplay.properties = {
listId: String,
listDefinition: Object,
};

export class ListPanel extends Component {
get listId() {
return this.env.model.getters.getSelectedListId();
}
get listDefinition() {
return this.env.model.getters.getListDefinition(this.listId);
}
}

ListPanel.template = "spreadsheet_oca.ListPanel";
ListPanel.components = {
ListPanelDisplay,
};

sidePanelRegistry.add("ListPanel", {
title: "List information",
Body: ListPanel,
});
105 changes: 105 additions & 0 deletions spreadsheet_oca/static/src/spreadsheet/bundle/spreadsheet.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,110 @@
/>
</div>
</t>
<t t-name="spreadsheet_oca.PivotPanel" owl="1">
<PivotPanelDisplay pivotId="pivotId" pivotDefinition="pivotDefinition" />
</t>
<t t-name="spreadsheet_oca.PivotPanelDisplay" owl="1">
<div class="o_spreadsheet_oca_datasource_panel">
<div class="o_spreadsheet_oca_datasource_panel_field">
<div
class="o_spreadsheet_oca_datasource_panel_field_title"
>Pivot name</div>
<span t-esc="env.model.getters.getPivotDisplayName(props.pivotId)" />
</div>
<div class="o_spreadsheet_oca_datasource_panel_field">
<div class="o_spreadsheet_oca_datasource_panel_field_title">Model</div>
<div><t t-esc="modelLabel" /> (<t
t-esc="props.pivotDefinition.model"
/>)</div>
</div>
<div class="o_spreadsheet_oca_datasource_panel_field">
<div class="o_spreadsheet_oca_datasource_panel_field_title">Domain</div>
<DomainSelector
resModel="props.pivotDefinition.model"
value="domain"
t-key="'pivot_' + props.pivotId"
/>
<div class="btn btn-link" t-on-click="editDomain">
Edit domain
</div>
</div>
<div class="o_spreadsheet_oca_datasource_panel_field">
<div
class="o_spreadsheet_oca_datasource_panel_field_title"
>Dimensions</div>
<t t-foreach="pivotDimensions" t-as="dimension" t-key="dimension">
<div t-esc="dimension" />
</t>
</div>
<div
class="o_spreadsheet_oca_datasource_panel_field"
t-if="props.pivotDefinition.sortedColumn"
>
<div
class="o_spreadsheet_oca_datasource_panel_field_title"
>Sorting</div>
<div t-esc="sortInformation" />
</div>
<div class="o_spreadsheet_oca_datasource_panel_field">
<div
class="o_spreadsheet_oca_datasource_panel_field_title"
>Measures</div>
<t
t-foreach="props.pivotDefinition.measures"
t-as="measure"
t-key="measure"
>
<div t-esc="measure" />
</t>
</div>
<div class="o_spreadsheet_oca_pivot_panel_info">
Last updated at <t t-esc="lastUpdate" />
</div>
<div class="o_spreadsheet_oca_datasource_panel_field">
<button
t-on-click="insertPivot"
class="btn btn-info"
>Insert pivot</button>
</div>
</div>

</t>

<t t-name="spreadsheet_oca.ListPanel" owl="1">
<ListPanelDisplay listId="listId" listDefinition="listDefinition" />
</t>
<t t-name="spreadsheet_oca.ListPanelDisplay" owl="1">
<div class="o_spreadsheet_oca_datasource_panel">
<div class="o_spreadsheet_oca_datasource_panel_field">
<div
class="o_spreadsheet_oca_datasource_panel_field_title"
>List name</div>
<span t-esc="env.model.getters.getListDisplayName(props.listId)" />
</div>
<div class="o_spreadsheet_oca_datasource_panel_field">
<div class="o_spreadsheet_oca_datasource_panel_field_title">Model</div>
<div><t t-esc="modelLabel" /> (<t
t-esc="props.listDefinition.model"
/>)</div>
</div>
<div class="o_spreadsheet_oca_datasource_panel_field">
<div class="o_spreadsheet_oca_datasource_panel_field_title">Domain</div>
<DomainSelector
resModel="props.listDefinition.model"
value="domain"
t-key="'list_' + props.listId"
/>
<div class="btn btn-link" t-on-click="editDomain">
Edit domain
</div>
</div>
<div class="o_spreadsheet_oca_pivot_panel_info">
Last updated at <t t-esc="lastUpdate" />
</div>
</div>

</t>
<t t-name="spreadsheet_oca.FilterPanel" owl="1">
<div
t-foreach="env.model.getters.getGlobalFilters()"
Expand Down Expand Up @@ -143,6 +247,7 @@
resModel="object.model"
readonly="false"
isDebugMode="!!env.debug"
t-on-change="() => this.onChangeFieldSelector(ev)"
update="(name) => this.onFieldMatchUpdate(object, name)"
/>
</div>
Expand Down
Loading

0 comments on commit ce9802a

Please sign in to comment.