[MIG] web_widget_text_markdown: Migration to 11.0

This commit is contained in:
Alexandre Díaz
2019-02-09 21:13:49 +01:00
committed by bobrador
parent e8cfc2c96a
commit b4fd9e170e
78 changed files with 6010 additions and 8675 deletions

View File

@@ -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;
}

View File

@@ -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![' +
_t('description') +
'](/web/image/' + attachment_id + ')\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;
});

View File

@@ -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;
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -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>