From 78cde9a8b4bb09fe9b83f683ace4c0c03070da19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Fri, 2 Aug 2024 17:47:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B6=E5=8F=91=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- soong_workflow/__init__.py | 1 + soong_workflow/__manifest__.py | 3 +- soong_workflow/models/soong_approval_users.py | 2 +- soong_workflow/models/soong_workflow_mixin.py | 24 ++-- soong_workflow/security/ir.model.access.csv | 4 +- .../views/soong_approval_users_views.xml | 2 +- soong_workflow/wizard/__init__.py | 5 + .../wizard/approval_notice_wizard.py | 26 ++++ .../wizard/approval_notice_wizard_views.xml | 34 +++++ web_editor_tinymce/__manifest__.py | 19 +++ .../static/description/icon.png | Bin 0 -> 21008 bytes .../static/description/index.html | 36 +++++ .../static/description/main_screenshot.png | Bin 0 -> 15510 bytes .../static/description/usage.png | Bin 0 -> 5271 bytes .../static/src/field_tinymce/field_tinymce.js | 130 ++++++++++++++++++ .../src/field_tinymce/field_tinymce.scss | 3 + .../src/field_tinymce/field_tinymce.xml | 21 +++ yuthon_notice/models/yuthon_notice.py | 50 +++---- yuthon_notice/report/notice_report.xml | 5 + yuthon_notice/views/yuthon_ntice_views.xml | 97 ++++++++++++- yuthon_official/__manifest__.py | 20 +-- yuthon_official/data/official_type_data.xml | 30 +++- yuthon_official/models/__init__.py | 1 - yuthon_official/models/yuthon_official.py | 24 +++- .../models/yuthon_official_incoming_normal.py | 1 - .../models/yuthon_official_normal.py | 31 ----- yuthon_official/security/ir.model.access.csv | 1 - yuthon_official/views/official_menus.xml | 105 ++++++++++++++ .../views/official_partner_views.xml | 7 +- yuthon_official/views/official_type_views.xml | 7 +- .../yuthon_official_incoming_labor_views.xml | 7 +- .../yuthon_official_incoming_normal_views.xml | 7 +- .../yuthon_official_incoming_party_views.xml | 7 +- .../views/yuthon_official_labor_views.xml | 7 +- .../views/yuthon_official_normal_views.xml | 91 ------------ .../views/yuthon_official_party_views.xml | 7 +- .../views/yuthon_official_views.xml | 36 +---- 37 files changed, 587 insertions(+), 264 deletions(-) create mode 100644 soong_workflow/wizard/__init__.py create mode 100644 soong_workflow/wizard/approval_notice_wizard.py create mode 100644 soong_workflow/wizard/approval_notice_wizard_views.xml create mode 100644 web_editor_tinymce/__manifest__.py create mode 100644 web_editor_tinymce/static/description/icon.png create mode 100644 web_editor_tinymce/static/description/index.html create mode 100644 web_editor_tinymce/static/description/main_screenshot.png create mode 100644 web_editor_tinymce/static/description/usage.png create mode 100644 web_editor_tinymce/static/src/field_tinymce/field_tinymce.js create mode 100644 web_editor_tinymce/static/src/field_tinymce/field_tinymce.scss create mode 100644 web_editor_tinymce/static/src/field_tinymce/field_tinymce.xml delete mode 100644 yuthon_official/models/yuthon_official_normal.py create mode 100644 yuthon_official/views/official_menus.xml delete mode 100644 yuthon_official/views/yuthon_official_normal_views.xml diff --git a/soong_workflow/__init__.py b/soong_workflow/__init__.py index cde864bae..3616b3002 100644 --- a/soong_workflow/__init__.py +++ b/soong_workflow/__init__.py @@ -1,3 +1,4 @@ # -*- coding: utf-8 -*- from . import models +from . import wizard \ No newline at end of file diff --git a/soong_workflow/__manifest__.py b/soong_workflow/__manifest__.py index 4ed811fde..0f2db46f0 100644 --- a/soong_workflow/__manifest__.py +++ b/soong_workflow/__manifest__.py @@ -17,7 +17,8 @@ "views/soong_workflow_node_views.xml", "views/soong_workflow_link_views.xml", "views/soong_workflow_views.xml", - 'views/soong_workflow_record.xml' + 'views/soong_workflow_record.xml', + 'wizard/approval_notice_wizard_views.xml' ], "installable": True, "auto_install": False, diff --git a/soong_workflow/models/soong_approval_users.py b/soong_workflow/models/soong_approval_users.py index 95ee95b51..d91d0b388 100644 --- a/soong_workflow/models/soong_approval_users.py +++ b/soong_workflow/models/soong_approval_users.py @@ -26,7 +26,7 @@ class SoongApprovalUsers(models.Model): approval_user = fields.Many2one('soong.user.role', string='审批角色') approval_user_datetime = fields.Datetime(string='审批时间') approval_user_notice = fields.Char(string='审批意见') - approval_user_sign = fields.Char(string='审批签署') + approval_user_sign = fields.Binary(string='审批签署') approval_user_state = fields.Selection([('will', '待审批')], string='状态') @api.model_create_multi diff --git a/soong_workflow/models/soong_workflow_mixin.py b/soong_workflow/models/soong_workflow_mixin.py index 368efbc68..3265b298a 100644 --- a/soong_workflow/models/soong_workflow_mixin.py +++ b/soong_workflow/models/soong_workflow_mixin.py @@ -148,18 +148,18 @@ class SoongWorkflowMixin(models.AbstractModel): @api.model def get_view(self, view_id=None, view_type="form", **options): res = super().get_view(view_id, view_type, **options) - - if view_type in ["tree", "form"]: - if "field" in res["arch"]: - # res = self._remove_default_header(view_type, res) - res = self._remove_default_modifiers(view_type, res) - res = self._load_buttons_view(view_type, res) - res = self._load_button_box_view(view_type, res) - res = self._load_state_view(view_type, res) - res = self._load_one2many_views(view_type, res) - res = self._update_fields_view(view_type, res) - # 列表视图增加状态字段 - # res = self._add_state_tree_view(view_type, res) + if 'create="false"' not in res['arch']: # 针对一个模型多个form临时做的区分 + if view_type in ["tree", "form"]: + if "field" in res["arch"]: + # res = self._remove_default_header(view_type, res) + res = self._remove_default_modifiers(view_type, res) + res = self._load_buttons_view(view_type, res) + res = self._load_button_box_view(view_type, res) + res = self._load_state_view(view_type, res) + res = self._load_one2many_views(view_type, res) + res = self._update_fields_view(view_type, res) + # 列表视图增加状态字段 + # res = self._add_state_tree_view(view_type, res) return res def _remove_default_header(self, view_type, res): diff --git a/soong_workflow/security/ir.model.access.csv b/soong_workflow/security/ir.model.access.csv index e7766b223..22fa7a293 100644 --- a/soong_workflow/security/ir.model.access.csv +++ b/soong_workflow/security/ir.model.access.csv @@ -17,4 +17,6 @@ access_soong_workflow_link_manager,soong_workflow_link_manager,model_soong_workf access_soong_workflow_record_user,soong_workflow_record_user,model_soong_workflow_record,soong_workflow.group_soong_workflow_user,1,1,1,1 access_soong_user_role,soong_user_role,model_soong_user_role,soong_workflow.group_soong_workflow_user,1,1,1,1 access_soong_approval_users,soong_approval_users,model_soong_approval_users,soong_workflow.group_soong_workflow_user,1,1,1,1 -access_soong_note,soong_note,model_soong_note,soong_workflow.group_soong_workflow_user,1,1,1,1 \ No newline at end of file +access_soong_note,soong_note,model_soong_note,soong_workflow.group_soong_workflow_user,1,1,1,1 + +access_soong_approval_notice_wizard,soong_approval_notice_wizard,model_soong_approval_notice_wizard,base.group_user,1,1,1,1 diff --git a/soong_workflow/views/soong_approval_users_views.xml b/soong_workflow/views/soong_approval_users_views.xml index fe5ef2886..fb76a2936 100644 --- a/soong_workflow/views/soong_approval_users_views.xml +++ b/soong_workflow/views/soong_approval_users_views.xml @@ -13,7 +13,7 @@ - + diff --git a/soong_workflow/wizard/__init__.py b/soong_workflow/wizard/__init__.py new file mode 100644 index 000000000..f048f7d3d --- /dev/null +++ b/soong_workflow/wizard/__init__.py @@ -0,0 +1,5 @@ +# + +from . import approval_notice_wizard + + diff --git a/soong_workflow/wizard/approval_notice_wizard.py b/soong_workflow/wizard/approval_notice_wizard.py new file mode 100644 index 000000000..c439f2e7f --- /dev/null +++ b/soong_workflow/wizard/approval_notice_wizard.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from odoo import api, fields, models, tools, _ + + +class SoongApprovalNoticeWizard(models.TransientModel): + _name = 'soong.approval.notice.wizard' + _description = """ 审批意见弹窗 """ + + # approval_res_id = fields.Char(string="审批明细行") + # approval_res_model = fields.Char(string="审批明细行") + + approval_user_notice = fields.Char(string='审批意见') + approval_user_sign = fields.Binary(string="审批签署", copy=False) + + def confirm(self): + self.ensure_one() + active_model = self.env.context.get("active_model") + active_id = self.env.context.get("active_id") + self.env["soong.approval.users"].create({ + 'res_model_id': self.env['ir.model']._get(active_model).id, + 'res_id': active_id, + 'approval_user_notice': self.approval_user_notice, + 'approval_user_id': self.env.user.id, + 'approval_user_datetime': fields.datetime.now(), + 'approval_user_sign': self.approval_user_sign, + }) diff --git a/soong_workflow/wizard/approval_notice_wizard_views.xml b/soong_workflow/wizard/approval_notice_wizard_views.xml new file mode 100644 index 000000000..f2da5adb7 --- /dev/null +++ b/soong_workflow/wizard/approval_notice_wizard_views.xml @@ -0,0 +1,34 @@ + + + 审批意见弹窗 + soong.approval.notice.wizard + +
+ + + + + + + + +
+
+
+
+
+ + 审批意见弹窗 + ir.actions.act_window + soong.approval.notice.wizard + + + + + + form + new + +
\ No newline at end of file diff --git a/web_editor_tinymce/__manifest__.py b/web_editor_tinymce/__manifest__.py new file mode 100644 index 000000000..947706809 --- /dev/null +++ b/web_editor_tinymce/__manifest__.py @@ -0,0 +1,19 @@ +{ + 'name': 'TinyMCE Editor', + 'summary': 'TinyMCE Editor for Html Field', + 'author': 'Hoang Minh Hieu', + 'version': '17.0.1.0.0', + 'license': 'OPL-1', + 'support ': 'hieuhoangminh1996@gmail.com', + 'depends': ['web'], + 'assets': { + 'web.assets_backend': [ + 'web_editor_tinymce/static/src/field_tinymce/field_tinymce.scss', + 'web_editor_tinymce/static/src/field_tinymce/field_tinymce.xml', + 'web_editor_tinymce/static/src/field_tinymce/field_tinymce.js', + ], + }, + 'images': ['static/description/main_screenshot.png'], + 'price': 35, + 'currency': 'USD', +} diff --git a/web_editor_tinymce/static/description/icon.png b/web_editor_tinymce/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..15e5ed47f9cb4f8f8accb6eb4a13e279a84b8d1d GIT binary patch literal 21008 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 p=Jn6>Gl9 + + + + This module replaces Odoo html editor with TinyMCE editor. + + + +
+

+ This module replaces Odoo html editor with TinyMCE editor. +

+
+
+

Screenshot

+ + +

Usage

+ +
+
+

+ Contact me +

+

+ Skype: live:hieuhoangminh1996 +
+ Email: hieuhoangminh1996@gmail.com +
+
+ Email subject should begin with + [Odoo Module] +

+
+ + diff --git a/web_editor_tinymce/static/description/main_screenshot.png b/web_editor_tinymce/static/description/main_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..2e999d5ca3c6c1d1a4abdb5d18cd8f863480cf3d GIT binary patch literal 15510 zcmeHuc~q0hwlCebjfzU!4u~jpi!ulV1trY1(1M5%99m=skr~1erT`%x6;MG?86pIT z$Pkes%ppus1Q9|&i83XCfJulD0t5m{NOA)X=dAPYUGKiP*1doA_s^HqSGBA5uXfcQ zYS&#`8;c#=4s4Tp#A2av$|so`jH5UtrIRDYu!eV3bK$w*7J749l1fsC^7B3qYy11U~-WE?Lu;g$?M>JAt^AffS9eh))0c?YXX|7mnL1 z23Mlex7&LC?UtU7Tz|h%Q3d`We&4uo5&YwNK|vwqr}eiv<1&>-y@gWy^0{0$1SfmX znyR$^tx`kz7|^4tH-f%N@eg(@c22T)M?O6+PQ<$TgN zV%Ew4pxO7Do+Y8$8sCZJKBFXe6o>9!?{z3s%vaFbZ1vZ__u{Eu4gtr$kUX#lfn;90 z^kpOgNnfh$FTzo2wpFqO;^6pd*0*N6Gms(gztPHmPxR9Ee&*hLHc&Pz3J|@Vxd2NcAHk!17 z_Cs=2DEl}I*94_?FYNh3Znjv=AEuQPEpBfC4l<4&Jw>!e!RCCx3h@IZMy-mi$Sn-TLJ9#k}OKdJ}_CvXEVqUZ2o`Myi=0WETc`YOD z%tR)-MAzcNFB%&U8j@9k(%CY?r8(MwbZaSYq9>g6Fv}9hty1;^W(g@dLB{(CMBQ#} zV$2sotyFEY2g^rOACj}N&M*jslQI>`&aenFSrdt22D$nGS|2LlaF=mgk*< z>jMuM>di!2pwU=!@77?rigplqj!Up2c1VGMs5sG93$XkcCoR%xu$jqo%#Ja;z$>sK z)_`*S#TIoFIj-jvKse}hqBKxpC!A=w@3E%QD1|FzFs28aSDe@{KBfMg zTSzesn-~8M1loukcoWpYR(d@xpFY*RPUb};^XwPVoR#|~$^R~t|J4Gw{3_FrzAl!d z|6KyLBq~kJ+`4$jR^Wur#2pIFcHsL*cn`oNB1u~aYMpbii=xj@@|NO`?1 z`L#x;k~5wy2cEKbaC^y)mPwM#e*HsFOez7~B|rC3uYE z!#=0KX`O)WAu6p$4HVl9rC!(V3PHVb^XDPNSp(y7?n{tPsc}f+UTY=t<13fk)?O@lQRG!IKQb1~rIHeNK_FegcEulL`&Yx!%C_k-Y$1 z1lK#oPG|a_j+*jDdXs!p;ng_zh|j!Fn&qN?_X>Q(m1B9n#%pgOU8hnA#KgSEE-NG2 zq?tpA0w8e3c<{g}UWzt}!Fp^hO^AcX4U-AG&kaN-P<_Wae+}v=G?+MVY`jBmSWtw8uRP3^{sDVZT2N_pG!r>^YS0Dl0ikmTmUrg) z&k2@?eF!UXpHKmEPFPBt%qWn}_BM%Omo+rEK#vH1efx@J|!SVD5Mp;;ABB|_$uxa)`4Ab$j*{eUV*$C9rtxUKp^^OM@9lr z+=*L6NiWhk$6s1!9E5g-HtNNU)*fW$9fim8)~wx!=r>rM7oM@W0qpboyVhqg;znqV zh8_4dVJrsDHjNpp*PUb!Du4m<&ie^OIb=-rp-++7AW?r97YsWBY+U?6dq^%OnQ;D` znQSl|gjGYIYhTk2q0S4H3xGl3OlR0S(fzxrUgX^hsFaB2IVbkz=wU6!o+qOwD(@rn zaVstEJX2xm?7YB9o7tGo6kBk;A!MbA*Ws?dd)!#yVFF=4lmyv= z$0!tjtbU*$7zgd-4#Y!;zt=an7!QG3v)@@bqVINUEpR$hH66RN2}DnGa4S4oP?Hp6 zyD=uQ2)CbRzgO-(Z}n=XFC0%;bc_T7ZxhJq=bE0@RNA{mb$%{#eG*l2H@2E7G^IJT zglocTg*pVdge!3gpI(xPxi!0Txh8Ac*R82u>|9#jO8fGG)#~2j<-vZqU_$76O;X(3 zjYE}KD(z(lJsT}=I2h~3ks*vnEH`D>fIblj1yAQc%OTgLTkmYKf?;GUj;67CiA(pC)zjJPoNVMWTaf%Gh(T9P)vhpLnJPclR_aEDxfT7WGA37 z!;@S}O!M}J2dES-cgBx#Im4cI@K6t`*Ziy*wr5*!@c7^<)~rU~eX;uLL)5LqQ7Of# zq2#3hL%|Q+G9#pQ(Pc} zY72R_JSbmIuJZ;57{}Uyq3h(_u(M%bw?n{xcQ^ZH@BDvnhyQy7A{r@%y1G6tG0Zv| z72yhYiDn%AZX4Qb;GTyKJ<5fRa=MamO{R0G;_ux z(k>g-D)fRZWNgy&Y>U`VhS>k}Gky7%>(Vy;ESibY(jRP1<5-X~iW~iy6G=n}Jy*Ho zCsCpqN_Z<}jXM$HY_0*z+0c78E^JlYPBI0hXloo31+o={<4Htz&Dv;^yMsDVnr&h@ zwnnvLh?^OPtcpC%g9pBiZ2w;L(>_qsvsoKt1~M`Z$8`m_pt-2l)yUzQ+svl3|Lnk$ zV94-t$8lreqfSwa1fqq>+8^xBaiXjDLkFJj7db6>lnL#(78w8)d|H=)?js>M=t2e} zTQuL4C=ww+Cq;~-RN9pf)hE`?$E*0-o-}avI8KinM~uKhSJ~t68r%$U&ewS1?YJrs zTatNy-P(V_EAkw>%T5&yIW;d`6D>Ye);N}$mX1us&99mf@vHYGv-{TaLLvTs!;jZ- zFLQOE<*Fl)G74)x5QZbjtN6YF?jf>IB$%J;++IC=hS`Z36x3+^y z8z_T##4%^HXwR{cY%*P1xp}^b1`ER1abL+4vjt3gP+)~VKaAcubF#t79t6aXIt+A$ z58}$w0@+Q(!G6LmHlFOXTYaZV@j~a~_ZH zOZ5y#S9f}iX z4qA&Yu;a(7BQWqVSE=eZ`uv7pyNR0miWA3QI&p^_y|}-&{tQ2&k?+}t zoLOa1IZ3z~xiI+}?XG3*K5kgcmFIXCngBP{=p~Pi2^b4>uU;W;TNWS5z(?#bN_<4V zgHd2oU0%hB_pxL%hjxuzya3Ej6LAx4#7j-YI|pw)B3@$43Ve5VJl&gw5`{n*n)!`L? z>XpQaz32;G)OP{UMs^&AJHj0n(aZYY1uAur9pn>b5(q@!3j>;dO{tcxPDzLk!MqQS zv~1ig8keU?4jBBZHQI-89Oo?d*pG!Z<-zrv?t_#ywn)Q`W7hPw>``I(08P<#S;;ud z2gWwJ0?6LRqyE`T-0Obm86s$oAB-NFP5!vH63M}6 zTUp|=Qr;WNXW@LJqhq+Wbe2S+QwZ9I2^(i*T;DXaZ#n7n1Qb*nMy|AV*1*REy}Hpi9fqfCaKEcI8W6yVQfY-%0h1zPGv%E*2wUAm9K_7BG`caeDfu$Ma!0C*){4 zQfj-5&8v9#2AjDjaTz}&)a<;h0R&C|<57-k$6J_a?K2keBg4&s5wQj};m8a>SA%0g zSJ1VTWF>Olsi%-Am=<=paHZ)mPT+p+N$j?neJl5SqKo;xPeZkx(M8)j_cF!?Czq`e z;ZJMg%m{LTJ_@HqLuExjH84()GFURpjfmz_x9XE|E%;^it0K2xkvJ$A;q1_!QS1zM z;qh*@Fa+n5x@;akjz!VlZ6S50^zE8kfintjlOr%_z=Nt>92JaQCoC2{n zD7s6fB}tFIL+a#w!ep-4oIu^Lj=g^6cyAUO7QOnE)Zc{86g|^JBoEApV5lxt z%^!3sj{UBcf+tR*Daj^SP|bOZgSq{+m9t73+fzWNa`9!I=)sBtpKJ{)zEFur?OY2S z&^)a~cIzOYnnq}vQN4J&VT7j>%Uu+&%9Kv`P~@wlR~nOZAC=VQU5FTG7}=ClQF||v zC?ji};eXJ(4#;k(%f3}jH9YC0(imk>(!fGOu?!*cg#|egHe0SMpi=#6b5t269k<{X=3=-{G?9l59 z*Gc=T3xBl5pC1Fb$2m#*UxDAF{ZvmP?In2cc0#~{NYGIr>A*<`FDHt$#)A-Lgk{B z!p7hvB<{WcW@4s@^tQq#+agShsG`7O8}4i>;~9s9Abd(5&~YoL0IgN4$4% z95>8X&Y!wxt)*Q&@miNJ4*}a-e>amI5l85sWE$Jxw#Kx*QQOM@BL!x*-Yg#`R;U|b zR4Vsxx-#7NsgV69PDwe}f}<_AaxSfNe%t7wd|CI`LOq6IHR=b68#(K?uh&29Twvwg zanYoS4t#mAuQ2WTqOyoH4*E3{vAlYVFDm5HMavi+yB0yukqOa6wSrKP+HYU_f6#Li z-JZ&h>e-zdeuaVOzhPQ*UR1We3eb5q)$zc3IV4GJt?jwjCSq18XOD}3(l*ai@u+qc#7&oY#nk@*ixA|N3=e+ne5CDC|NPN)QbPB#XFnjx z@0ZMya>4!`MfKrZO!H+C7-w)wIIQ0D*-&yDL?@DK+0NH1sY*vOgc1D#WM9P8#xOR_ z1p0peD%ty0ACncgji7@%##gZ>67Y|B0dY(!F8g@ju^bvU5NZ4@OWEjZ##fj&=I2tu zscctzYT?xz1Ags#vCMRCStYOSQ1$e(BMxV8MyQ&FfTwxM9p)xCbDF8p6{xs$R7<|Mkrpff6}Rar8P4r-si3Nne3*yE{qYtC!gsJ+V^+ zHjyRj&Z1$3>MgONM`^ujRztuzZYwz4O1<>6>11fr1W|#4{gSka@GaO$-8fO*&H>JZ4NjBj&%$B1Z?@ zX!T4YLi-pOaf1aMO?1C&a^dSM;GKHRC2LuSl+~*m(RjH=<0))~aYcG4B*oL})nnUG zn(=jvSp#ZGDC4r9Xmw95w;R>9ts^b~keF2PU!VaDC2Im!<5(D(e7bo_ghUoY)U5iprk1y`beq z$oT;2e;1gPqTE({BJaY!+5Sdmf8$SteaKQnB|?jQ9m>&+@T)2ity8DDQ^TU!&`_Rz zkCi{89XIoN>YOT&ew9``7i@pJKQFFKX-GO*c2qqNbcZomwHng4KkzgLO(;0uo9T^{Pxzf>3Sb6zHh&N}d z>J}W=$V|a0FCDv0cBUD>b_g(E*tGB#Ijsb;N*&RBGhvMtoURl=$~7sBmwo_2ze6an6RV{%b| zIxw*~RZ&K><*~-GYo`~e778=Y%GNgeAbRRoQ{0z9Rzl_JaQ>6 zvBI^K<8Kio(rk%UD62_T%cnS*TE3KZz1o)4rLWE=BdTPO@0u4Q$W$-Bh|$NWbtv3e zGFRwL+YQhN8>^?ax2MzplA;G?{FZj{(|Pe30X(ml?Px*J(J)IvoXWgXPM)P$sDo0_ zAe+=f?zp}8?%A5RKYd#GWQ$labQOtUW#tErY#39IRMoxNoOAE4Ff!s2z4U_`QM7F} zoFxne+iu*vX?UPDBwc(M${T8@d(O!0NF$$x=S3o`&kt0IMUoY+l9rZ|V^Dq-+{-^$ z16cTYY(+0*x8gZc=aVDdL=R@);zX5GxaF>R!O=Zun6U6sxO1%Y%swgH1C9{iyKFz$ z7+@OJ^Q!*t8TVMG*x;5AZ|NPZY7mgy7C+Uy#tQBcWHVs_RGP1LpVB&hXA#;*fYBk- zygENbh8bSMfwl;%oHGX7cN32mZKglajfRXFqIV(OU0yayb$HzuOCckP-RxU;R=kZe z_Fjc_<85BPm(v>r#Ry&W!u2#NM-&mSDfiGD9nSrNPx7LIo_jq#D&w_obA|v& z(4}+LpT%M|$-f-^ao^7NDV4$p;rpOw_0SiGq;6Dhud3ZbRuqOWJ_yXMP^d$AmlZgU zNLCfuN1y@_duMn~3Q2ftg*zDk(YC;1%+{Iuig0`M{J{Xk?S*PiJ=q*5izpHB_O=h! zHIy+2YdFjP8LdC(oJ=ZKDR~MKXR{Ec7Eqe_L6LS_I2 zH!?!)-Y@;5#{%S0y5Y|gLyE~SMmqYIn`*%xj)+x?+=z^LKhIdr*)j=B7{qWyWJMkF z2nJH;Set{+9jot!h4|=AQWs9hX@$XF2VH_u4tEnz-N9?vCyI|u=5A4Z8KuTMj6TGj zwsFm&TbG`RuFST=oYX&uzx~)G6f(BPC@JYA(K9j_)fxb^$jDDL-wj3EDDa3bI1zJn z^hQl@$89;+^? zn`n(!Kr1HKA62(d-(uST&=&b1xj;VM!L@;O>w{AQA+OdjC#6CT0HpVssNzQAI|8l`2HR(4{#LUqDwj((L64Ik zyO@m8g&9igDt9|mZnRCy)rn5uk(DyER$j0xr<_~8nR>FtlQ9eLYL%s-V(DIupk+FF zMQo7wSkv@A#FXi08Ksg_m#;4c@kT1)eWa0#1*4b!N3@I__1M^ou@Swh^_D-MOX9kqikG;=oHQ$jDk5t#WwR+$|4AF_Ew)^$sfodN; zkOAycLZ%{YHetInYN2%9X{xa0#{f*ba679EcPQ$vz?Nvm8vL8hv$4ob`7)Xo=Fa1N zj~2|{)IK->0Lt{3G+_!Dc&+)tesaNzKH6|RG%6;G%ku9d0sc%!p7_c&x2<}4s8tZv zv_j8iN@g9dse#|F#mErm8&a1z`0KJ>gU+>}xfrpPNK<0xd^SqSgH>D>Nya2iEn#X*H6E&#r1wTY~W}>Dn(_^S_XNVB4o@^wK}|h!MHY^AwWkM$j}k0 zE_1oWZe#Z2uT|kvSPgeZHh&usmPaKK|-}mipSoe1TO$gLFXS(Dwc*bi|}quT>5Y08cG>R!WXAeJkh21Lm}!vxJ9;O zlJ69hV8dstd!CJ)8P2#Cx82ZX`v#4+Jh8U${NkvIK@$&4oCaX?)p?DsJjVZ0xZ#Y7 z14yA?J=C2$cScK=RlEM@{_9vQn>cp5bk?rT_<_gxFZ_hDB#~O#lStsbmJ2$G!3%lrV~-7g!L;(Szh|5s**a=J z{niw*PrvSMd3=gSSYSRxYSeN1V>(hT%n2+c73#HyQqQrIT-UBuzl6&Vcyc71T4SO8 z$0H%oD>v?aBQ$Gg3e4nq=9?vLk~G8a)31M97vHN97LAca(0Mpr!71q zzI~|*v{TUlLKJm9x>UcV>>XzB=GTU`7l%T2jEIxLg6pk%BPKT;`Tm)?E1Og(a8MT~ zr>SLTB7M7Lg*Pw7{x+hQ2l!T}8gCg>;~N=4!4$P1Lm}}aa@wPBM;~4Kj(?{0NKJep zjH1JI!pRoNIe-6PlUMJgfZbu>2sUTj`t2LN!vtk-7X_@Pfh!oG2z&9pHs^Qc@DXG1 zUtc0nfBZ9YWm~urqFF!8+w(neC2{6^u$m_ZqNp8*Y%TISy9!s)gqViN(m~?v{>2&?xA^Np>oGP{Q)t6RiaZQN72F7Yl8zyp zwG%;w5O=qv!p8%JDly!x=jS|zmxUqh_E8eF54PONXy46E#Kcu_iJEc1mMB#;4j?g` zH_!dJ%I;AxO0yZyo45D>3w0==y-iC)%R^SSyH6#rSiZm2aEti3&uD5Xcr@5vUHg>? zVj>yR?!AhGHHGAb)p{F-8@I%MJr{nW#gLq{^sTR)cEs8q5%*P~83%wIe~^w8&C3vR zY3i&`(VbXrdsdU^sVuJ+m!h?B5(~|q`SArfOZemBw6@uzJU)=&UH+GUYHfhGPnc(u z_)<;BlFkUb2wjAQgJqtcSZFeuDp_Qd%rj@y3%+;;wpl{SIp3;=51VcV+x~j*bwG&y z6>!2b;r`e(;uhQDHU~>$EF;{Z8!V^yc>g23ISBQ>5pmQ`J)u2Rd(GfvsJ39rl(FS) z)PWcWuVRzVLc*ioL6?*>=uWiQ&)}3%a)h*xsd;+F@g?>7?<6Dy(iG;SAdU#rYcp^!( zIlNEa<6I7E%5{4zBc4&Q?S| zTH*DEdy!Hxz%|*=g(IGxD%;KM_lthBZ8q#lLz>vB*IV2y7N<~NcBr@Ttk+Ckkz;8K zDXpnX?^k~(tc1+eA*f#TTb`a~1wTm8;BQbc3D*7K07Q6s^@&4z3q6r&kwT+ksX=Hh z{6+P>he&bm*k%2|=#Txa}k{-M`sKo^uG~1jIW=E|Gj-3?Nad z#zXDRcCpODH;ir_` zXuoKND&yrMj1tZC#AU@ju{PPiNh07<%zL+k?!jw!)gaF!Xl@hJf4EJ{;LH&8LhQJj zCPD>B+Ldc@mz@E(v640q9b_GJ5(l^5ne6u;oqHQi6sIX7862XfqQq>rkngKahv_zZ zzg`)9CF(Q3Vl%Eu#=8;msl9MapDS7*du+#2ulnN>wv7x20>t4^jI_k;J@LRu+;}&;m6nLbF?ss^ zajsF8rf5uG)M5joMFKc1OP$$>8TwnZ-d|`S|fYSArZz?+nZB+VVFK=?`V6leKfif_0|?QtaBM$ zTy$MONZtHaZO?f)n2>>F_Ma?-JzvwxWK9kDYZ8dPDf-+UYx9Xg5;v@oD-$NJ*+f-k zX_J|Qu49K}AGR2NFgSZ>giw_os%`XF+`Avl8*_^luaZbq$CXnJfKFN_60$SlrZ`pb zfRP+pvjHwKw4*DA_7w9fYwgDcNUrPQgr{t$Mee5~tmU)|SuOG^0P;j=+=;CEn=7BM z9!dDrO|&&FhIbe$0YkNn!i|pX$??q+UysUE1CrVFikdeYLiQ()yGYQ~#GUX~u)#;i zZp*|wY?XMgq`_xMq*IETG=i$LWy*PksFs|B_ur8a10z zJZ*Lm0?|u*1U7dY+kYUeg=#;}$jstTBakQqVJRnVyG*M@Wy}aGE2|H1NYHmsaJU8r z6~UseeQXg3nka@ri!oewdf2#v8!;hR6g1-jTWc3?-aDjNDL`3 z-ysRtU8-<4A%FTfL<4@+Z+P1gZv!SrJY7$-e;n`@I2NUtn{F%49ID(Z&OsmYcHi@< z`KETti|y?6l*djPoGqmOOZ{e&GK~#i6WUK3o`MOdH*Pi}pNP|uijR7$?3^lLFc_2M zJ)jKDL#GZ{1P%nBi>}nBdL3+$T^w)>DoWe95_oA#uH)>u-~Kw;+4DHr_TQ_LEP^-g zLlN#N>LB=jZ;0X)eQh6^oC(o6n|1xGoAtK52Bh-{V{tGvAiPgUerE)E;4cy%XvDKYnNIfA5mS|LtC@YFL`cWC=4; V^~djf->l>fVs!BppMI^DL08|+p{$G=QMT>Eg6u+&JtGGCBL3V-i zHv?jHXE~W4HkWqH3!`k&&Ao0*GB4bzsn6PM=!6J!ae0Auk!|1 z4T7@QX{XyGwDQH9kABP0`u+Ot$rr!#38t__9#eMBYkQXRZ5`hW@|_3$-95%HORhQd z)r#Sm3)?2IEhcfhCqqtj1SSofGK)aKR2KB{RKnTelPr`@Rt2-rXwOKsNhZ~X-_-A4 z`PC>IpQq#W-XFmGjWX{OqEHFa+18JeZFcn`6--}SS%kD4wzT_PaQW!jxKv@UQ$j%0 z1j8dM%le)iLyWL6j+k~6Jww8ww*%|_ENN|2p+GhIFbO_jY5VOxTASmT7zn} zekXp>A4Dk%R@(Db7n25m_FQTu9IMP5|H1$Z2G44Wc_#g)HeDme&I{;0x_P<4e)!bt zmg~057|+=$I8E|!YW!2iQM`Qj*P7VZ*GoTy@yV~nqf7)VB=65A*tICuaTxB%v#h%J z+MzkSE<>p52>E2nJ|F$6zT$vwK02~GVNFl^0r5;FxOqb{^Y-ISrrZs zJvae1&3u-WJ#aW20sK6Het&~%;c*yu=`UfMwP^cBU3n?D;HB3+*rB|&(`+ZUy1i=D zWThuLdnR=j%(-{5JAN{3c$rQc&Pn~IDh_1@`12Ph@Mp^Sm}{AckhrF$2K7+R<~VwS zPV7h#Qz7IVQqYhElwvLV;>MJo;5|TI)X5BPyq4!7-pau|u?v!)v5LC9c@%7ZsIa{G zmFg0$4`GtCK!K+;t(Kgl3%#0p0!FTjq5sf*@zkS=v$7u-DZrcdDF1+JRZ3bdkCwT; z!v%bcsQ|akSx{`0u(qm=N%;R!_fkNSkn%mBJyqpuB}|I+@AwfK_W%G6nwlTu)KHV}S_|4K%xZ72K#RmykfYuQ1 z_&E4*+Pzaxlm~QlEmWBko3{2?JfMX!B~_B;)uaKZU{eb_5pb^DGYc?XQrdR6vdT1`b3MH~qtUEAVpo4K3+S#79Jtus1w{Uby)ovr1W_`g6 z_aDLk9Pfie~$b49nTrzCJ+u$1bH2vH8kXr2gHFiw;kKrIMcUaf9B$`=Iy-A z`%}E$xOU!Vt6}R8d+)bmT?JbcNWg??uYU!lHJo9kUuoGQuj7bn;Yclcy?I9BX1cy^ z2d^g}e)1aHwYY!Mh%|oauOtdS46cYLu4_sylQQ3;+)sqTxU`~oTXnP zi8Yf>8jum>)NRdR@Zm$Zn&<&B3^-R(gN4I7k8y2pPmeaFE%4+#n1m!0k$r2Qc->jt z&g`GAv9s~4WUp4Z#2EYD{ARvwtWH@7*&^jf9BIf<&~fZn-pmXJ)k^xx?d7jtt5q<8 zvjA1;I(Y^=kL02h(nb!b-pCe&wNd~)nrfO*DP`uLWHl9(a#n^hs}`#yvlQY2(lq8 zLC0Wr#GecOVq?`ex9xpD%5mK&WX4gT=PkY>0GXlzX&;Ks_R-l2h!&u4z*f77xCpLll`YP)M2SP7e{|)mfb?v z=qOxtUMVs>R{oAIrnX3?$a@#wzCh>s-p)v<;d^^OB#=TJuC^zu(p zj4uz5FmHo_tq$h6ovL<3VbgVH?|}*)1OS!}#nfz?5sgC>QWe6IP%&y+^9xa3jA*I zc7(8#68^mHaA7c%ng?4%&RX-iavkR@^p%D=Okh#n;OKOXCPg1W9pEm`**n6yWyLk!>;2MV{Vl&PpFVY*HDZ%slYfa(^)>Hb4<>5$X%{ zG~FpMz;{QBB@Z2TeU+lCbN(5np!;MR{ItPl>IA_y;<{O_ZaH@;7%GRw38YR6&L*LJ zwOft7L*x?{D49eLja%Qfyt)~VJr3r}HIs&uzrcM7c^@;MY5ZHZ?)!mKmetIs6$;(8 z^p+89+0I1@ zh+^A(gc^Pjw5;EO1cS3rMJlKAeETPvNKIUBjT(}s3TH9{&+)`0i|=iJk@f%=^Cl3u zIu^l_I)PwWM!s!aa8)pw{XRLBgU#oTZMIXmP+D&*${oMo0p!o!-(Jm6Odmaa(W!lR zurL8W1?P^=_C{y))MK?V{GKh?B-B&>TNwdzS`leRa@a5bgsQ(LJ4-8rv7NwTXHZP= zEgoU*{<4Ix~04xLOfs1AgWP#HBZIC0q6pQx>0+dG>%m8ZUzW$P2;QpuQYdvMUF zU)zuxU--9r_zE-sG9rDL8YYN|QatE0b^uLtS!ySUr|ll3*|Z+5Lc9*L3RYYGt`s?0 zT1lDan;Ly`zpYo|?or)_yzDX3FNp0GZrw2G6mbiWhczd)59;tafGn%7=xDSzdQH9_ z4_mxSV~s|bbhUSk=-vD!wiMHH))YlRUVMa++27we6!kczRMMYDp~ijRgGg&h+GXo4 z#dZjL%%b$sJ@4$s+%ex>K*qw)l~BnTdn7eZvp~NMaqGOEhCf(<+woqL^F`LIbmBI< zTZ4u+OiRIbO8OGi{%aWwSC0iv*dKXfx%JZ&6)sH!0wq%_GT4Q8eBa_MW1%`$ud0(`j%f=RdCckKg+d3OO;(l~lU@ zZo}t(YUD7%vSJPxqZUIwg5@eBYPYMSi7NJc$T)1Kia+uHH;VedzfQYk7q8McHg*Cl z6f1q6CeT=CVSEFC4=;w=X}-hOC{y&gyP{QGUx!4-|H9ZO6H)J}5TmF$O{5#SX6%N( zhQKs=)(po!+D#>U;N$_x>SQJd)nychrj(Uis7U>j_p|FF`wJN>8SlbvBV+Ueuh3 zlgbl6_VZwRZ*Li`VS*D}X!8YQ&`*m9gVDbqs;MF!K)nsrLL8eZzB)TWC8L|iT|caW zHeD>CA?iGA!63QW>uivoN6RWNyeV{W%g~YrS>j{jotD3stC%`)!LA-+#5`o-S77|( z0cNlRv87vap@;jKmPY^u53LZMG8O?K)#Pi_Ulps+pQD`w7INH_&*}+hd-ku$6yg4C z@1h+S9U0S*pF*qI7#KczwAApgoL9qB@H}Wh2SszP`R_na5k6o!f|jDh3iOaj3L-Zb zSi(lpn(o+neU{;RYatgNvGNp@V&?}umB=ZGkJ=Q)a@oCI+kMRPPqCilS@18Z4xMJc z+bD~~XV-NX8h6X#uS5Wy>4A0L=YQ1Q z|GQM&*!xe5uDzAH5%};?eD;RpTjw7>{{Dbm>hN}Er2u1XE%0mTJ<5E_ojSXiwf<@e z)co|T0d9 zp$f*h2Ab+rGoo5hrD#>t9R0+mQQcF&)~_Ja6FH2v$`$v}iM)=U%rqpRSjPI=70&jR zgH7g-T~40jBYfOR+7xo{mMYVaySA)@Od$Aa)~ja&KgfC|VG%^C_{m$aou0`na#A&c zG>1UDk;obsj~~yCi3UE z-R^wSK}PZ%Af4$PamQAYLBo*Nms0Sz2_|wBo{C=Lzj%)?l%Aur`i{4w#Qb6rv{1z+ z;_>Mnx#x?tW9WA`HQY4sokgc&MkmP@{omF7FDfp`rrz~nz7^*PM=DixzN5- zY*bVl3g~T+WjvvVZN%Uto-$e?$*<%n${<;>L6VjfFHN~9iDww*#*Tosw`-ixwHb&XfN2%S+9}H_*3^%`j1<| z^?FxPemz@l3~dkU%$bbmrf$m6Q==bXsr!rZ279Mfnl1cPP~}}Uh^ENJcF|39kxv?h z5Tkf_ziTIPo3|ZQ0P(* zzT{1i#)t#GFh3SH$s%q*S^JM0d>@7h50q-c8bC3tUCX*IRWKn*#&IxAUY{ZrtvQqLyhpyhvhP;*BL8=z?t { + await loadJS('web_editor_tinymce/static/lib/tinymce/tinymce.min.js'); + }); + onMounted(async () => { + await this.initEditor(); + }) + useEffect(() => { + this.updateEditor(); + }) + onWillUnmount(async () => { + this.removeEditor() + }) + } + + get value() { + return this.props.record.data[this.props.name] || ''; + } + + get theme() { + return cookie.get('color_scheme'); + } + + get isTranslatable() { + return this.props.record.fields[this.props.name].translate; + } + + get tinymceConfig() { + return { + ...this.defaultTinymceConfig, + menubar: !this.props.readonly && 'file edit view insert format tools table help', + toolbar: !this.props.readonly && 'undo redo | accordion accordionremove | blocks fontfamily fontsize | bold italic underline strikethrough | align numlist bullist | link image | table media | lineheight outdent indent| forecolor backcolor removeformat | charmap emoticons | code fullscreen preview | save print | pagebreak anchor codesample | ltr rtl', + readonly: this.props.readonly, + setup: this.setupEditor.bind(this), + init_instance_callback: this.initCallback.bind(this), + } + } + + setupEditor(editor) { + editor.on('change', e => { + const value = tinymce.activeEditor.getContent(); + if (value !== this.value) { + this.props.record.update({[this.props.name]: value}) + } + }); + } + + removeEditor() { + if (this.editor) { + this.editor.remove() + } + } + + async initEditor() { + this.removeEditor() + const config = this.tinymceConfig; + this.editor = (await tinymce.init(config))[0]; + } + + initCallback(editor) { + editor.setContent(this.value); + } + + updateEditor() { + if (!this.editor || this.props.record.dirty) { + return + } + this.editor.setContent(this.value); + } + +} + +export const fieldTinyMCE = { + component: FieldTinyMCE, + displayName: _t('TinyMCE'), + supportedTypes: ['html', 'text'], + extractProps: ({attrs, options}) => ({ + placeholder: attrs.placeholder, + dynamicPlaceholder: options?.dynamic_placeholder || false, + dynamicPlaceholderModelReferenceField: + options?.dynamic_placeholder_model_reference_field || '', + }), +} + +registry.category('fields').add('tinymce', fieldTinyMCE); diff --git a/web_editor_tinymce/static/src/field_tinymce/field_tinymce.scss b/web_editor_tinymce/static/src/field_tinymce/field_tinymce.scss new file mode 100644 index 000000000..ed817fb39 --- /dev/null +++ b/web_editor_tinymce/static/src/field_tinymce/field_tinymce.scss @@ -0,0 +1,3 @@ +.o_field_tinymce { + width: 100%; +} diff --git a/web_editor_tinymce/static/src/field_tinymce/field_tinymce.xml b/web_editor_tinymce/static/src/field_tinymce/field_tinymce.xml new file mode 100644 index 000000000..301ffd7e9 --- /dev/null +++ b/web_editor_tinymce/static/src/field_tinymce/field_tinymce.xml @@ -0,0 +1,21 @@ + +