You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
329 lines
14 KiB
329 lines
14 KiB
/** @odoo-module **/
|
|
var core = require('web.core');
|
|
const rpc = require("web.rpc");
|
|
const Dialog = require('web.Dialog');
|
|
import { CommandPalette } from "@web/core/commands/command_palette";
|
|
import { patch } from 'web.utils';
|
|
import { useService } from "@web/core/utils/hooks";
|
|
var _t = core._t;
|
|
//Patching the CommandPalette for adding condition while using "!" command
|
|
patch(CommandPalette.prototype, 'text_commander/static/src/js/command_palette.js', {
|
|
setup() {
|
|
this._super()
|
|
this.action = useService("action");
|
|
},
|
|
//Here we patch the CommandPalette to access commands from the user
|
|
onKeyDown(ev) {
|
|
if (ev.key == 'Enter' && this.state.namespace == '!'){
|
|
var self = this
|
|
if (this.state.searchValue.split(" ")[0] == 'Open'){
|
|
const regex = /^Open.*\/.*$/;
|
|
const regex1 = /^Open.*(?:of|in).*$/;
|
|
const regex2 = /^Open.*/
|
|
var searchValue = this.state.searchValue
|
|
if (regex.test(searchValue)){
|
|
var parts = searchValue.split("/");
|
|
var model = parts[0].replace("Open ", "");
|
|
rpc.query({
|
|
model:'ir.model',
|
|
method:'check_model',
|
|
args:[model]
|
|
}).then(function(res){
|
|
if(res.length!=0){
|
|
self.model = res[0]['model']
|
|
self.model_name = res[0]['name']['en_US']
|
|
var data = {
|
|
'model':self.model,
|
|
'record':parts[1],
|
|
'regex':1,
|
|
}
|
|
rpc.query({
|
|
model:'ir.model',
|
|
method:'get_records',
|
|
args:[data]
|
|
}).then(function(res){
|
|
if (res.length !=1){
|
|
self.action.doAction({
|
|
name:self.model_name,
|
|
type: 'ir.actions.act_window',
|
|
res_model: self.model,
|
|
domain: [["id", "in", res]],
|
|
views: [[false, "list"], [false, "form"]],
|
|
view_mode: "list,form",
|
|
target: "current",
|
|
});
|
|
}
|
|
else{
|
|
self.action.doAction({
|
|
type: "ir.actions.act_window",
|
|
res_model: self.model,
|
|
views: [[false, 'form']],
|
|
target: 'current',
|
|
res_id:res[0]
|
|
});
|
|
}
|
|
self.props.close()
|
|
})
|
|
}
|
|
else{
|
|
self.props.close()
|
|
var buttons = [
|
|
{
|
|
text: _t("Ok"),
|
|
classes: 'btn-primary',
|
|
close: true,
|
|
},
|
|
];
|
|
new Dialog(self, {
|
|
size: 'medium',
|
|
buttons: buttons,
|
|
$content: $('<div>', {
|
|
text:model + _t(" model not found")
|
|
}),
|
|
}).open();
|
|
}
|
|
})
|
|
}
|
|
else if(regex1.test(searchValue)){
|
|
const pattern = /^Open\s(.*)\s(?:of|in).*$/
|
|
const match = searchValue.match(pattern);
|
|
if (match){
|
|
rpc.query({
|
|
model:'ir.model',
|
|
method:'check_model',
|
|
args:[match[1]]
|
|
}).then(function(res){
|
|
if (res.length!=0){
|
|
self.model = res[0]['model']
|
|
self._fields_check(self.model)
|
|
var data = {
|
|
'model':self.model,
|
|
}
|
|
}
|
|
else{
|
|
self.props.close()
|
|
var buttons = [
|
|
{
|
|
text: _t("Ok"),
|
|
classes: 'btn-primary',
|
|
close: true,
|
|
},
|
|
];
|
|
new Dialog(self, {
|
|
size: 'medium',
|
|
buttons: buttons,
|
|
$content: $('<div>', {
|
|
text:match[1] + _t(" model not found")
|
|
}),
|
|
}).open();
|
|
}
|
|
})
|
|
}
|
|
}
|
|
else if(regex2.test(searchValue)){
|
|
const reg = /^Open\s*/i;
|
|
const parts = searchValue.split(reg);
|
|
rpc.query({
|
|
model:'ir.model',
|
|
method:'check_model',
|
|
args:[parts[1]]
|
|
}).then(function(res){
|
|
if (res.length!=0){
|
|
self.action.doAction({
|
|
name:res[0]['name']['en_US'],
|
|
type: 'ir.actions.act_window',
|
|
res_model: res[0]['model'],
|
|
views: [[false, "list"], [false, "form"]],
|
|
view_mode: "list,form",
|
|
target: "current",
|
|
});
|
|
self.props.close();
|
|
}
|
|
else{
|
|
self.props.close()
|
|
var buttons = [
|
|
{
|
|
text: _t("Ok"),
|
|
classes: 'btn-primary',
|
|
close: true,
|
|
},
|
|
];
|
|
new Dialog(self, {
|
|
size: 'medium',
|
|
buttons: buttons,
|
|
$content: $('<div>', {
|
|
text:parts[1] + _t(" model not found")
|
|
}),
|
|
}).open();
|
|
}
|
|
})
|
|
|
|
}
|
|
else{
|
|
self.props.close()
|
|
var buttons = [
|
|
{
|
|
text: _t("Ok"),
|
|
classes: 'btn-primary',
|
|
close: true,
|
|
},
|
|
];
|
|
new Dialog(self, {
|
|
size: 'medium',
|
|
buttons: buttons,
|
|
$content: $('<div>', {
|
|
text:_t("not matching command")
|
|
}),
|
|
}).open();
|
|
}
|
|
}
|
|
else if(this.state.searchValue.split(" ")[0] == 'Create'){
|
|
const regex = /^Create.*/
|
|
const searchValue = this.state.searchValue
|
|
if (regex.test(searchValue)){
|
|
const reg = /^Create\s*/i;
|
|
const parts = searchValue.split(reg);
|
|
rpc.query({
|
|
model:'ir.model',
|
|
method:'check_model',
|
|
args:[parts[1]]
|
|
}).then(function(res){
|
|
if (res.length!=0){
|
|
self.action.doAction({
|
|
type: "ir.actions.act_window",
|
|
res_model: res[0]['model'],
|
|
views: [[false, 'form']],
|
|
target: 'current',
|
|
});
|
|
self.props.close();
|
|
}
|
|
else{
|
|
self.props.close()
|
|
var buttons = [
|
|
{
|
|
text: _t("Ok"),
|
|
classes: 'btn-primary',
|
|
close: true,
|
|
},
|
|
];
|
|
new Dialog(self, {
|
|
size: 'medium',
|
|
buttons: buttons,
|
|
$content: $('<div>', {
|
|
text:parts[1] + _t(" model not found")
|
|
}),
|
|
}).open();
|
|
}
|
|
})
|
|
}
|
|
else{
|
|
self.props.close()
|
|
var buttons = [
|
|
{
|
|
text: _t("Ok"),
|
|
classes: 'btn-primary',
|
|
close: true,
|
|
},
|
|
];
|
|
new Dialog(self, {
|
|
size: 'medium',
|
|
buttons: buttons,
|
|
$content: $('<div>', {
|
|
text:_t("command not found")
|
|
}),
|
|
}).open();
|
|
}
|
|
}
|
|
else{
|
|
self.props.close()
|
|
var buttons = [
|
|
{
|
|
text: _t("Ok"),
|
|
classes: 'btn-primary',
|
|
close: true,
|
|
},
|
|
];
|
|
new Dialog(self, {
|
|
size: 'medium',
|
|
buttons: buttons,
|
|
$content: $('<div>', {
|
|
text:_t("command not found")
|
|
}),
|
|
}).open();
|
|
}
|
|
}
|
|
},
|
|
//Check fields
|
|
_fields_check(model){
|
|
var self = this
|
|
const searchValue = this.state.searchValue
|
|
const pattern = /^Open\s.*\s(of|in)\s(.*)$/
|
|
const match = searchValue.match(pattern)
|
|
if (match){
|
|
const string = match[2].split(" ")
|
|
var field_string = ""
|
|
var data = {
|
|
'model':model,
|
|
'field_string':string,
|
|
'regex':2,
|
|
}
|
|
rpc.query({
|
|
model:'ir.model',
|
|
method:'check_fields_model',
|
|
args:[data]
|
|
}).then(function(res){
|
|
if (res.length!=0){
|
|
data['field_string'] = match[2].replace(res[0]['del'],"")
|
|
data['field'] = res[0]['name']
|
|
data['field_type'] = res[0]['ttype']
|
|
data['field_relation'] = res[0]['relation']
|
|
rpc.query({
|
|
model:'ir.model',
|
|
method:'get_records',
|
|
args:[data]
|
|
}).then(function(res){
|
|
self.action.doAction({
|
|
name:'Records',
|
|
type: 'ir.actions.act_window',
|
|
res_model: model,
|
|
domain: [["id", "in", res]],
|
|
views: [[false, "list"], [false, "form"]],
|
|
view_mode: "list,form",
|
|
target: "current",
|
|
})
|
|
})
|
|
self.props.close()
|
|
}
|
|
else{
|
|
self.props.close()
|
|
var buttons = [
|
|
{
|
|
text: _t("Ok"),
|
|
classes: 'btn-primary',
|
|
close: true,
|
|
},
|
|
];
|
|
new Dialog(self, {
|
|
size: 'medium',
|
|
buttons: buttons,
|
|
$content: $('<div>', {
|
|
text:_t("field not found")
|
|
}),
|
|
}).open();
|
|
}
|
|
})
|
|
}
|
|
},
|
|
//Executing the command
|
|
async executeCommand(command) {
|
|
if (this.state.namespace != '!'){
|
|
const config = await command.action();
|
|
if (config) {
|
|
this.setCommandPaletteConfig(config);
|
|
}
|
|
else {
|
|
this.props.close();
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|