forked from Techsystech/web
[IMP] web_widget_text_markdown: black, isort, prettier
parent
1f4a981159
commit
ef99af6cf1
|
@ -0,0 +1 @@
|
||||||
|
../../../../web_widget_text_markdown
|
|
@ -0,0 +1,2 @@
|
||||||
|
[bdist_wheel]
|
||||||
|
universal=1
|
|
@ -0,0 +1,6 @@
|
||||||
|
import setuptools
|
||||||
|
|
||||||
|
setuptools.setup(
|
||||||
|
setup_requires=['setuptools-odoo'],
|
||||||
|
odoo_addon=True,
|
||||||
|
)
|
|
@ -3,29 +3,21 @@
|
||||||
#
|
#
|
||||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||||
{
|
{
|
||||||
'name': 'Web Widget Text Markdown',
|
"name": "Web Widget Text Markdown",
|
||||||
'version': '11.0.1.0.0',
|
"version": "11.0.1.0.0",
|
||||||
"author": "Alexandre Díaz, "
|
"author": "Alexandre Díaz, "
|
||||||
"Komit, "
|
"Komit, "
|
||||||
"Sudokeys, "
|
"Sudokeys, "
|
||||||
"Odoo Community Association (OCA)",
|
"Odoo Community Association (OCA)",
|
||||||
'category': 'Web',
|
"category": "Web",
|
||||||
'license': 'AGPL-3',
|
"license": "AGPL-3",
|
||||||
'website': 'https://github.com/OCA/web',
|
"website": "https://github.com/OCA/web",
|
||||||
'summary': 'Widget to text fields that adds markdown support',
|
"summary": "Widget to text fields that adds markdown support",
|
||||||
'depends': [
|
"depends": ["web"],
|
||||||
'web'
|
"demo": ["demo/bootstrap_markdown.xml"],
|
||||||
],
|
"data": ["views/assets.xml"],
|
||||||
'demo': [
|
"qweb": ["static/src/xml/bootstrap_markdown.xml"],
|
||||||
"demo/bootstrap_markdown.xml",
|
"installable": True,
|
||||||
],
|
"auto_install": False,
|
||||||
'data': [
|
"application": False,
|
||||||
'views/assets.xml',
|
|
||||||
],
|
|
||||||
"qweb": [
|
|
||||||
"static/src/xml/bootstrap_markdown.xml",
|
|
||||||
],
|
|
||||||
'installable': True,
|
|
||||||
'auto_install': False,
|
|
||||||
'application': False
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<odoo>
|
<odoo>
|
||||||
<record id="view_groups_form_inherited" model="ir.ui.view">
|
<record id="view_groups_form_inherited" model="ir.ui.view">
|
||||||
<field name="model">res.groups</field>
|
<field name="model">res.groups</field>
|
||||||
|
|
|
@ -3,54 +3,54 @@
|
||||||
* Copyright 2017 Komit - <http:///komit-consulting.com>
|
* Copyright 2017 Komit - <http:///komit-consulting.com>
|
||||||
* Copyright 2019 Alexandre Díaz - <dev@redneboa.es>
|
* Copyright 2019 Alexandre Díaz - <dev@redneboa.es>
|
||||||
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
|
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
|
||||||
odoo.define("web_widget_text_markdown.FieldTextMarkDown", function (require) {
|
odoo.define("web_widget_text_markdown.FieldTextMarkDown", function(require) {
|
||||||
'use strict';
|
"use strict";
|
||||||
|
|
||||||
var basic_fields = require('web.basic_fields');
|
var basic_fields = require("web.basic_fields");
|
||||||
var field_registry = require('web.field_registry');
|
var field_registry = require("web.field_registry");
|
||||||
var core = require('web.core');
|
var core = require("web.core");
|
||||||
|
|
||||||
var _t = core._t;
|
var _t = core._t;
|
||||||
var LIBS_PATH = '/web_widget_text_markdown/static/src/lib/';
|
var LIBS_PATH = "/web_widget_text_markdown/static/src/lib/";
|
||||||
|
|
||||||
|
|
||||||
var FieldTextMarkDown = basic_fields.FieldText.extend({
|
var FieldTextMarkDown = basic_fields.FieldText.extend({
|
||||||
className: [
|
className: [
|
||||||
basic_fields.FieldText.prototype.className,
|
basic_fields.FieldText.prototype.className,
|
||||||
'o_field_text_markdown',
|
"o_field_text_markdown",
|
||||||
].join(' '),
|
].join(" "),
|
||||||
jsLibs: [
|
jsLibs: [
|
||||||
LIBS_PATH + 'marked.js',
|
LIBS_PATH + "marked.js",
|
||||||
LIBS_PATH + 'dropzone.js',
|
LIBS_PATH + "dropzone.js",
|
||||||
LIBS_PATH + 'bootstrap-markdown.js',
|
LIBS_PATH + "bootstrap-markdown.js",
|
||||||
],
|
|
||||||
cssLibs: [
|
|
||||||
LIBS_PATH + 'bootstrap-markdown.min.css',
|
|
||||||
],
|
],
|
||||||
|
cssLibs: [LIBS_PATH + "bootstrap-markdown.min.css"],
|
||||||
|
|
||||||
_getValue: function () {
|
_getValue: function() {
|
||||||
return this.$markdown.getContent();
|
return this.$markdown.getContent();
|
||||||
},
|
},
|
||||||
|
|
||||||
_prepareInput: function () {
|
_prepareInput: function() {
|
||||||
var $input = this._super.apply(this, arguments);
|
var $input = this._super.apply(this, arguments);
|
||||||
_.defer(function ($elm) {
|
_.defer(
|
||||||
$input.removeClass(this.className);
|
function($elm) {
|
||||||
$input.wrap(
|
$input.removeClass(this.className);
|
||||||
_.str.sprintf("<div class='%s'></div>", this.className));
|
$input.wrap(
|
||||||
$elm.markdown(this._getMarkdownOptions());
|
_.str.sprintf("<div class='%s'></div>", this.className)
|
||||||
this.$markdown = $elm.data("markdown");
|
);
|
||||||
this.$markdown.setContent(this.value || "");
|
$elm.markdown(this._getMarkdownOptions());
|
||||||
}.bind(this), $input);
|
this.$markdown = $elm.data("markdown");
|
||||||
|
this.$markdown.setContent(this.value || "");
|
||||||
|
}.bind(this),
|
||||||
|
$input
|
||||||
|
);
|
||||||
return $input;
|
return $input;
|
||||||
},
|
},
|
||||||
|
|
||||||
_renderReadonly: function () {
|
_renderReadonly: function() {
|
||||||
this.$el.html(marked(this._formatValue(this.value)));
|
this.$el.html(marked(this._formatValue(this.value)));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_getMarkdownOptions: function() {
|
||||||
_getMarkdownOptions: function () {
|
|
||||||
var markdownOpts = {
|
var markdownOpts = {
|
||||||
autofocus: false,
|
autofocus: false,
|
||||||
savable: false,
|
savable: false,
|
||||||
|
@ -61,39 +61,43 @@ odoo.define("web_widget_text_markdown.FieldTextMarkDown", function (require) {
|
||||||
if (this.res_id) {
|
if (this.res_id) {
|
||||||
var self = this;
|
var self = this;
|
||||||
markdownOpts.dropZoneOptions = {
|
markdownOpts.dropZoneOptions = {
|
||||||
paramName: 'ufile',
|
paramName: "ufile",
|
||||||
url: '/web/binary/upload_attachment',
|
url: "/web/binary/upload_attachment",
|
||||||
acceptedFiles: 'image/*',
|
acceptedFiles: "image/*",
|
||||||
width: 'o_field_text_markdown',
|
width: "o_field_text_markdown",
|
||||||
params: {
|
params: {
|
||||||
csrf_token: core.csrf_token,
|
csrf_token: core.csrf_token,
|
||||||
session_id: this.getSession().override_session,
|
session_id: this.getSession().override_session,
|
||||||
callback: '',
|
callback: "",
|
||||||
model: this.model,
|
model: this.model,
|
||||||
id: this.res_id,
|
id: this.res_id,
|
||||||
},
|
},
|
||||||
success: function () {
|
success: function() {
|
||||||
self._markdownDropZoneUploadSuccess(this);
|
self._markdownDropZoneUploadSuccess(this);
|
||||||
},
|
},
|
||||||
error: function () {
|
error: function() {
|
||||||
self._markdownDropZoneUploadError(this);
|
self._markdownDropZoneUploadError(this);
|
||||||
},
|
},
|
||||||
init: function () {
|
init: function() {
|
||||||
self._markdownDropZoneInit(this);
|
self._markdownDropZoneInit(this);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
if (_t.database.multi_lang && this.field.translate) {
|
if (_t.database.multi_lang && this.field.translate) {
|
||||||
markdownOpts.additionalButtons = [
|
markdownOpts.additionalButtons = [
|
||||||
[{
|
[
|
||||||
name: 'oTranslate',
|
{
|
||||||
data: [{
|
name: "oTranslate",
|
||||||
name: 'cmdTranslate',
|
data: [
|
||||||
title: _t('Translate'),
|
{
|
||||||
icon: {glyph: 'glyphicon glyphicon-flag'},
|
name: "cmdTranslate",
|
||||||
callback: this._markdownTranslate,
|
title: _t("Translate"),
|
||||||
}],
|
icon: {glyph: "glyphicon glyphicon-flag"},
|
||||||
}],
|
callback: this._markdownTranslate,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,7 +105,7 @@ odoo.define("web_widget_text_markdown.FieldTextMarkDown", function (require) {
|
||||||
return markdownOpts;
|
return markdownOpts;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getAttachmentId: function (response) {
|
_getAttachmentId: function(response) {
|
||||||
var matchElms = response.match(/"id":\s?(\d+)/);
|
var matchElms = response.match(/"id":\s?(\d+)/);
|
||||||
if (matchElms && matchElms.length) {
|
if (matchElms && matchElms.length) {
|
||||||
return matchElms[1];
|
return matchElms[1];
|
||||||
|
@ -109,52 +113,51 @@ odoo.define("web_widget_text_markdown.FieldTextMarkDown", function (require) {
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
|
||||||
_markdownDropZoneInit: function (markdown) {
|
_markdownDropZoneInit: function(markdown) {
|
||||||
var self = this;
|
var self = this;
|
||||||
var caretPos = 0;
|
var caretPos = 0;
|
||||||
var $textarea = null;
|
var $textarea = null;
|
||||||
markdown.on('drop', function (e) {
|
markdown.on("drop", function(e) {
|
||||||
$textarea = $(e.target);
|
$textarea = $(e.target);
|
||||||
caretPos = $textarea.prop('selectionStart');
|
caretPos = $textarea.prop("selectionStart");
|
||||||
});
|
});
|
||||||
markdown.on('success', function (file, response) {
|
markdown.on("success", function(file, response) {
|
||||||
var text = $textarea.val();
|
var text = $textarea.val();
|
||||||
var attachment_id = self._getAttachmentId(response);
|
var attachment_id = self._getAttachmentId(response);
|
||||||
if (attachment_id) {
|
if (attachment_id) {
|
||||||
var ftext = text.substring(0, caretPos) + '\n\n' +
|
"\n\n" +
|
||||||
|
text.substring(caretPos);
|
||||||
$textarea.val(ftext);
|
$textarea.val(ftext);
|
||||||
} else {
|
} else {
|
||||||
self.do_warn(
|
self.do_warn(_t("Error"), _t("Can't create the attachment."));
|
||||||
_t('Error'),
|
|
||||||
_t("Can't create the attachment."));
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
markdown.on('error', function (file, error) {
|
markdown.on("error", function(file, error) {
|
||||||
console.warn(error);
|
console.warn(error);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
_markdownDropZoneUploadSuccess: function () {
|
_markdownDropZoneUploadSuccess: function() {
|
||||||
this.isDirty = true;
|
this.isDirty = true;
|
||||||
this._doDebouncedAction();
|
this._doDebouncedAction();
|
||||||
this.$markdown.$editor.find(".dz-error-mark:last")
|
this.$markdown.$editor.find(".dz-error-mark:last").css("display", "none");
|
||||||
.css("display", "none");
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_markdownDropZoneUploadError: function () {
|
_markdownDropZoneUploadError: function() {
|
||||||
this.$markdown.$editor.find(".dz-success-mark:last")
|
this.$markdown.$editor.find(".dz-success-mark:last").css("display", "none");
|
||||||
.css("display", "none");
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_markdownTranslate: function () {
|
_markdownTranslate: function() {
|
||||||
this._onTranslate();
|
this._onTranslate();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
field_registry.add("bootstrap_markdown", FieldTextMarkDown);
|
||||||
field_registry.add('bootstrap_markdown', FieldTextMarkDown);
|
|
||||||
return FieldTextMarkDown;
|
return FieldTextMarkDown;
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,22 +1,22 @@
|
||||||
/* Copyright 2019 Alexandre Díaz - <dev@redneboa.es>
|
/* Copyright 2019 Alexandre Díaz - <dev@redneboa.es>
|
||||||
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
|
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
|
||||||
.o_field_text_markdown {
|
.o_field_text_markdown {
|
||||||
.dz-preview {
|
.dz-preview {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin: 0.5em;
|
margin: 0.5em;
|
||||||
|
|
||||||
.dz-success-mark svg {
|
.dz-success-mark svg {
|
||||||
background-color: green;
|
background-color: green;
|
||||||
border-radius: 30px;
|
border-radius: 30px;
|
||||||
width: 32px;
|
width: 32px;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dz-error-mark svg {
|
.dz-error-mark svg {
|
||||||
background: red;
|
background: red;
|
||||||
border-radius: 30px;
|
border-radius: 30px;
|
||||||
width: 32px;
|
width: 32px;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,75 +2,78 @@
|
||||||
/* Copyright 2019 Alexandre Díaz - <dev@redneboa.es>
|
/* Copyright 2019 Alexandre Díaz - <dev@redneboa.es>
|
||||||
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
|
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
|
||||||
|
|
||||||
odoo.define('web_widget_text_markdown.test', function (require) {
|
odoo.define("web_widget_text_markdown.test", function(require) {
|
||||||
'use strict';
|
"use strict";
|
||||||
|
|
||||||
var FormView = require('web.FormView');
|
var FormView = require("web.FormView");
|
||||||
var testUtils = require('web.test_utils');
|
var testUtils = require("web.test_utils");
|
||||||
|
|
||||||
var createAsyncView = testUtils.createAsyncView;
|
var createAsyncView = testUtils.createAsyncView;
|
||||||
|
|
||||||
|
QUnit.module(
|
||||||
QUnit.module('web_widget_text_markdown', {
|
"web_widget_text_markdown",
|
||||||
beforeEach: function () {
|
{
|
||||||
this.data = {
|
beforeEach: function() {
|
||||||
partner: {
|
this.data = {
|
||||||
fields: {comment: {string: "Comment", type: "text"}},
|
partner: {
|
||||||
records: [
|
fields: {comment: {string: "Comment", type: "text"}},
|
||||||
{id: 1, comment: "This is a test\n**Hello**"},
|
records: [{id: 1, comment: "This is a test\n**Hello**"}],
|
||||||
],
|
},
|
||||||
},
|
};
|
||||||
};
|
this.arch =
|
||||||
this.arch = '<form><sheet>' +
|
"<form><sheet>" +
|
||||||
'<field name="comment"' +
|
'<field name="comment"' +
|
||||||
' widget="bootstrap_markdown" />' +
|
' widget="bootstrap_markdown" />' +
|
||||||
'</sheet></form>';
|
"</sheet></form>";
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}, function () {
|
function() {
|
||||||
QUnit.module('FieldTextMarkDown');
|
QUnit.module("FieldTextMarkDown");
|
||||||
QUnit.test('bootstrap markdown widget are correctly rendered (preview)',
|
QUnit.test(
|
||||||
function (assert) {
|
"bootstrap markdown widget are correctly rendered (preview)",
|
||||||
assert.expect(1);
|
function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
|
||||||
var done = assert.async();
|
var done = assert.async();
|
||||||
|
|
||||||
createAsyncView({
|
createAsyncView({
|
||||||
View: FormView,
|
View: FormView,
|
||||||
model: 'partner',
|
model: "partner",
|
||||||
data: this.data,
|
data: this.data,
|
||||||
arch: this.arch,
|
arch: this.arch,
|
||||||
res_id: 1,
|
res_id: 1,
|
||||||
}).then(function (form) {
|
}).then(function(form) {
|
||||||
_.defer(function () {
|
_.defer(function() {
|
||||||
assert.strictEqual(form.$('.md-editor').length, 0);
|
assert.strictEqual(form.$(".md-editor").length, 0);
|
||||||
form.destroy();
|
form.destroy();
|
||||||
done();
|
done();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
}
|
);
|
||||||
);
|
QUnit.test(
|
||||||
QUnit.test('bootstrap markdown widget are correctly rendered (edit)',
|
"bootstrap markdown widget are correctly rendered (edit)",
|
||||||
function (assert) {
|
function(assert) {
|
||||||
assert.expect(1);
|
assert.expect(1);
|
||||||
|
|
||||||
var done = assert.async();
|
var done = assert.async();
|
||||||
|
|
||||||
createAsyncView({
|
createAsyncView({
|
||||||
View: FormView,
|
View: FormView,
|
||||||
model: 'partner',
|
model: "partner",
|
||||||
data: this.data,
|
data: this.data,
|
||||||
arch: this.arch,
|
arch: this.arch,
|
||||||
res_id: 1,
|
res_id: 1,
|
||||||
viewOptions: {mode: 'edit'},
|
viewOptions: {mode: "edit"},
|
||||||
}).then(function (form) {
|
}).then(function(form) {
|
||||||
_.defer(function () {
|
_.defer(function() {
|
||||||
assert.strictEqual(form.$('.md-editor').length, 1);
|
assert.strictEqual(form.$(".md-editor").length, 1);
|
||||||
form.destroy();
|
form.destroy();
|
||||||
done();
|
done();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
}
|
);
|
||||||
);
|
}
|
||||||
});
|
);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,22 +1,31 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
<!-- * Copyright 2014 Sudokeys <http://www.sudokeys.com>
|
<!-- * Copyright 2014 Sudokeys <http://www.sudokeys.com>
|
||||||
* Copyright 2017 Komit - <http:///komit-consulting.com>
|
* Copyright 2017 Komit - <http:///komit-consulting.com>
|
||||||
* Copyright 2019 Alexandre Díaz - <dev@redneboa.es>
|
* Copyright 2019 Alexandre Díaz - <dev@redneboa.es>
|
||||||
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).-->
|
* License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).-->
|
||||||
<odoo>
|
<odoo>
|
||||||
<template id="assets_backend" name="web_widget_text_markdown_assets" inherit_id="web.assets_backend">
|
<template
|
||||||
|
id="assets_backend"
|
||||||
|
name="web_widget_text_markdown_assets"
|
||||||
|
inherit_id="web.assets_backend"
|
||||||
|
>
|
||||||
<xpath expr="." position="inside">
|
<xpath expr="." position="inside">
|
||||||
<link rel='stylesheet'
|
<link
|
||||||
href='/web_widget_text_markdown/static/src/less/web_widget_text_markdown.less'/>
|
rel='stylesheet'
|
||||||
<script type="text/javascript"
|
href='/web_widget_text_markdown/static/src/less/web_widget_text_markdown.less'
|
||||||
src="/web_widget_text_markdown/static/src/js/web_widget_text_markdown.js"/>
|
/>
|
||||||
|
<script
|
||||||
|
type="text/javascript"
|
||||||
|
src="/web_widget_text_markdown/static/src/js/web_widget_text_markdown.js"
|
||||||
|
/>
|
||||||
</xpath>
|
</xpath>
|
||||||
</template>
|
</template>
|
||||||
<template id="qunit_suite" inherit_id="web.qunit_suite">
|
<template id="qunit_suite" inherit_id="web.qunit_suite">
|
||||||
<xpath expr="//t[@t-set='head']" position="inside">
|
<xpath expr="//t[@t-set='head']" position="inside">
|
||||||
<script type="application/javascript"
|
<script
|
||||||
src="/web_widget_text_markdown/static/tests/js/web_widget_text_markdown.js"
|
type="application/javascript"
|
||||||
/>
|
src="/web_widget_text_markdown/static/tests/js/web_widget_text_markdown.js"
|
||||||
|
/>
|
||||||
</xpath>
|
</xpath>
|
||||||
</template>
|
</template>
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|
Loading…
Reference in New Issue