mirror of
https://github.com/OCA/web.git
synced 2025-02-22 13:21:25 +02:00
[MIG] web_widget_text_markdown: Migration to 11.0
This commit is contained in:
@@ -1,328 +0,0 @@
|
||||
.oe_form_field_markdown {
|
||||
text-overflow: ellipsis;
|
||||
/* display: inline-block;
|
||||
white-space: pre-wrap;
|
||||
overflow-x: hidden; */
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.markdown-body thead th:first-child {
|
||||
border-left: 1px solid #ddd !important;
|
||||
}
|
||||
|
||||
.oe_form_text_markdown pre {
|
||||
background-color: #333;
|
||||
padding: 10px;
|
||||
}
|
||||
.md-editor.md-fullscreen-mode .md-input,
|
||||
.md-editor.md-fullscreen-mode .md-preview {
|
||||
font-size: 13px!important;
|
||||
}
|
||||
.md-editor.md-fullscreen-mode {
|
||||
margin-top: 50px;
|
||||
}
|
||||
.md-editor.md-fullscreen-mode .md-header {
|
||||
top: 70px;
|
||||
}
|
||||
.markdown-body {
|
||||
font-size: 15px;
|
||||
line-height: 1.7;
|
||||
overflow: hidden;
|
||||
}
|
||||
.markdown-body > *:first-child {
|
||||
margin-top: 0 !important;
|
||||
}
|
||||
.markdown-body > *:last-child {
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
.markdown-body a.absent {
|
||||
color: #c00;
|
||||
}
|
||||
.markdown-body a.anchor {
|
||||
display: block;
|
||||
padding-left: 30px;
|
||||
margin-left: -30px;
|
||||
cursor: pointer;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
.markdown-body h1,
|
||||
.markdown-body h2,
|
||||
.markdown-body h3,
|
||||
.markdown-body h4,
|
||||
.markdown-body h5,
|
||||
.markdown-body h6 {
|
||||
margin: 1em 0 15px;
|
||||
padding: 0;
|
||||
font-weight: bold;
|
||||
line-height: 1.7;
|
||||
cursor: text;
|
||||
position: relative;
|
||||
}
|
||||
.markdown-body h1 .octicon-link,
|
||||
.markdown-body h2 .octicon-link,
|
||||
.markdown-body h3 .octicon-link,
|
||||
.markdown-body h4 .octicon-link,
|
||||
.markdown-body h5 .octicon-link,
|
||||
.markdown-body h6 .octicon-link {
|
||||
display: none;
|
||||
color: #000;
|
||||
}
|
||||
.markdown-body h1:hover a.anchor,
|
||||
.markdown-body h2:hover a.anchor,
|
||||
.markdown-body h3:hover a.anchor,
|
||||
.markdown-body h4:hover a.anchor,
|
||||
.markdown-body h5:hover a.anchor,
|
||||
.markdown-body h6:hover a.anchor {
|
||||
text-decoration: none;
|
||||
line-height: 1;
|
||||
padding-left: 0;
|
||||
margin-left: -22px;
|
||||
top: 15%;
|
||||
}
|
||||
.markdown-body h1:hover a.anchor .octicon-link,
|
||||
.markdown-body h2:hover a.anchor .octicon-link,
|
||||
.markdown-body h3:hover a.anchor .octicon-link,
|
||||
.markdown-body h4:hover a.anchor .octicon-link,
|
||||
.markdown-body h5:hover a.anchor .octicon-link,
|
||||
.markdown-body h6:hover a.anchor .octicon-link {
|
||||
display: inline-block;
|
||||
}
|
||||
.markdown-body h1 tt,
|
||||
.markdown-body h1 code,
|
||||
.markdown-body h2 tt,
|
||||
.markdown-body h2 code,
|
||||
.markdown-body h3 tt,
|
||||
.markdown-body h3 code,
|
||||
.markdown-body h4 tt,
|
||||
.markdown-body h4 code,
|
||||
.markdown-body h5 tt,
|
||||
.markdown-body h5 code,
|
||||
.markdown-body h6 tt,
|
||||
.markdown-body h6 code {
|
||||
font-size: inherit;
|
||||
}
|
||||
.markdown-body h1 {
|
||||
font-size: 2.5em;
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
.markdown-body h2 {
|
||||
font-size: 2em;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
.markdown-body h3 {
|
||||
font-size: 1.5em;
|
||||
}
|
||||
.markdown-body h4 {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
.markdown-body h5 {
|
||||
font-size: 1em;
|
||||
}
|
||||
.markdown-body h6 {
|
||||
color: #777;
|
||||
font-size: 1em;
|
||||
}
|
||||
.markdown-body p,
|
||||
.markdown-body blockquote,
|
||||
.markdown-body ul,
|
||||
.markdown-body ol,
|
||||
.markdown-body dl,
|
||||
.markdown-body table,
|
||||
.markdown-body pre {
|
||||
margin: 15px 0;
|
||||
}
|
||||
.markdown-body hr {
|
||||
border: 0 none;
|
||||
color: #ccc;
|
||||
height: 4px;
|
||||
padding: 0;
|
||||
margin: 15px 0;
|
||||
}
|
||||
.markdown-body li p.first {
|
||||
display: inline-block;
|
||||
}
|
||||
.markdown-body ul,
|
||||
.markdown-body ol {
|
||||
padding-left: 30px;
|
||||
}
|
||||
.markdown-body ul.no-list,
|
||||
.markdown-body ol.no-list {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
}
|
||||
.markdown-body ul ul,
|
||||
.markdown-body ul ol,
|
||||
.markdown-body ol ol,
|
||||
.markdown-body ol ul {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.markdown-body dl {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.openerp .oe-view-manager .oe-view-manager-content .markdown-body a.btn {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.markdown-body dl dt {
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
padding: 0;
|
||||
margin-top: 15px;
|
||||
}
|
||||
.markdown-body dl dd {
|
||||
margin-bottom: 15px;
|
||||
padding: 0 15px;
|
||||
}
|
||||
.markdown-body blockquote {
|
||||
border-left: 4px solid #DDD;
|
||||
padding: 0 15px;
|
||||
color: #777;
|
||||
}
|
||||
.markdown-body blockquote >:first-child {
|
||||
margin-top: 0px;
|
||||
}
|
||||
.markdown-body blockquote >:last-child {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
.markdown-body table {
|
||||
width: 100%;
|
||||
overflow: auto;
|
||||
display: block;
|
||||
border-spacing: 0;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
.markdown-body table th {
|
||||
font-weight: bold;
|
||||
}
|
||||
.markdown-body table th,
|
||||
.markdown-body table td {
|
||||
border: 1px solid #ddd;
|
||||
padding: 6px 13px;
|
||||
}
|
||||
.markdown-body table tr {
|
||||
border-top: 1px solid #ccc;
|
||||
background-color: #fff;
|
||||
}
|
||||
.markdown-body table tr:nth-child(2n) {
|
||||
background-color: #f8f8f8;
|
||||
}
|
||||
.markdown-body img {
|
||||
max-width: 100%;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.markdown-body span.frame {
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
}
|
||||
.markdown-body span.frame > span {
|
||||
border: 1px solid #ddd;
|
||||
display: block;
|
||||
float: left;
|
||||
overflow: hidden;
|
||||
margin: 13px 0 0;
|
||||
padding: 7px;
|
||||
width: auto;
|
||||
}
|
||||
.markdown-body span.frame span img {
|
||||
display: block;
|
||||
float: left;
|
||||
}
|
||||
.markdown-body span.frame span span {
|
||||
clear: both;
|
||||
color: #333;
|
||||
display: block;
|
||||
padding: 5px 0 0;
|
||||
}
|
||||
.markdown-body span.align-center {
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
clear: both;
|
||||
}
|
||||
.markdown-body span.align-center > span {
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
margin: 13px auto 0;
|
||||
text-align: center;
|
||||
}
|
||||
.markdown-body span.align-center span img {
|
||||
margin: 0 auto;
|
||||
text-align: center;
|
||||
}
|
||||
.markdown-body span.align-right {
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
clear: both;
|
||||
}
|
||||
.markdown-body span.align-right > span {
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
margin: 13px 0 0;
|
||||
text-align: right;
|
||||
}
|
||||
.markdown-body span.align-right span img {
|
||||
margin: 0;
|
||||
text-align: right;
|
||||
}
|
||||
.markdown-body span.float-left {
|
||||
display: block;
|
||||
margin-right: 13px;
|
||||
overflow: hidden;
|
||||
float: left;
|
||||
}
|
||||
.markdown-body span.float-left span {
|
||||
margin: 13px 0 0;
|
||||
}
|
||||
.markdown-body span.float-right {
|
||||
display: block;
|
||||
margin-left: 13px;
|
||||
overflow: hidden;
|
||||
float: right;
|
||||
}
|
||||
.markdown-body span.float-right > span {
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
margin: 13px auto 0;
|
||||
text-align: right;
|
||||
}
|
||||
.markdown-body code,
|
||||
.markdown-body tt {
|
||||
margin: 0 2px;
|
||||
padding: 0px 5px;
|
||||
border: 1px solid #ddd;
|
||||
background-color: #f8f8f8;
|
||||
border-radius: 3px;
|
||||
}
|
||||
.markdown-body code {
|
||||
white-space: nowrap;
|
||||
}
|
||||
.markdown-body pre > code {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
white-space: pre;
|
||||
border: none;
|
||||
background: transparent;
|
||||
}
|
||||
.markdown-body .highlight pre,
|
||||
.markdown-body pre {
|
||||
background-color: #f8f8f8;
|
||||
border: 1px solid #ddd;
|
||||
font-size: 13px;
|
||||
line-height: 19px;
|
||||
overflow: auto;
|
||||
padding: 6px 10px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
.markdown-body pre code,
|
||||
.markdown-body pre tt {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
}
|
||||
@@ -1,139 +1,160 @@
|
||||
/* global marked */
|
||||
/* Copyright 2014 Sudokeys <http://www.sudokeys.com>
|
||||
* Copyright 2017 Komit - <http:///komit-consulting.com>
|
||||
* Copyright 2019 Alexandre Díaz - <dev@redneboa.es>
|
||||
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
|
||||
odoo.define("web_widget_text_markdown.bootstrap_markdown",
|
||||
function(require) {
|
||||
"use strict";
|
||||
odoo.define("web_widget_text_markdown.FieldTextMarkDown", function (require) {
|
||||
'use strict';
|
||||
|
||||
var basic_fields = require('web.basic_fields');
|
||||
var field_registry = require('web.field_registry');
|
||||
var core = require('web.core');
|
||||
var form_common = require('web.form_common');
|
||||
var formats = require("web.formats");
|
||||
|
||||
var _lt = core._lt;
|
||||
var ListView = require('web.ListView');
|
||||
var list_widget_registry = core.list_widget_registry;
|
||||
var _t = core._t;
|
||||
var LIBS_PATH = '/web_widget_text_markdown/static/src/lib/';
|
||||
|
||||
var FieldTextMarkDown = form_common.AbstractField.extend(
|
||||
form_common.ReinitializeFieldMixin, {
|
||||
|
||||
template: 'FieldMarkDown',
|
||||
display_name: _lt('MarkDown'),
|
||||
widget_class: 'oe_form_field_bootstrap_markdown',
|
||||
events: {
|
||||
'change input': 'store_dom_value'
|
||||
var FieldTextMarkDown = basic_fields.FieldText.extend({
|
||||
className: [
|
||||
basic_fields.FieldText.prototype.className,
|
||||
'o_field_text_markdown',
|
||||
].join(' '),
|
||||
jsLibs: [
|
||||
LIBS_PATH + 'marked.js',
|
||||
LIBS_PATH + 'dropzone.js',
|
||||
LIBS_PATH + 'bootstrap-markdown.js',
|
||||
],
|
||||
cssLibs: [
|
||||
LIBS_PATH + 'bootstrap-markdown.min.css',
|
||||
],
|
||||
|
||||
_getValue: function () {
|
||||
return this.$markdown.getContent();
|
||||
},
|
||||
|
||||
init: function(field_manager, node) {
|
||||
this._super(field_manager, node);
|
||||
this.$txt = false;
|
||||
|
||||
this.old_value = null;
|
||||
_prepareInput: function () {
|
||||
var $input = this._super.apply(this, arguments);
|
||||
_.defer(function ($elm) {
|
||||
$input.removeClass(this.className);
|
||||
$input.wrap(
|
||||
_.str.sprintf("<div class='%s'></div>", this.className));
|
||||
$elm.markdown(this._getMarkdownOptions());
|
||||
this.$markdown = $elm.data("markdown");
|
||||
this.$markdown.setContent(this.value || "");
|
||||
}.bind(this), $input);
|
||||
return $input;
|
||||
},
|
||||
|
||||
parse_value: function(val, def) {
|
||||
return formats.parse_value(val, this, def);
|
||||
_renderReadonly: function () {
|
||||
this.$el.html(marked(this._formatValue(this.value)));
|
||||
},
|
||||
|
||||
initialize_content: function() {
|
||||
// Gets called at each redraw of widget
|
||||
// - switching between read-only mode and edit mode
|
||||
// - BUT NOT when switching to next object.
|
||||
this.$txt = this.$el.find('textarea[name="' + this.name + '"]');
|
||||
if (!this.get('effective_readonly')) {
|
||||
this.$txt.markdown({
|
||||
autofocus: false,
|
||||
savable: false,
|
||||
iconlibrary: "fa"
|
||||
|
||||
_getMarkdownOptions: function () {
|
||||
var markdownOpts = {
|
||||
autofocus: false,
|
||||
savable: false,
|
||||
language: this.getSession().user_context.lang,
|
||||
};
|
||||
|
||||
// Only can create attachments on non-virtual records
|
||||
if (this.res_id) {
|
||||
var self = this;
|
||||
markdownOpts.dropZoneOptions = {
|
||||
paramName: 'ufile',
|
||||
url: '/web/binary/upload_attachment',
|
||||
acceptedFiles: 'image/*',
|
||||
width: 'o_field_text_markdown',
|
||||
params: {
|
||||
csrf_token: core.csrf_token,
|
||||
session_id: this.getSession().override_session,
|
||||
callback: '',
|
||||
model: this.model,
|
||||
id: this.res_id,
|
||||
},
|
||||
success: function () {
|
||||
self._markdownDropZoneUploadSuccess(this);
|
||||
},
|
||||
error: function () {
|
||||
self._markdownDropZoneUploadError(this);
|
||||
},
|
||||
init: function () {
|
||||
self._markdownDropZoneInit(this);
|
||||
},
|
||||
};
|
||||
|
||||
if (_t.database.multi_lang && this.field.translate) {
|
||||
markdownOpts.additionalButtons = [
|
||||
[{
|
||||
name: 'oTranslate',
|
||||
data: [{
|
||||
name: 'cmdTranslate',
|
||||
title: _t('Translate'),
|
||||
icon: {glyph: 'glyphicon glyphicon-flag'},
|
||||
callback: this._markdownTranslate,
|
||||
}],
|
||||
}],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
return markdownOpts;
|
||||
},
|
||||
|
||||
_getAttachmentId: function (response) {
|
||||
var matchElms = response.match(/"id":\s?(\d+)/);
|
||||
if (matchElms && matchElms.length) {
|
||||
return matchElms[1];
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
_markdownDropZoneInit: function (markdown) {
|
||||
var self = this;
|
||||
var caretPos = 0;
|
||||
var $textarea = null;
|
||||
markdown.on('drop', function (e) {
|
||||
$textarea = $(e.target);
|
||||
caretPos = $textarea.prop('selectionStart');
|
||||
});
|
||||
}
|
||||
this.old_value = null; // will trigger a redraw
|
||||
},
|
||||
|
||||
store_dom_value: function() {
|
||||
if (!this.get('effective_readonly') &&
|
||||
this.is_syntax_valid()) {
|
||||
// We use internal_set_value because we were called by
|
||||
// ``.commit_value()`` which is called by a ``.set_value()``
|
||||
// itself called because of a ``onchange`` event
|
||||
this.internal_set_value(
|
||||
this.parse_value(
|
||||
this._get_raw_value()
|
||||
)
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
commit_value: function() {
|
||||
this.store_dom_value();
|
||||
return this._super();
|
||||
},
|
||||
|
||||
_get_raw_value: function() {
|
||||
if (this.$txt === false) {
|
||||
return '';
|
||||
}
|
||||
return this.$txt.val();
|
||||
},
|
||||
|
||||
render_value: function() {
|
||||
// Gets called at each redraw/save of widget
|
||||
// - switching between read-only mode and edit mode
|
||||
// - when switching to next object.
|
||||
|
||||
var show_value = this.format_value(this.get('value'), '');
|
||||
if (!this.get("effective_readonly")) {
|
||||
this.$txt.val(show_value);
|
||||
this.$el.trigger('resize');
|
||||
} else {
|
||||
// avoids loading markitup...
|
||||
marked.setOptions({
|
||||
highlight: function(code) {
|
||||
return hljs.highlightAuto(code).value;
|
||||
}
|
||||
markdown.on('success', function (file, response) {
|
||||
var text = $textarea.val();
|
||||
var attachment_id = self._getAttachmentId(response);
|
||||
if (attachment_id) {
|
||||
var ftext = text.substring(0, caretPos) + '\n\n' +
|
||||
text.substring(caretPos);
|
||||
$textarea.val(ftext);
|
||||
} else {
|
||||
self.do_warn(
|
||||
_t('Error'),
|
||||
_t("Can't create the attachment."));
|
||||
}
|
||||
});
|
||||
markdown.on('error', function (file, error) {
|
||||
console.warn(error);
|
||||
});
|
||||
this.$el.find('span[class="oe_form_text_content"]').html(marked(show_value));
|
||||
}
|
||||
},
|
||||
|
||||
format_value: function(val, def) {
|
||||
return formats.format_value(val, this, def);
|
||||
}
|
||||
}
|
||||
);
|
||||
_markdownDropZoneUploadSuccess: function () {
|
||||
this.isDirty = true;
|
||||
this._doDebouncedAction();
|
||||
this.$markdown.$editor.find(".dz-error-mark:last")
|
||||
.css("display", "none");
|
||||
},
|
||||
|
||||
core.form_widget_registry.add('bootstrap_markdown',
|
||||
FieldTextMarkDown);
|
||||
_markdownDropZoneUploadError: function () {
|
||||
this.$markdown.$editor.find(".dz-success-mark:last")
|
||||
.css("display", "none");
|
||||
},
|
||||
|
||||
/**
|
||||
* bootstrap_markdown support on list view
|
||||
**/
|
||||
ListView.Column.include({
|
||||
|
||||
init: function() {
|
||||
this._super.apply(this, arguments);
|
||||
hljs.initHighlightingOnLoad();
|
||||
marked.setOptions({
|
||||
sanitize: true,
|
||||
highlight: function(code) {
|
||||
return hljs.highlightAuto(code).value;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_format: function(row_data, options) {
|
||||
if (this.type === "text") {
|
||||
options = options || {};
|
||||
var markdown_text = marked(
|
||||
formats.format_value(
|
||||
row_data[this.id].value, this, options.value_if_empty
|
||||
)
|
||||
);
|
||||
return markdown_text;
|
||||
}
|
||||
return this._super(row_data, options)
|
||||
}
|
||||
_markdownTranslate: function () {
|
||||
this._onTranslate();
|
||||
},
|
||||
});
|
||||
|
||||
list_widget_registry.add('field.bootstrap_markdown', ListView.Column);
|
||||
|
||||
});
|
||||
field_registry.add('bootstrap_markdown', FieldTextMarkDown);
|
||||
return FieldTextMarkDown;
|
||||
});
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/* Copyright 2019 Alexandre Díaz - <dev@redneboa.es>
|
||||
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
|
||||
.o_field_text_markdown {
|
||||
.dz-preview {
|
||||
display: inline-block;
|
||||
margin: 0.5em;
|
||||
|
||||
.dz-success-mark svg {
|
||||
background-color: green;
|
||||
border-radius: 30px;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
|
||||
.dz-error-mark svg {
|
||||
background: red;
|
||||
border-radius: 30px;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
}
|
||||
}
|
||||
1575
web_widget_text_markdown/static/src/lib/bootstrap-markdown.js
vendored
Normal file
1575
web_widget_text_markdown/static/src/lib/bootstrap-markdown.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
3530
web_widget_text_markdown/static/src/lib/dropzone.js
Normal file
3530
web_widget_text_markdown/static/src/lib/dropzone.js
Normal file
File diff suppressed because it is too large
Load Diff
1664
web_widget_text_markdown/static/src/lib/marked.js
Normal file
1664
web_widget_text_markdown/static/src/lib/marked.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,40 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- * Copyright 2014 Sudokeys <http://www.sudokeys.com>
|
||||
* Copyright 2017 Komit - <http:///komit-consulting.com>
|
||||
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).-->
|
||||
|
||||
<templates id="template" xml:space="preserve">
|
||||
|
||||
<t t-name="FieldMarkDown">
|
||||
|
||||
<div t-attf-class="oe_form_field oe_form_field_markdown markdown-body" t-att-style="widget.node.attrs.style">
|
||||
|
||||
<t t-if="!widget.get('effective_readonly')">
|
||||
<textarea rows="6"
|
||||
t-att-name="widget.name"
|
||||
class="field_text"
|
||||
t-att-tabindex="widget.node.attrs.tabindex"
|
||||
t-att-autofocus="widget.node.attrs.autofocus"
|
||||
t-att-placeholder="! widget.get('effective_readonly') ? widget.node.attrs.placeholder : ''"
|
||||
t-att-maxlength="widget.field.size"
|
||||
/><img class="oe_field_translate oe_input_icon"
|
||||
t-if="widget.field.translate and !widget.get('effective_readonly')"
|
||||
t-att-src='_s + "/web/static/src/img/icons/terp-translate.png"'
|
||||
width="16"
|
||||
height="16"
|
||||
border="0"
|
||||
/>
|
||||
</t>
|
||||
<t t-if="widget.get('effective_readonly')">
|
||||
<span class="oe_form_text_content"/>
|
||||
</t>
|
||||
</div>
|
||||
</t>
|
||||
|
||||
<t t-name="FieldTextRst2HtmlReadOnly">
|
||||
<div class="oe_form_field_html oe_form_field_rst2html_readonly"
|
||||
t-att-style="widget.node.attrs.style">
|
||||
</div>
|
||||
</t>
|
||||
|
||||
</templates>
|
||||
Reference in New Issue
Block a user