ScreenDesigner

This commit is contained in:
jopster 2025-03-31 11:23:00 +02:00
parent 285777451a
commit 5a181ae12d
36 changed files with 523 additions and 52 deletions

View File

@ -45,6 +45,7 @@
'views/dss_zahlungen.xml', 'views/dss_zahlungen.xml',
'views/dss_web_contracts.xml', 'views/dss_web_contracts.xml',
'views/dss_invoices.xml', 'views/dss_invoices.xml',
'views/dss_m2mmail.xml',
'views/mainsystem_view.xml', 'views/mainsystem_view.xml',
'views/dss_importinvoicelist.xml', 'views/dss_importinvoicelist.xml',
'views/menu.xml', 'views/menu.xml',
@ -62,11 +63,19 @@
'web.assets_backend': [ 'web.assets_backend': [
'DigitalSignage/static/src/img/*', 'DigitalSignage/static/src/img/*',
'DigitalSignage/static/src/xml/screenDesignerView.xml', 'DigitalSignage/static/src/xml/screenDesignerView.xml',
'DigitalSignage/static/src/xml/dss_screenview_controller.xml',
'DigitalSignage/static/src/xml/dss_screenview_renderer.xml',
'DigitalSignage/static/src/js/dss_screenview_archparser.js',
'DigitalSignage/static/src/js/dss_screenview_controller.js',
'DigitalSignage/static/src/js/dss_screenview_renderer.js',
'DigitalSignage/static/src/js/dss_screenview_register.js',
'DigitalSignage/static/src/js/dss_screenview_model.js',
'DigitalSignage/static/src/js/form_label.js', 'DigitalSignage/static/src/js/form_label.js',
'DigitalSignage/static/src/js/form_button.js', 'DigitalSignage/static/src/js/form_button.js',
'DigitalSignage/static/src/js/kanban_button.js', 'DigitalSignage/static/src/js/kanban_button.js',
'DigitalSignage/static/src/xml/form_button.xml', 'DigitalSignage/static/src/xml/form_button.xml',
'DigitalSignage/static/src/js/dss_klistmanager.js', 'DigitalSignage/static/src/js/dss_klistmanager.js',
'DigitalSignage/static/src/js/screenDesignerViewReload.js',
'DigitalSignage/static/src/xml/form_label.xml', 'DigitalSignage/static/src/xml/form_label.xml',
], ],
'web.assets_common': [ 'web.assets_common': [

View File

@ -2,3 +2,4 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details. # Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import main from . import main
from . import dss_screendesigner_controller

View File

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import http
import os
import os.path
import base64
import logging
from odoo.http import request
_logger = logging.getLogger(__name__)
from odoo.tools.json import scriptsafe
class screendesignercontroller(http.Controller):
@http.route('/dss/displaydesigner/', auth='user', website=True, csrf=False)
def changeScreenTemplateView(self):
request.env.ref('DigitalSignage.dss_screenDesigner_action_dss_screenDesigner').run()
# odss_sales_order = http.request.env['sale.orders']
# new_so = odss_sales_order.create({
# 'delivery_Time': delivery_time,
# })
values = {
'project_url': partner_url,
'address': project.standort_strasse,
'projects_data': scriptsafe.dumps(projects_data),
'google_maps_api_key': google_maps_api_key,
}
return

View File

@ -26,4 +26,5 @@ from . import company
from . import dss_invoices from . import dss_invoices
from . import dss_importinvoicelist from . import dss_importinvoicelist
from . import dss_web_contracts from . import dss_web_contracts
from . import dss_m2mmail

Binary file not shown.

View File

@ -331,3 +331,30 @@ class dssscreendesign(models.Model):
def get_data(self): def get_data(self):
outlist = {'uuid' : 2222} outlist = {'uuid' : 2222}
return outlist return outlist
def myscreenrebuild(self):
_logger.info('inside Screenrebuild')
return {
'type': 'ir.actions.client',
'name': 'reload',
'context' : {'screenlayout': 1},
'tag': 'dss_screenDesigner_js_action'
}
class View(models.Model):
"""
Extends the base 'ir.ui.view' model to include a new type of view
called 'grid'.
"""
_inherit = 'ir.ui.view'
type = fields.Selection(selection_add=[('screenview', "ScreenView")])
class IrActionsActWindowView(models.Model):
"""
Extends the base 'ir.actions.act_window.view' model to include
a new view mode called 'grid'.
"""
_inherit = 'ir.actions.act_window.view'
view_mode = fields.Selection(selection_add=[('screenview', "ScreenView")],
ondelete={'screenview': 'cascade'})

View File

@ -48,7 +48,7 @@ class dssadvertisefields(models.Model):
# uuid = fields.Char('UUID', required=True, translate=True) # uuid = fields.Char('UUID', required=True, translate=True)
templatefeldname = fields.Char('Template Feldname', required=True,tracking=True) templatefeldname = fields.Char('Template Feldname', required=True,tracking=True)
display = fields.Char('Ziel Feldname',tracking=True) display = fields.Char('Ziel Feldname',tracking=True)
displaytemplate = fields.Many2one('dss.display.templates',String="Display Vorlage",tracking=True) displaytemplate = fields.Many2one('dss.display.templates',string="Display Vorlage",tracking=True)
feldname = fields.Char('Ziel Feldname', required=True,tracking=True) feldname = fields.Char('Ziel Feldname', required=True,tracking=True)
color_used = fields.Char(string='Color Index',tracking=True) color_used = fields.Char(string='Color Index',tracking=True)
color_unused = fields.Char(string='Color Index',tracking=True) color_unused = fields.Char(string='Color Index',tracking=True)
@ -106,3 +106,15 @@ class dssadvertisefields(models.Model):
@api.model @api.model
def _default_uuid(self): def _default_uuid(self):
return str(uuid.uuid4()) return str(uuid.uuid4())
@api.model
def get_data(self,template):
if not template:
template = 1
alldata = self.env['dss.advertisefields.templates'].search([('displaytemplate',"=",template)])
outlist = []
self.env["confirmation.wizard"].with_context(hide_cancel=True).confirm_no_action_message(message="Debug : "+str(len(alldata))+"/"+str(alldata),title="Notification")
_logger.info("Screendesigner DataRequest : " + str(len(alldata))+"/"+str(alldata))
for data in alldata:
outlist.append({'uuid' : data.uuid,'pos_x':data.btn_pos_x,'pos_y':data.btn_pos_y,'pos_w':data.btn_pos_w,'pos_h':data.btn_pos_h,'feldname':data.feldname})
return outlist

View File

@ -776,8 +776,8 @@ class dsscontracts(models.Model):
kampagnen=self.env['dss.ads'].search([('contract','=',self.id)]) kampagnen=self.env['dss.ads'].search([('contract','=',self.id)])
_logger.info('Prüfe Medien : C_'+str(self.id)+' alle Kamp : '+str(kampagnen)) _logger.info('Prüfe Medien : C_'+str(self.id)+' alle Kamp : '+str(kampagnen))
for kamp in kampagnen: for kamp in kampagnen:
_logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)) _logger.info('Prüfe Medien : C_'+str(self.id)+'A_'+str(kamp.id)+' - P_'+str(kamp.parent_ad))
if kamp: if kamp:
mediaids = [] mediaids = []
medias = self.env['dss.mediarelations'].search([('ad','=',kamp.id)]) medias = self.env['dss.mediarelations'].search([('ad','=',kamp.id)])
if not medias: if not medias:
@ -859,8 +859,9 @@ class dsscontracts(models.Model):
'target':'current', 'target':'current',
'context':'{"kampagne_id":'+str(kampagne.id)+',"show_project_update":True}', 'context':'{"kampagne_id":'+str(kampagne.id)+',"show_project_update":True}',
'context':'', 'context':'',
'res_id':kampagne.id, 'res_id':self.ads_last_ad.id,
'display_name' : 'Änderung zur Werbekampagne '+kampagne.parent_ad.adname, #kampagne.id,
# 'display_name' : 'Änderung zur Werbekampagne '+kampagne.parent_ad.adname,
'domain':'[("id","=","context[kampagne_id]")]' 'domain':'[("id","=","context[kampagne_id]")]'
} }
def setFirstKampagne(self): def setFirstKampagne(self):

View File

@ -48,7 +48,8 @@ class dssadvertisefields(models.Model):
# uuid = fields.Char('UUID', required=True, translate=True) # uuid = fields.Char('UUID', required=True, translate=True)
displayname = fields.Char('Template Feldname', required=True,tracking=True) displayname = fields.Char('Template Feldname', required=True,tracking=True)
feldtemplates = fields.Many2many('dss.advertisefields.templates' , string='Vertrag', store=True,tracking=True) feldtemplates = fields.Many2many('dss.advertisefields.templates' , string='Vertrag', store=True,tracking=True)
fullsize_w = fields.Integer("Auflösung Breite",tracking=True)
fullsize_h = fields.Integer("Auflösung Höhe",tracking=True)
def _default_create_date(self): def _default_create_date(self):
return str(date.today()) return str(date.today())
@ -59,3 +60,15 @@ class dssadvertisefields(models.Model):
@api.model @api.model
def _default_uuid(self): def _default_uuid(self):
return str(uuid.uuid4()) return str(uuid.uuid4())
@api.model
def get_data(self):
alldata = self.env['dss.display.templates'].search([])
outlist = []
self.env["confirmation.wizard"].with_context(hide_cancel=True).confirm_no_action_message(message="Debug : "+str(len(alldata))+"/"+str(alldata),title="Notification")
_logger.info("Screendesigner Displaydata DataRequest : " + str(len(alldata))+"/"+str(alldata))
a = 0
for data in alldata:
a += 1
outlist.append({'uuid' : data.uuid,'displayname':data.displayname,'fullsizew':data.fullsize_w,'fullsizeh':data.fullsize_w,'nr':a})
return outlist

14
models/dss_m2mmail.py Normal file
View File

@ -0,0 +1,14 @@
from odoo import api, fields, models, _
from odoo import tools
class dssm2mvalues(models.Model):
_name = "dss.m2mmail"
_description = "DigitalSignage M2M Rückmeldungen"
# _rec_name = "statusname"
_inherit = ['mail.thread', 'mail.activity.mixin']
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
@api.model
def _default_uuid(self):
return str(uuid.uuid4())

View File

@ -138,7 +138,7 @@ class dsstriggergroups(models.Model):
def run_triggers(self, changes, Dataset, triggers): def run_triggers(self, changes, Dataset, triggers):
_logger.info("Trigger in run_triggers ! - start count :"+str(len(triggers)) ) _logger.info("Trigger in run_triggers ! - start count :"+str(len(triggers)) )
for trig in triggers: for trig in triggers:
_logger.info("Trigger in run_triggers - Working on : "+str(trig.id)) _logger.info("Trigger in run_triggers - Working on : "+str(trig.triggername)+'('+str(trig.id)+')')
dochecktrigger = False dochecktrigger = False
if (changes == False): if (changes == False):

View File

@ -168,8 +168,9 @@ class dsscontracts(models.Model):
'contract_name': self.contract_name, 'contract_name': self.contract_name,
'contract_state': self.env['dss.contractstate'].search([("statusname","=","Angelegt")]).id, 'contract_state': self.env['dss.contractstate'].search([("statusname","=","Angelegt")]).id,
'werbe_feld_selected': self.werbe_feld_selected, 'werbe_feld_selected': self.werbe_feld_selected,
'client': self.client.id, 'client': self.client,
'client_short_vorname': self.client_short_vorname, 'client_short_vorname': self.client_short_vorname,
'client_short_name': self.client_short_name,
'client_short_email': self.client_short_email, 'client_short_email': self.client_short_email,
'client_short_telefon': self.client_short_telefon, 'client_short_telefon': self.client_short_telefon,
'client_short_mobil': self.client_short_mobil, 'client_short_mobil': self.client_short_mobil,

View File

@ -45,3 +45,4 @@ DigitalSignage_dss_activity_mixin,access.dss.activity_mixin,DigitalSignage.model
DigitalSignage_dss_triggermodel,access.dss.triggermodel,DigitalSignage.model_dss_triggermodel,base.group_user,1,0,0,0 DigitalSignage_dss_triggermodel,access.dss.triggermodel,DigitalSignage.model_dss_triggermodel,base.group_user,1,0,0,0
DigitalSignage_dss_invoices,access.dss.invoices,DigitalSignage.model_dss_invoices,base.group_user,1,1,1,1 DigitalSignage_dss_invoices,access.dss.invoices,DigitalSignage.model_dss_invoices,base.group_user,1,1,1,1
DigitalSignage_dss_onlinestate,access.dss.onlinestate,DigitalSignage.model_dss_onlinestate,base.group_user,1,1,1,1 DigitalSignage_dss_onlinestate,access.dss.onlinestate,DigitalSignage.model_dss_onlinestate,base.group_user,1,1,1,1
DigitalSignage_dss_m2mmail,access.dss.m2mmail,DigitalSignage.model_dss_m2mmail,base.group_user,1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
45 DigitalSignage_dss_triggermodel access.dss.triggermodel DigitalSignage.model_dss_triggermodel base.group_user 1 0 0 0
46 DigitalSignage_dss_invoices access.dss.invoices DigitalSignage.model_dss_invoices base.group_user 1 1 1 1
47 DigitalSignage_dss_onlinestate access.dss.onlinestate DigitalSignage.model_dss_onlinestate base.group_user 1 1 1 1
48 DigitalSignage_dss_m2mmail access.dss.m2mmail DigitalSignage.model_dss_m2mmail base.group_user 1 1 1 1

View File

@ -0,0 +1,60 @@
/** @odoo-module */
import { XMLParser } from "@web/core/utils/xml";
export class ScreenViewArchParser extends XMLParser {
parse(arch, fields = {}) {
const archInfo = { fields, fieldAttrs: {}, groupBy: [] };
this.visitXML(arch, (node) => {
switch (node.tagName) {
case "field": {
alert('Field')
const fieldName = node.getAttribute("name"); // exists (rng validation)
if (fieldName === "id") {
break;
}
const string = node.getAttribute("string");
if (string) {
if (!archInfo.fieldAttrs[fieldName]) {
archInfo.fieldAttrs[fieldName] = {};
}
archInfo.fieldAttrs[fieldName].string = string;
}
const modifiers = JSON.parse(node.getAttribute("modifiers") || "{}");
if (modifiers.invisible === true) {
if (!archInfo.fieldAttrs[fieldName]) {
archInfo.fieldAttrs[fieldName] = {};
}
archInfo.fieldAttrs[fieldName].isInvisible = true;
break;
}
const isMeasure = node.getAttribute("type") === "measure";
if (isMeasure) {
// the last field with type="measure" (if any) will be used as measure else __count
archInfo.measure = fieldName;
} else {
const { type } = archInfo.fields[fieldName]; // exists (rng validation)
if (GROUPABLE_TYPES.includes(type)) {
let groupBy = fieldName;
const interval = node.getAttribute("interval");
if (interval) {
groupBy += `:${interval}`;
}
archInfo.groupBy.push(groupBy);
}
}
break;
}
}
});
return archInfo;
}
}
// parse(arch) {
// const xmlDoc = this.parseXML(arch);
// const fieldFromTheArch = xmlDoc.getAttribute("fieldFromTheArch");
// return {
// fieldFromTheArch,
// };
// }
//}

View File

@ -0,0 +1,28 @@
/** @odoo-module **/
import { Layout } from "@web/search/layout";
import {useService } from "@web/core/utils/hooks";
import { Component, onWillStart, useState} from "@odoo/owl";
export class ScreenViewController extends Component {
setup() {
this.orm = useService("orm");
// The controller create the model and make it reactive so whenever this.model is
// accessed and edited then it'll cause a rerendering
this.model = useState(
new this.props.Model(
this.orm,
this.props.resModel,
this.props.fields,
this.props.archInfo,
this.props.domain
)
);
onWillStart(async () => {
await this.model.load();
});
}
};
ScreenViewController.template = "dss.screenview";
ScreenViewController.components = { Layout };

View File

@ -0,0 +1,24 @@
/** @odoo-module **/
import { KeepLast } from "@web/core/utils/concurrency";
export class ScreenViewModel {
constructor(orm, resModel, fields, archInfo, domain) {
this.orm = orm;
this.resModel = resModel;
// We can access arch information parsed by the beautiful arch parser
const { fieldFromTheArch } = archInfo;
this.fieldFromTheArch = fieldFromTheArch;
this.fields = fields;
this.domain = domain;
this.keepLast = new KeepLast();
}
async load() {
//The keeplast protect against concurrency call
const { length, records } = await this.keepLast.add(
this.orm.webSearchRead(this.resModel, this.domain, [this.fieldFromTheArch], {})
);
this.records = records;
this.recordsLength = length;
}
}

View File

@ -0,0 +1,40 @@
/** @odoo-module **/
import { _lt } from "@web/core/l10n/translation";
import { registry } from "@web/core/registry";
import {ScreenViewRenderer} from "./dss_screenview_renderer";
import {ScreenViewController} from "./dss_screenview_controller";
import {ScreenViewArchParser} from "./dss_screenview_archparser";
import {ScreenViewModel} from "./dss_screenview_model";
//import {GridRelationalModel} from "./grid_relational_model";
export const ScreenView = {
type: "screenview",
display_name: _lt("ScreenView"),
icon: "fa fa-th",
multiRecord: true,
Controller: ScreenViewController,
Renderer: ScreenViewRenderer,
ArchParser: ScreenViewArchParser,
Model: ScreenViewModel,
/**
* Function that returns the props for the grid view.
* @param {object} genericProps - Generic properties of the view.
* @param {object} view - The view object.
* @returns {object} Props for the grid view.
*/
props: (genericProps, view) => {
const {ArchParser,Model,Renderer} = view;
//const {arch,relatedModels,resModel} = genericProps;
const {arch, fields, resModel } = genericProps;
//const archInfo = new ArchParser().parse(arch, relatedModels, resModel);
const archInfo = parser.parse(arch, fields);
return {
...genericProps,
archInfo,
Model: view.Model,
Renderer,
};
}
};
// Register the grid view configuration
registry.category("views").add("screenview", ScreenView);

View File

@ -0,0 +1,8 @@
/** @odoo-module **/
import { Component } from "@odoo/owl";
export class ScreenViewRenderer extends Component {
async setup() {
}
}
ScreenViewRenderer.template = "dss.screenviewrenderer";

View File

@ -11,17 +11,47 @@ var _t = core._t;
var rpc = require('web.rpc'); var rpc = require('web.rpc');
var self = this; var self = this;
var session = require('web.session'); var session = require('web.session');
var viewRegistry = require('web.view_registry');
var aktcontext = "";
function _onclickevent(event) {
// Check if the clicked element has the class "button"
if (event.target.classList.contains("ddbtn")) {
alert(JSON.stringify($(event.currentTarget)))
};
};
function _onchangeevent(event) {
// Check if the clicked element has the class "button"
if (event.target.classList.contains("ddown")) {
// Your event handler code
// here
// alert($(this))
// alert(event.target.value)
// alert(JSON.stringify($(event.target.value)))
aktcontext.context.screenlayout = event.target.value
alert(aktcontext);
rpc.query({model: 'dss.screendesign',
method: 'myscreenrebuild',
args: [this.res_id],
}).then(function (result) {
alert(JSON.stringify(result));
event.do_action(result);
return result;
});
}
};
var screenDesigner = AbstractAction.extend({ var screenDesigner = AbstractAction.extend({
contentTemplate: 'dssscreenDesignerView', contentTemplate: 'screen_view.ScreenView',
init: function(parent, context) { init: function(parent, context) {
this._super(parent, context); this._super(parent, context);
aktcontext = context;
this.dashboard_templates = ['MainSection']; this.dashboard_templates = ['MainSection'];
}, },
start: function() { start: function() {
var self = this; var self = this;
alert(aktcontext.context.screenlayout);
this.set("title", 'Dashboard'); this.set("title", 'Dashboard');
return this._super().then(function() { return this._super().then(function() {
self.render_dashboards(); self.render_dashboards();
@ -33,31 +63,67 @@ var screenDesigner = AbstractAction.extend({
}, },
render_dashboards: function() { render_dashboards: function() {
var self = this; var self = this;
this.fetch_data() var meins = "";
var templates = [] var templates = []
var templates = ['MainSection']; var templates = ['MainSection'];
_.each(templates, function(template) {
self.$('.o_hr_dashboard').append(QWeb.render(template, {widget: self})) var def0 =this._rpc({
}); model: 'dss.display.templates',
}, method: "get_data",
fetch_data: function() { args: [],
var self = this }).then(function (result) {
// fetch data to the tiles
var def1 = this._rpc({ var $dropdown = document.querySelector('.ddown')
model: 'dss.screendesign',
method: "get_data", if (result.length>0) {
}) result.forEach(element => {
.then(function (result) {
$('#product_templates').append('<span>' + result.uuid + '</span>'); $dropdown.append(new Option(element.displayname, element.nr));
$('#variants_count').append('<span>' + result.uuid + '</span>'); })
$('#products_storable').append('<span>' + result.uuid + '</span>'); }
$('#product_consumable').append('<span>' + result.uuid + '</span>');
}); _.each(templates, function(template) {self.$('.meinfeld').append(meins)});
})
document.addEventListener("click",_onclickevent)
document.addEventListener("change",_onchangeevent)
var def1 =this._rpc({
model: 'dss.advertisefields.templates',
method: "get_data",
args: [[aktcontext.context.screenlayout]],
}).then(function (result) {
var displaycss = 'background-color:#38AFA0;float:left;border-style: solid;border-width: 0.1px;'
const element = document.querySelector('.meincanvas')
const rect = element.getBoundingClientRect();
const topPosition = rect.top + window.scrollY;
var topstart = topPosition + 60
var width = window.innerWidth-40;
var scale_faktor = (width / 3860)
var height = Math.round(2200 * scale_faktor)
meins = '<div style="background-color:#000000;padding:20px;height:'+height+'px;floating:left">'
if (result.length>0) {
result.forEach(element => {
var ele_pos_x=element.pos_x*scale_faktor+20
var ele_pos_y=element.pos_y*scale_faktor+topstart
var ele_pos_h=element.pos_h*scale_faktor
var ele_pos_w=element.pos_w*scale_faktor
meins = meins + '<div class="ddbtn" style="'+displaycss+'position:absolute;left:'+ele_pos_x+'px;top:'+ele_pos_y+'px;width:'+ele_pos_w+'px;height:'+ele_pos_h+'px;">'+element.feldname+'</div>'
});
}
// meins = meins + '<div style="'+displaycss+'width:200px;height:100px;">'+result.length+'</div>'
// meins = meins + '<div style="'+displaycss+'width:300px;height:100px;">'+result+'</div>'
// meins = meins + '<div style="'+displaycss+'width:100px;height:100px;">'+JSON.stringify(result)+'</div></div>'
_.each(templates, function(template) {self.$('.o_hr_dashboard').append(meins)});
})
}, },
}); });
core.action_registry.add('dss_screenDesigner_js_action', screenDesigner); core.action_registry.add('dss_screenDesigner_js_action', screenDesigner);
viewRegistry.add('ScreenDesigner', screenDesigner);
return screenDesigner; return screenDesigner;
}); });

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<templates xml:space="preserve">
<t t-name="dss.screenview" owl="1">
<Layout display="props.display" className="'h-100 overflow-auto'">
<t t-component="props.Renderer" records="model.records" propsYouWant="'Hello world'"/>
<p>Test</p>
</Layout>
</t>
</templates>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" ?>
<templates xml:space="preserve">
<t t-name="dss.screenviewrenderer" owl="1">
<t t-esc="props.propsYouWant"/>
<t t-foreach="props.records" t-as="record" t-key="record.id">
// Show records
</t>
</t>
</templates>

View File

@ -1,35 +1,28 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<templates xml:space="preserve"> <templates xml:space="preserve">
<t t-name="dssscreenDesignerView"> <t t-name="screen_view.ScreenView">
<div class="o_action o_view_controller o_kanban_view o_hr_dashboard"> <div class="o_action o_view_controller o_kanban_view o_hr_dashboard">
<div class="bottom-bar ms-4" data-bottombar="cookieMessage" id="rcorner1"> <div class="bottom-bar ms-4" data-bottombar="cookieMessage" id="rcorner1">
<div class="bottom-bar__header"> <div class="bottom-bar__header">
<div class="bottom-bar__text">
<p class="bottom-bar__text">Feldübersicht</p>
</div>
<button class="bottom-bar__close" type="button" data-bottombar-close="cookieMessage">&times;</button>
</div> </div>
<div class="bottom-bar__content_2"> <div class="bottom-bar__content_2">
<span class="meinfeld">Displayvorlage :</span>
<select type="text" name="displaytemplate" class="form-control ddown">
</select>
</div>
<div class="bottom-bar__content_3">
<span>test</span>
</div> </div>
</div> </div>
</div> </div>
<span class="meincanvas"/>
</t> </t>
<t t-name="MainSection"> <t t-name="screen_view.ScreenViewRenderer" owl="1">
<section class="ScreenDesigner_Main" id="main_section"> <div id="product_templates">
<div class="col-sm-12 mb-4"> <h2 class="section-header">Feld - Designer</h2>
<div class="row"> </div>
<div class="col-12 col-sm-12 col-md-8 ms-4 mt-4">
<h2 class="section-header">Feld - Designer</h2>
</div>
</div>
<!-- Tiles -->
<span id="templates">
<div id="product_templates"/>
</span>
</div>
</section>
</t> </t>
</templates> </templates>

View File

@ -105,7 +105,7 @@
</record> </record>
<record id="action_dss_advertisefields_templates_view" model="ir.actions.act_window"> <record id="action_dss_advertisefields_templates_view" model="ir.actions.act_window">
<field name="name">DigitalSignage Werbefelder</field> <field name="name">DigitalSignage Werbefeld Vorlagen</field>
<field name="type">ir.actions.act_window</field> <field name="type">ir.actions.act_window</field>
<field name="res_model">dss.advertisefields.templates</field> <field name="res_model">dss.advertisefields.templates</field>
<field name="view_mode">tree,form</field> <field name="view_mode">tree,form</field>

View File

@ -8,6 +8,8 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree string="Werbefeld Templates" multi_edit="1" edit="1"> <tree string="Werbefeld Templates" multi_edit="1" edit="1">
<field name="displayname"/> <field name="displayname"/>
<field name="fullsize_w"/>
<field name="fullsize_h"/>
</tree> </tree>
</field> </field>
</record> </record>
@ -18,9 +20,22 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<form> <form>
<sheet> <sheet>
<group name="basethings"> <notebook>
<field name="displayname"/> <page string="Einstellungen">
</group> <group name="basethings">
<field name="displayname"/>
</group>
<group name="basethings" string="Auflösung">
<field name="fullsize_w"/>
<field name="fullsize_h"/>
</group>
</page>
<page String="Inhalte">
<group name="members">
<field name="feldtemplates"/>
</group>
</page>
</notebook>
</sheet> </sheet>
<div class="oe_chatter"> <div class="oe_chatter">
<field name="message_follower_ids" options="{'post_refresh':True}" help="Follow this project to automatically track the events associated to tasks and issues of this project." groups="base.group_user"/> <field name="message_follower_ids" options="{'post_refresh':True}" help="Follow this project to automatically track the events associated to tasks and issues of this project." groups="base.group_user"/>

50
views/dss_m2mmail.xml Normal file
View File

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="action_dss_main_m2mmail" model="ir.actions.act_window">
<field name="name">DigitalSignage Alle M2M Nachrichten</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">dss.m2mmail</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
No Contracts/Clients found. Let's create one!
</p>
<p>
Keep track of the progress of your contracts from creation to completion.<br/>
Collaborate efficiently by chatting in real-time or via email.
</p>
</field>
</record>
<record id="dss_main_m2mmail_tree" model="ir.ui.view">
<field name="name">dss_m2mmail_tree</field>
<field name="model">dss.m2mmail</field>
<field name="priority" eval="17"/>
<field name="arch" type="xml">
<tree string="Vertragsuebersicht">
</tree>
</field>
</record>
<record id="dss_main_m2mmail_form" model="ir.ui.view">
<field name="name">dss_main_m2mmail_form</field>
<field name="model">dss.m2mmail</field>
<field eval="2" name="priority"/>
<field name="arch" type="xml">
<form>
<sheet>
<group name="interval" string="Intervaldaten">
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" options="{'post_refresh':True}" help="Follow this project to automatically track the events associated to tasks and issues of this project." groups="base.group_user"/>
<field name="activity_ids"/>
<field name="message_ids"/>
</div>
</form>
</field>
</record>
</odoo>

View File

@ -3,8 +3,42 @@
<record id="dss_screenDesigner_action_dss_screenDesigner" model="ir.actions.client"> <record id="dss_screenDesigner_action_dss_screenDesigner" model="ir.actions.client">
<field name="name">Attendance</field> <field name="name">Attendance</field>
<field name="context">{
'screenlayout': 1,
}
</field>
<field name="tag">dss_screenDesigner_js_action</field> <field name="tag">dss_screenDesigner_js_action</field>
</record> </record>
<record id="action_dss_screenDesigner_view_ScreenViewdesigner" model="ir.ui.view">
<field name="name">My Grid View</field>
<field name="model">dss.screendesign</field>
<field name="arch" type="xml">
<screenview string="My Grid View" fieldFromTheArch="dss.screendesign">
<!-- Add your columns here -->
<field name="screenname"/>
</screenview>
</field>
</record>
<record id="record_id_view_grid" model="ir.actions.act_window.view">
<field name="sequence" eval="1"/>
<field name="view_mode">screenview</field>
<field name="view_id" ref="DigitalSignage.action_dss_screenDesigner_view_ScreenViewdesigner"/>
<field name="act_window_id" ref=""/>
</record>
<record id="action_dss_screenDesigner_view" model="ir.actions.act_window">
<field name="name">DigitalSignage ScreenDesign</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">screenview</field>
<field name="res_model">dss.screendesign</field>
<field name="context">{}</field>
<field name="help" type="html">
<p class="'o_view_nocontent_smiling_face">
Neuen Systemtyp erstellen
</p>
</field>
</record>
</odoo> </odoo>

View File

@ -414,18 +414,31 @@
sequence="10"/> sequence="10"/>
<menuitem <menuitem
id="menu_dss_dcreendesign" id="menu_dss_screendesign"
name="Screendesigner Tool" name="Screendesigner Tool"
parent="menu_dss_interntools" parent="menu_dss_interntools"
action="dss_screenDesigner_action_dss_screenDesigner" action="dss_screenDesigner_action_dss_screenDesigner"
sequence="20"/> sequence="20"/>
<menuitem
id="menu_dss_screendesign_view"
name="Screendesigner View"
parent="menu_dss_interntools"
action="action_dss_screenDesigner_view"
sequence="30"/>
<menuitem <menuitem
id="menu_dss_Nachrichten" id="menu_dss_Nachrichten"
name="Mail Nachrichten" name="Mail Nachrichten"
parent="menu_dss_interntools" parent="menu_dss_interntools"
action="mail.action_view_mail_message" action="mail.action_view_mail_message"
sequence="30"/> sequence="30"/>
<menuitem
id="menu_dss_interntools_mailsep"
name="EMails"
parent="menu_dss_interntools"
sequence="39"/>
<menuitem <menuitem
id="menu_dss_importInvoicelist" id="menu_dss_importInvoicelist"
@ -434,6 +447,13 @@
action="action_dss_importInvoicelist" action="action_dss_importInvoicelist"
sequence="40"/> sequence="40"/>
<menuitem
id="menu_dss_m2mmaillist"
name="M2M Simnachrichten"
parent="menu_dss_interntools"
action="action_dss_main_m2mmail"
sequence="50"/>
<menuitem <menuitem
id="menu_dss_contracts_ads_topics" id="menu_dss_contracts_ads_topics"
name="Werbethemen TV verwalten" name="Werbethemen TV verwalten"