You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

570 lines
24 KiB

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <meta name="generator" content="Docutils 0.14: http://docutils.sourceforge.net/" />
  7. <title>2D matrix for x2many fields</title>
  8. <style type="text/css">
  9. /*
  10. :Author: David Goodger (goodger@python.org)
  11. :Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
  12. :Copyright: This stylesheet has been placed in the public domain.
  13. Default cascading style sheet for the HTML output of Docutils.
  14. See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
  15. customize this style sheet.
  16. */
  17. /* used to remove borders from tables and images */
  18. .borderless, table.borderless td, table.borderless th {
  19. border: 0 }
  20. table.borderless td, table.borderless th {
  21. /* Override padding for "table.docutils td" with "! important".
  22. The right padding separates the table cells. */
  23. padding: 0 0.5em 0 0 ! important }
  24. .first {
  25. /* Override more specific margin styles with "! important". */
  26. margin-top: 0 ! important }
  27. .last, .with-subtitle {
  28. margin-bottom: 0 ! important }
  29. .hidden {
  30. display: none }
  31. .subscript {
  32. vertical-align: sub;
  33. font-size: smaller }
  34. .superscript {
  35. vertical-align: super;
  36. font-size: smaller }
  37. a.toc-backref {
  38. text-decoration: none ;
  39. color: black }
  40. blockquote.epigraph {
  41. margin: 2em 5em ; }
  42. dl.docutils dd {
  43. margin-bottom: 0.5em }
  44. object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
  45. overflow: hidden;
  46. }
  47. /* Uncomment (and remove this text!) to get bold-faced definition list terms
  48. dl.docutils dt {
  49. font-weight: bold }
  50. */
  51. div.abstract {
  52. margin: 2em 5em }
  53. div.abstract p.topic-title {
  54. font-weight: bold ;
  55. text-align: center }
  56. div.admonition, div.attention, div.caution, div.danger, div.error,
  57. div.hint, div.important, div.note, div.tip, div.warning {
  58. margin: 2em ;
  59. border: medium outset ;
  60. padding: 1em }
  61. div.admonition p.admonition-title, div.hint p.admonition-title,
  62. div.important p.admonition-title, div.note p.admonition-title,
  63. div.tip p.admonition-title {
  64. font-weight: bold ;
  65. font-family: sans-serif }
  66. div.attention p.admonition-title, div.caution p.admonition-title,
  67. div.danger p.admonition-title, div.error p.admonition-title,
  68. div.warning p.admonition-title, .code .error {
  69. color: red ;
  70. font-weight: bold ;
  71. font-family: sans-serif }
  72. /* Uncomment (and remove this text!) to get reduced vertical space in
  73. compound paragraphs.
  74. div.compound .compound-first, div.compound .compound-middle {
  75. margin-bottom: 0.5em }
  76. div.compound .compound-last, div.compound .compound-middle {
  77. margin-top: 0.5em }
  78. */
  79. div.dedication {
  80. margin: 2em 5em ;
  81. text-align: center ;
  82. font-style: italic }
  83. div.dedication p.topic-title {
  84. font-weight: bold ;
  85. font-style: normal }
  86. div.figure {
  87. margin-left: 2em ;
  88. margin-right: 2em }
  89. div.footer, div.header {
  90. clear: both;
  91. font-size: smaller }
  92. div.line-block {
  93. display: block ;
  94. margin-top: 1em ;
  95. margin-bottom: 1em }
  96. div.line-block div.line-block {
  97. margin-top: 0 ;
  98. margin-bottom: 0 ;
  99. margin-left: 1.5em }
  100. div.sidebar {
  101. margin: 0 0 0.5em 1em ;
  102. border: medium outset ;
  103. padding: 1em ;
  104. background-color: #ffffee ;
  105. width: 40% ;
  106. float: right ;
  107. clear: right }
  108. div.sidebar p.rubric {
  109. font-family: sans-serif ;
  110. font-size: medium }
  111. div.system-messages {
  112. margin: 5em }
  113. div.system-messages h1 {
  114. color: red }
  115. div.system-message {
  116. border: medium outset ;
  117. padding: 1em }
  118. div.system-message p.system-message-title {
  119. color: red ;
  120. font-weight: bold }
  121. div.topic {
  122. margin: 2em }
  123. h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
  124. h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
  125. margin-top: 0.4em }
  126. h1.title {
  127. text-align: center }
  128. h2.subtitle {
  129. text-align: center }
  130. hr.docutils {
  131. width: 75% }
  132. img.align-left, .figure.align-left, object.align-left, table.align-left {
  133. clear: left ;
  134. float: left ;
  135. margin-right: 1em }
  136. img.align-right, .figure.align-right, object.align-right, table.align-right {
  137. clear: right ;
  138. float: right ;
  139. margin-left: 1em }
  140. img.align-center, .figure.align-center, object.align-center {
  141. display: block;
  142. margin-left: auto;
  143. margin-right: auto;
  144. }
  145. table.align-center {
  146. margin-left: auto;
  147. margin-right: auto;
  148. }
  149. .align-left {
  150. text-align: left }
  151. .align-center {
  152. clear: both ;
  153. text-align: center }
  154. .align-right {
  155. text-align: right }
  156. /* reset inner alignment in figures */
  157. div.align-right {
  158. text-align: inherit }
  159. /* div.align-center * { */
  160. /* text-align: left } */
  161. .align-top {
  162. vertical-align: top }
  163. .align-middle {
  164. vertical-align: middle }
  165. .align-bottom {
  166. vertical-align: bottom }
  167. ol.simple, ul.simple {
  168. margin-bottom: 1em }
  169. ol.arabic {
  170. list-style: decimal }
  171. ol.loweralpha {
  172. list-style: lower-alpha }
  173. ol.upperalpha {
  174. list-style: upper-alpha }
  175. ol.lowerroman {
  176. list-style: lower-roman }
  177. ol.upperroman {
  178. list-style: upper-roman }
  179. p.attribution {
  180. text-align: right ;
  181. margin-left: 50% }
  182. p.caption {
  183. font-style: italic }
  184. p.credits {
  185. font-style: italic ;
  186. font-size: smaller }
  187. p.label {
  188. white-space: nowrap }
  189. p.rubric {
  190. font-weight: bold ;
  191. font-size: larger ;
  192. color: maroon ;
  193. text-align: center }
  194. p.sidebar-title {
  195. font-family: sans-serif ;
  196. font-weight: bold ;
  197. font-size: larger }
  198. p.sidebar-subtitle {
  199. font-family: sans-serif ;
  200. font-weight: bold }
  201. p.topic-title {
  202. font-weight: bold }
  203. pre.address {
  204. margin-bottom: 0 ;
  205. margin-top: 0 ;
  206. font: inherit }
  207. pre.literal-block, pre.doctest-block, pre.math, pre.code {
  208. margin-left: 2em ;
  209. margin-right: 2em }
  210. pre.code .ln { color: grey; } /* line numbers */
  211. pre.code, code { background-color: #eeeeee }
  212. pre.code .comment, code .comment { color: #5C6576 }
  213. pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
  214. pre.code .literal.string, code .literal.string { color: #0C5404 }
  215. pre.code .name.builtin, code .name.builtin { color: #352B84 }
  216. pre.code .deleted, code .deleted { background-color: #DEB0A1}
  217. pre.code .inserted, code .inserted { background-color: #A3D289}
  218. span.classifier {
  219. font-family: sans-serif ;
  220. font-style: oblique }
  221. span.classifier-delimiter {
  222. font-family: sans-serif ;
  223. font-weight: bold }
  224. span.interpreted {
  225. font-family: sans-serif }
  226. span.option {
  227. white-space: nowrap }
  228. span.pre {
  229. white-space: pre }
  230. span.problematic {
  231. color: red }
  232. span.section-subtitle {
  233. /* font-size relative to parent (h1..h6 element) */
  234. font-size: 80% }
  235. table.citation {
  236. border-left: solid 1px gray;
  237. margin-left: 1px }
  238. table.docinfo {
  239. margin: 2em 4em }
  240. table.docutils {
  241. margin-top: 0.5em ;
  242. margin-bottom: 0.5em }
  243. table.footnote {
  244. border-left: solid 1px black;
  245. margin-left: 1px }
  246. table.docutils td, table.docutils th,
  247. table.docinfo td, table.docinfo th {
  248. padding-left: 0.5em ;
  249. padding-right: 0.5em ;
  250. vertical-align: top }
  251. table.docutils th.field-name, table.docinfo th.docinfo-name {
  252. font-weight: bold ;
  253. text-align: left ;
  254. white-space: nowrap ;
  255. padding-left: 0 }
  256. /* "booktabs" style (no vertical lines) */
  257. table.docutils.booktabs {
  258. border: 0px;
  259. border-top: 2px solid;
  260. border-bottom: 2px solid;
  261. border-collapse: collapse;
  262. }
  263. table.docutils.booktabs * {
  264. border: 0px;
  265. }
  266. table.docutils.booktabs th {
  267. border-bottom: thin solid;
  268. text-align: left;
  269. }
  270. h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
  271. h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
  272. font-size: 100% }
  273. ul.auto-toc {
  274. list-style-type: none }
  275. </style>
  276. </head>
  277. <body>
  278. <div class="document" id="d-matrix-for-x2many-fields">
  279. <h1 class="title">2D matrix for x2many fields</h1>
  280. <!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  281. !! This file is generated by oca-gen-addon-readme !!
  282. !! changes will be overwritten. !!
  283. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
  284. <p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/web/tree/12.0/web_widget_x2many_2d_matrix"><img alt="OCA/web" src="https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/web-12-0/web-12-0-web_widget_x2many_2d_matrix"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/162/12.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
  285. <p>This module allows to show an x2many field with 3-tuples
  286. ($x_value, $y_value, $value) in a table</p>
  287. <table border="1" class="docutils">
  288. <colgroup>
  289. <col width="30%" />
  290. <col width="35%" />
  291. <col width="35%" />
  292. </colgroup>
  293. <thead valign="bottom">
  294. <tr><th class="head">&nbsp;</th>
  295. <th class="head">$x_value1</th>
  296. <th class="head">$x_value2</th>
  297. </tr>
  298. </thead>
  299. <tbody valign="top">
  300. <tr><td>$y_value1</td>
  301. <td>$value(1/1)</td>
  302. <td>$value(2/1)</td>
  303. </tr>
  304. <tr><td>$y_value2</td>
  305. <td>$value(1/2)</td>
  306. <td>$value(2/2)</td>
  307. </tr>
  308. </tbody>
  309. </table>
  310. <p>where <cite>value(n/n)</cite> is editable.</p>
  311. <p>An example use case would be: Select some projects and some employees so that
  312. a manager can easily fill in the planned_hours for one task per employee. The
  313. result could look like this:</p>
  314. <img alt="Screenshot" src="/web_widget_x2many_2d_matrix/static/description/screenshot.png" />
  315. <p>The beauty of this is that you have an arbitrary amount of columns with this
  316. widget, trying to get this in standard x2many lists involves some quite ugly
  317. hacks.</p>
  318. <p><strong>Table of contents</strong></p>
  319. <div class="contents local topic" id="contents">
  320. <ul class="simple">
  321. <li><a class="reference internal" href="#usage" id="id1">Usage</a><ul>
  322. <li><a class="reference internal" href="#example" id="id2">Example</a></li>
  323. </ul>
  324. </li>
  325. <li><a class="reference internal" href="#known-issues-roadmap" id="id3">Known issues / Roadmap</a></li>
  326. <li><a class="reference internal" href="#bug-tracker" id="id4">Bug Tracker</a></li>
  327. <li><a class="reference internal" href="#credits" id="id5">Credits</a><ul>
  328. <li><a class="reference internal" href="#authors" id="id6">Authors</a></li>
  329. <li><a class="reference internal" href="#contributors" id="id7">Contributors</a></li>
  330. <li><a class="reference internal" href="#maintainers" id="id8">Maintainers</a></li>
  331. </ul>
  332. </li>
  333. </ul>
  334. </div>
  335. <div class="section" id="usage">
  336. <h1><a class="toc-backref" href="#id1">Usage</a></h1>
  337. <p>Use this widget by saying:</p>
  338. <pre class="literal-block">
  339. &lt;field name=&quot;my_field&quot; widget=&quot;x2many_2d_matrix&quot; /&gt;
  340. </pre>
  341. <p>This assumes that my_field refers to a model with the fields <cite>x</cite>, <cite>y</cite> and
  342. <cite>value</cite>. If your fields are named differently, pass the correct names as
  343. attributes:</p>
  344. <pre class="code xml literal-block">
  345. <span class="nt">&lt;field</span> <span class="na">name=</span><span class="s">&quot;my_field&quot;</span> <span class="na">widget=</span><span class="s">&quot;x2many_2d_matrix&quot;</span> <span class="na">field_x_axis=</span><span class="s">&quot;my_field1&quot;</span> <span class="na">field_y_axis=</span><span class="s">&quot;my_field2&quot;</span> <span class="na">field_value=</span><span class="s">&quot;my_field3&quot;</span><span class="nt">&gt;</span>
  346. <span class="nt">&lt;tree&gt;</span>
  347. <span class="nt">&lt;field</span> <span class="na">name=</span><span class="s">&quot;my_field&quot;</span><span class="nt">/&gt;</span>
  348. <span class="nt">&lt;field</span> <span class="na">name=</span><span class="s">&quot;my_field1&quot;</span><span class="nt">/&gt;</span>
  349. <span class="nt">&lt;field</span> <span class="na">name=</span><span class="s">&quot;my_field2&quot;</span><span class="nt">/&gt;</span>
  350. <span class="nt">&lt;field</span> <span class="na">name=</span><span class="s">&quot;my_field3&quot;</span><span class="nt">/&gt;</span>
  351. <span class="nt">&lt;/tree&gt;</span>
  352. <span class="nt">&lt;/field&gt;</span>
  353. </pre>
  354. <p>You can pass the following parameters:</p>
  355. <dl class="docutils">
  356. <dt>field_x_axis</dt>
  357. <dd>The field that indicates the x value of a point</dd>
  358. <dt>field_y_axis</dt>
  359. <dd>The field that indicates the y value of a point</dd>
  360. <dt>field_label_x_axis</dt>
  361. <dd>Use another field to display in the table header</dd>
  362. <dt>field_label_y_axis</dt>
  363. <dd>Use another field to display in the table header</dd>
  364. <dt>field_value</dt>
  365. <dd>Show this field as value</dd>
  366. <dt>show_row_totals</dt>
  367. <dd>If field_value is a numeric field, it indicates if you want to calculate
  368. row totals. True by default</dd>
  369. <dt>show_column_totals</dt>
  370. <dd>If field_value is a numeric field, it indicates if you want to calculate
  371. column totals. True by default</dd>
  372. </dl>
  373. <div class="section" id="example">
  374. <h2><a class="toc-backref" href="#id2">Example</a></h2>
  375. <p>You need a data structure already filled with values. Let’s assume we want to
  376. use this widget in a wizard that lets the user fill in planned hours for one
  377. task per project per user. In this case, we can use <tt class="docutils literal">project.task</tt> as our
  378. data model and point to it from our wizard. The crucial part is that we fill
  379. the field in the default function:</p>
  380. <pre class="code python literal-block">
  381. <span class="kn">from</span> <span class="nn">odoo</span> <span class="kn">import</span> <span class="n">fields</span><span class="p">,</span> <span class="n">models</span>
  382. <span class="k">class</span> <span class="nc">MyWizard</span><span class="p">(</span><span class="n">models</span><span class="o">.</span><span class="n">TransientModel</span><span class="p">):</span>
  383. <span class="n">_name</span> <span class="o">=</span> <span class="s1">'my.wizard'</span>
  384. <span class="k">def</span> <span class="nf">_default_task_ids</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  385. <span class="c1"># your list of project should come from the context, some selection</span>
  386. <span class="c1"># in a previous wizard or wherever else</span>
  387. <span class="n">projects</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s1">'project.project'</span><span class="p">]</span><span class="o">.</span><span class="n">browse</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span>
  388. <span class="c1"># same with users</span>
  389. <span class="n">users</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">env</span><span class="p">[</span><span class="s1">'res.users'</span><span class="p">]</span><span class="o">.</span><span class="n">browse</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">])</span>
  390. <span class="k">return</span> <span class="p">[</span>
  391. <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">{</span>
  392. <span class="s1">'name'</span><span class="p">:</span> <span class="s1">'Sample task name'</span><span class="p">,</span>
  393. <span class="s1">'project_id'</span><span class="p">:</span> <span class="n">p</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
  394. <span class="s1">'user_id'</span><span class="p">:</span> <span class="n">u</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
  395. <span class="s1">'planned_hours'</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
  396. <span class="s1">'message_needaction'</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
  397. <span class="s1">'date_deadline'</span><span class="p">:</span> <span class="n">fields</span><span class="o">.</span><span class="n">Date</span><span class="o">.</span><span class="n">today</span><span class="p">(),</span>
  398. <span class="p">})</span>
  399. <span class="c1"># if the project doesn't have a task for the user,</span>
  400. <span class="c1"># create a new one</span>
  401. <span class="k">if</span> <span class="ow">not</span> <span class="n">p</span><span class="o">.</span><span class="n">task_ids</span><span class="o">.</span><span class="n">filtered</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">user_id</span> <span class="o">==</span> <span class="n">u</span><span class="p">)</span> <span class="k">else</span>
  402. <span class="c1"># otherwise, return the task</span>
  403. <span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">task_ids</span><span class="o">.</span><span class="n">filtered</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">user_id</span> <span class="o">==</span> <span class="n">u</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
  404. <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">projects</span>
  405. <span class="k">for</span> <span class="n">u</span> <span class="ow">in</span> <span class="n">users</span>
  406. <span class="p">]</span>
  407. <span class="n">task_ids</span> <span class="o">=</span> <span class="n">fields</span><span class="o">.</span><span class="n">Many2many</span><span class="p">(</span><span class="s1">'project.task'</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">_default_task_ids</span><span class="p">)</span>
  408. </pre>
  409. <p>Now in our wizard, we can use:</p>
  410. <pre class="code xml literal-block">
  411. <span class="nt">&lt;field</span> <span class="na">name=</span><span class="s">&quot;task_ids&quot;</span> <span class="na">widget=</span><span class="s">&quot;x2many_2d_matrix&quot;</span> <span class="na">field_x_axis=</span><span class="s">&quot;project_id&quot;</span> <span class="na">field_y_axis=</span><span class="s">&quot;user_id&quot;</span> <span class="na">field_value=</span><span class="s">&quot;planned_hours&quot;</span><span class="nt">&gt;</span>
  412. <span class="nt">&lt;tree&gt;</span>
  413. <span class="nt">&lt;field</span> <span class="na">name=</span><span class="s">&quot;task_ids&quot;</span><span class="nt">/&gt;</span>
  414. <span class="nt">&lt;field</span> <span class="na">name=</span><span class="s">&quot;project_id&quot;</span><span class="nt">/&gt;</span>
  415. <span class="nt">&lt;field</span> <span class="na">name=</span><span class="s">&quot;user_id&quot;</span><span class="nt">/&gt;</span>
  416. <span class="nt">&lt;field</span> <span class="na">name=</span><span class="s">&quot;planned_hours&quot;</span><span class="nt">/&gt;</span>
  417. <span class="nt">&lt;/tree&gt;</span>
  418. <span class="nt">&lt;/field&gt;</span>
  419. </pre>
  420. </div>
  421. </div>
  422. <div class="section" id="known-issues-roadmap">
  423. <h1><a class="toc-backref" href="#id3">Known issues / Roadmap</a></h1>
  424. <ul class="simple">
  425. <li>Support extra attributes on each field cell via <cite>field_extra_attrs</cite> param.
  426. We could set a cell as not editable, required or readonly for instance.
  427. The <cite>readonly</cite> case will also give the ability
  428. to click on m2o to open related records.</li>
  429. <li>Support limit total records in the matrix. Ref: <a class="reference external" href="https://github.com/OCA/web/issues/901">https://github.com/OCA/web/issues/901</a></li>
  430. <li>Support cell traversal through keyboard arrows.</li>
  431. <li>Entering the widget from behind by pressing <tt class="docutils literal">Shift+TAB</tt> in your keyboard
  432. will enter into the 1st cell until <a class="reference external" href="https://github.com/odoo/odoo/pull/26490">https://github.com/odoo/odoo/pull/26490</a>
  433. is merged.</li>
  434. <li>Support extra invisible fields inside each cell.</li>
  435. </ul>
  436. </div>
  437. <div class="section" id="bug-tracker">
  438. <h1><a class="toc-backref" href="#id4">Bug Tracker</a></h1>
  439. <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/web/issues">GitHub Issues</a>.
  440. In case of trouble, please check there if your issue has already been reported.
  441. If you spotted it first, help us smashing it by providing a detailed and welcomed
  442. <a class="reference external" href="https://github.com/OCA/web/issues/new?body=module:%20web_widget_x2many_2d_matrix%0Aversion:%2012.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
  443. <p>Do not contact contributors directly about support or help with technical issues.</p>
  444. </div>
  445. <div class="section" id="credits">
  446. <h1><a class="toc-backref" href="#id5">Credits</a></h1>
  447. <div class="section" id="authors">
  448. <h2><a class="toc-backref" href="#id6">Authors</a></h2>
  449. <ul class="simple">
  450. <li>Therp BV</li>
  451. <li>Tecnativa</li>
  452. <li>Camptocamp</li>
  453. </ul>
  454. </div>
  455. <div class="section" id="contributors">
  456. <h2><a class="toc-backref" href="#id7">Contributors</a></h2>
  457. <ul class="simple">
  458. <li>Holger Brunn &lt;<a class="reference external" href="mailto:hbrunn&#64;therp.nl">hbrunn&#64;therp.nl</a>&gt;</li>
  459. <li>Pedro M. Baeza &lt;<a class="reference external" href="mailto:pedro.baeza&#64;tecnativa.com">pedro.baeza&#64;tecnativa.com</a>&gt;</li>
  460. <li>Artem Kostyuk &lt;<a class="reference external" href="mailto:a.kostyuk&#64;mobilunity.com">a.kostyuk&#64;mobilunity.com</a>&gt;</li>
  461. <li>Simone Orsi &lt;<a class="reference external" href="mailto:simone.orsi&#64;camptocamp.com">simone.orsi&#64;camptocamp.com</a>&gt;</li>
  462. <li>Timon Tschanz &lt;<a class="reference external" href="mailto:timon.tschanz&#64;camptocamp.com">timon.tschanz&#64;camptocamp.com</a>&gt;</li>
  463. <li>Jairo Llopis &lt;<a class="reference external" href="mailto:jairo.llopis&#64;tecnativa.com">jairo.llopis&#64;tecnativa.com</a>&gt;</li>
  464. <li>Dennis Sluijk &lt;<a class="reference external" href="mailto:d.sluijk&#64;onestein.nl">d.sluijk&#64;onestein.nl</a>&gt;</li>
  465. <li>Alexey Pelykh &lt;<a class="reference external" href="mailto:alexey.pelykh&#64;brainbeanapps.com">alexey.pelykh&#64;brainbeanapps.com</a>&gt;</li>
  466. </ul>
  467. </div>
  468. <div class="section" id="maintainers">
  469. <h2><a class="toc-backref" href="#id8">Maintainers</a></h2>
  470. <p>This module is maintained by the OCA.</p>
  471. <a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
  472. <p>OCA, or the Odoo Community Association, is a nonprofit organization whose
  473. mission is to support the collaborative development of Odoo features and
  474. promote its widespread use.</p>
  475. <p>This module is part of the <a class="reference external" href="https://github.com/OCA/web/tree/12.0/web_widget_x2many_2d_matrix">OCA/web</a> project on GitHub.</p>
  476. <p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
  477. </div>
  478. </div>
  479. </div>
  480. </body>
  481. </html>