From e975a9849e76fce45b4e4958ac0240755013fc32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandre=20K=C3=BChn?= Date: Mon, 12 Sep 2022 11:04:48 +0000 Subject: [PATCH] [IMP] mail: make emoji picker available in knowledge Introduce header actions so that emoji picker in knowledge can have an action to remove emoji. Task-2980528 closes odoo/odoo#100010 Related: odoo/enterprise#31231 Signed-off-by: Louis Wicket (wil) --- .../emoji_category_bar_view.xml | 2 +- .../emoji_picker_header_action_list_view.js | 23 ++++++++ .../emoji_picker_header_action_list_view.xml | 10 ++++ .../emoji_picker_header_action_view.js | 23 ++++++++ .../emoji_picker_header_action_view.xml | 16 ++++++ .../emoji_picker_header_view.js | 23 ++++++++ .../emoji_picker_header_view.xml | 12 ++++ .../emoji_picker_view/emoji_picker_view.xml | 2 +- .../components/legacy_emoji/legacy_emoji.js | 16 ------ .../components/legacy_emoji/legacy_emoji.xml | 10 ---- .../legacy_emoji_list/legacy_emoji_list.js | 57 ------------------- .../legacy_emoji_list/legacy_emoji_list.scss | 9 --- .../legacy_emoji_list/legacy_emoji_list.xml | 14 ----- .../src/models/emoji_category_bar_view.js | 11 +++- .../static/src/models/emoji_category_view.js | 11 ++-- .../mail/static/src/models/emoji_grid_view.js | 3 + .../emoji_picker_header_action_list_view.js | 28 +++++++++ .../models/emoji_picker_header_action_view.js | 39 +++++++++++++ .../src/models/emoji_picker_header_view.js | 25 ++++++++ .../static/src/models/emoji_picker_view.js | 12 ++-- 20 files changed, 226 insertions(+), 120 deletions(-) create mode 100644 addons/mail/static/src/components/emoji_picker_header_action_list_view/emoji_picker_header_action_list_view.js create mode 100644 addons/mail/static/src/components/emoji_picker_header_action_list_view/emoji_picker_header_action_list_view.xml create mode 100644 addons/mail/static/src/components/emoji_picker_header_action_view/emoji_picker_header_action_view.js create mode 100644 addons/mail/static/src/components/emoji_picker_header_action_view/emoji_picker_header_action_view.xml create mode 100644 addons/mail/static/src/components/emoji_picker_header_view/emoji_picker_header_view.js create mode 100644 addons/mail/static/src/components/emoji_picker_header_view/emoji_picker_header_view.xml delete mode 100644 addons/mail/static/src/components/legacy_emoji/legacy_emoji.js delete mode 100644 addons/mail/static/src/components/legacy_emoji/legacy_emoji.xml delete mode 100644 addons/mail/static/src/components/legacy_emoji_list/legacy_emoji_list.js delete mode 100644 addons/mail/static/src/components/legacy_emoji_list/legacy_emoji_list.scss delete mode 100644 addons/mail/static/src/components/legacy_emoji_list/legacy_emoji_list.xml create mode 100644 addons/mail/static/src/models/emoji_picker_header_action_list_view.js create mode 100644 addons/mail/static/src/models/emoji_picker_header_action_view.js create mode 100644 addons/mail/static/src/models/emoji_picker_header_view.js diff --git a/addons/mail/static/src/components/emoji_category_bar_view/emoji_category_bar_view.xml b/addons/mail/static/src/components/emoji_category_bar_view/emoji_category_bar_view.xml index 7b4b0d39f8e..975afe29f72 100644 --- a/addons/mail/static/src/components/emoji_category_bar_view/emoji_category_bar_view.xml +++ b/addons/mail/static/src/components/emoji_category_bar_view/emoji_category_bar_view.xml @@ -2,7 +2,7 @@ -
+
diff --git a/addons/mail/static/src/components/emoji_picker_header_action_list_view/emoji_picker_header_action_list_view.js b/addons/mail/static/src/components/emoji_picker_header_action_list_view/emoji_picker_header_action_list_view.js new file mode 100644 index 00000000000..4aff5bae2ae --- /dev/null +++ b/addons/mail/static/src/components/emoji_picker_header_action_list_view/emoji_picker_header_action_list_view.js @@ -0,0 +1,23 @@ +/** @odoo-module **/ + +import { registerMessagingComponent } from '@mail/utils/messaging_component'; + +const { Component } = owl; + +export class EmojiPickerHeaderActionListView extends Component { + + /** + * @returns {EmojiPickerHeaderActionListView} + */ + get emojiPickerHeaderActionListView() { + return this.props.record; + } + +} + +Object.assign(EmojiPickerHeaderActionListView, { + props: { record: Object }, + template: 'mail.EmojiPickerHeaderActionListView', +}); + +registerMessagingComponent(EmojiPickerHeaderActionListView); diff --git a/addons/mail/static/src/components/emoji_picker_header_action_list_view/emoji_picker_header_action_list_view.xml b/addons/mail/static/src/components/emoji_picker_header_action_list_view/emoji_picker_header_action_list_view.xml new file mode 100644 index 00000000000..f6c7728e5cf --- /dev/null +++ b/addons/mail/static/src/components/emoji_picker_header_action_list_view/emoji_picker_header_action_list_view.xml @@ -0,0 +1,10 @@ + + + + +
+ +
+
+ +
diff --git a/addons/mail/static/src/components/emoji_picker_header_action_view/emoji_picker_header_action_view.js b/addons/mail/static/src/components/emoji_picker_header_action_view/emoji_picker_header_action_view.js new file mode 100644 index 00000000000..f9c4e9351fb --- /dev/null +++ b/addons/mail/static/src/components/emoji_picker_header_action_view/emoji_picker_header_action_view.js @@ -0,0 +1,23 @@ +/** @odoo-module **/ + +import { registerMessagingComponent } from '@mail/utils/messaging_component'; + +const { Component } = owl; + +export class EmojiPickerHeaderActionView extends Component { + + /** + * @returns {EmojiPickerHeaderActionView} + */ + get emojiPickerHeaderActionView() { + return this.props.record; + } + +} + +Object.assign(EmojiPickerHeaderActionView, { + props: { record: Object }, + template: 'mail.EmojiPickerHeaderActionView', +}); + +registerMessagingComponent(EmojiPickerHeaderActionView); diff --git a/addons/mail/static/src/components/emoji_picker_header_action_view/emoji_picker_header_action_view.xml b/addons/mail/static/src/components/emoji_picker_header_action_view/emoji_picker_header_action_view.xml new file mode 100644 index 00000000000..ed0b54bd139 --- /dev/null +++ b/addons/mail/static/src/components/emoji_picker_header_action_view/emoji_picker_header_action_view.xml @@ -0,0 +1,16 @@ + + + + +
+ +
+
+ +
diff --git a/addons/mail/static/src/components/emoji_picker_header_view/emoji_picker_header_view.js b/addons/mail/static/src/components/emoji_picker_header_view/emoji_picker_header_view.js new file mode 100644 index 00000000000..c3f25e45415 --- /dev/null +++ b/addons/mail/static/src/components/emoji_picker_header_view/emoji_picker_header_view.js @@ -0,0 +1,23 @@ +/** @odoo-module **/ + +import { registerMessagingComponent } from '@mail/utils/messaging_component'; + +const { Component } = owl; + +export class EmojiPickerHeaderView extends Component { + + /** + * @returns {EmojiPickerHeaderView} + */ + get emojiPickerHeaderView() { + return this.props.record; + } + +} + +Object.assign(EmojiPickerHeaderView, { + props: { record: Object }, + template: 'mail.EmojiPickerHeaderView', +}); + +registerMessagingComponent(EmojiPickerHeaderView); diff --git a/addons/mail/static/src/components/emoji_picker_header_view/emoji_picker_header_view.xml b/addons/mail/static/src/components/emoji_picker_header_view/emoji_picker_header_view.xml new file mode 100644 index 00000000000..ed2576996c0 --- /dev/null +++ b/addons/mail/static/src/components/emoji_picker_header_view/emoji_picker_header_view.xml @@ -0,0 +1,12 @@ + + + + +
+ + + +
+
+ +
diff --git a/addons/mail/static/src/components/emoji_picker_view/emoji_picker_view.xml b/addons/mail/static/src/components/emoji_picker_view/emoji_picker_view.xml index f335e561334..ab222436806 100644 --- a/addons/mail/static/src/components/emoji_picker_view/emoji_picker_view.xml +++ b/addons/mail/static/src/components/emoji_picker_view/emoji_picker_view.xml @@ -3,7 +3,7 @@
- +
diff --git a/addons/mail/static/src/components/legacy_emoji/legacy_emoji.js b/addons/mail/static/src/components/legacy_emoji/legacy_emoji.js deleted file mode 100644 index 3ce3530b110..00000000000 --- a/addons/mail/static/src/components/legacy_emoji/legacy_emoji.js +++ /dev/null @@ -1,16 +0,0 @@ -/** @odoo-module **/ - -import { registerMessagingComponent } from '@mail/utils/messaging_component'; - -const { Component } = owl; - -export class LegacyEmoji extends Component {} - -Object.assign(LegacyEmoji, { - props: { - emojiView: Object, - }, - template: 'mail.LegacyEmoji', -}); - -registerMessagingComponent(LegacyEmoji); diff --git a/addons/mail/static/src/components/legacy_emoji/legacy_emoji.xml b/addons/mail/static/src/components/legacy_emoji/legacy_emoji.xml deleted file mode 100644 index 00254e831fb..00000000000 --- a/addons/mail/static/src/components/legacy_emoji/legacy_emoji.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/addons/mail/static/src/components/legacy_emoji_list/legacy_emoji_list.js b/addons/mail/static/src/components/legacy_emoji_list/legacy_emoji_list.js deleted file mode 100644 index 940bffbe885..00000000000 --- a/addons/mail/static/src/components/legacy_emoji_list/legacy_emoji_list.js +++ /dev/null @@ -1,57 +0,0 @@ -/** @odoo-module **/ - -import { useUpdate } from '@mail/component_hooks/use_update'; -import { registerMessagingComponent } from '@mail/utils/messaging_component'; -import { LegacyComponent } from '@web/legacy/legacy_component'; - -export class LegacyEmojiList extends LegacyComponent { - - /** - * @override - */ - setup() { - super.setup(); - useUpdate({ func: () => this._update() }); - } - - get emojiListView() { - return this.props.record; - } - - //-------------------------------------------------------------------------- - // Private - //-------------------------------------------------------------------------- - - /** - * @private - */ - _update() { - this.trigger('o-popover-compute'); - } - - //-------------------------------------------------------------------------- - // Public - //-------------------------------------------------------------------------- - - close() { - this.trigger('o-popover-close'); - } - - /** - * Returns whether the given node is self or a children of self. - * - * @param {Node} node - * @returns {boolean} - */ - contains(node) { - return Boolean(this.root.el && this.root.el.contains(node)); - } - -} - -Object.assign(LegacyEmojiList, { - props: { record: Object }, - template: 'mail.LegacyEmojiList', -}); - -registerMessagingComponent(LegacyEmojiList); diff --git a/addons/mail/static/src/components/legacy_emoji_list/legacy_emoji_list.scss b/addons/mail/static/src/components/legacy_emoji_list/legacy_emoji_list.scss deleted file mode 100644 index f6b15ac980f..00000000000 --- a/addons/mail/static/src/components/legacy_emoji_list/legacy_emoji_list.scss +++ /dev/null @@ -1,9 +0,0 @@ -// ------------------------------------------------------------------ -// Layout -// ------------------------------------------------------------------ - -.o_LegacyEmojiList { - // Could be replaced by "d-grid" class after migration to BS5 - display: grid; - grid-template-columns: repeat(9, 1fr); -} diff --git a/addons/mail/static/src/components/legacy_emoji_list/legacy_emoji_list.xml b/addons/mail/static/src/components/legacy_emoji_list/legacy_emoji_list.xml deleted file mode 100644 index 935b446caf1..00000000000 --- a/addons/mail/static/src/components/legacy_emoji_list/legacy_emoji_list.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - -
- - - - - -
-
- -
diff --git a/addons/mail/static/src/models/emoji_category_bar_view.js b/addons/mail/static/src/models/emoji_category_bar_view.js index 8a14d81164d..1c850b41833 100644 --- a/addons/mail/static/src/models/emoji_category_bar_view.js +++ b/addons/mail/static/src/models/emoji_category_bar_view.js @@ -2,19 +2,26 @@ import { registerModel } from '@mail/model/model_core'; import { many, one } from '@mail/model/model_field'; +import { clear } from '@mail/model/model_field_command'; registerModel({ name: 'EmojiCategoryBarView', fields: { emojiCategoryViews: many('EmojiCategoryView', { compute() { - return this.emojiPickerViewOwner.categories.map(category => ({ viewCategory: category })); + if (!this.emojiPickerView) { + return clear(); + } + return this.emojiPickerView.categories.map(category => ({ viewCategory: category })); }, inverse: 'emojiCategoryBarViewOwner', }), - emojiPickerViewOwner: one('EmojiPickerView', { + emojiPickerHeaderViewOwner: one('EmojiPickerHeaderView', { identifying: true, inverse: 'emojiCategoryBarView', }), + emojiPickerView: one('EmojiPickerView', { + related: 'emojiPickerHeaderViewOwner.emojiPickerViewOwner', + }), }, }); diff --git a/addons/mail/static/src/models/emoji_category_view.js b/addons/mail/static/src/models/emoji_category_view.js index c7a32e28bc8..4c23bbdebcb 100644 --- a/addons/mail/static/src/models/emoji_category_view.js +++ b/addons/mail/static/src/models/emoji_category_view.js @@ -10,16 +10,16 @@ registerModel({ * @param {MouseEvent} ev */ onClick() { - this.emojiCategoryBarViewOwner.emojiPickerViewOwner.emojiSearchBarView.reset(); + this.emojiPickerView.emojiSearchBarView.reset(); let categoryRowScrollPosition = Math.max( 0, // Index of the beginning of the category - (this.emojiCategoryBarViewOwner.emojiPickerViewOwner.emojiGridView.rowHeight * this.viewCategory.emojiGridRowView.index) + (this.emojiPickerView.emojiGridView.rowHeight * this.viewCategory.emojiGridRowView.index) - // Cancels the amount of buffer rows - (this.emojiCategoryBarViewOwner.emojiPickerViewOwner.emojiGridView.rowHeight * this.emojiCategoryBarViewOwner.emojiPickerViewOwner.emojiGridView.topBufferAmount) + (this.emojiPickerView.emojiGridView.rowHeight * this.emojiPickerView.emojiGridView.topBufferAmount) ); - this.emojiCategoryBarViewOwner.emojiPickerViewOwner.emojiGridView.containerRef.el.scrollTo({ top: categoryRowScrollPosition }); + this.emojiPickerView.emojiGridView.containerRef.el.scrollTo({ top: categoryRowScrollPosition }); }, /** * @param {MouseEvent} ev @@ -42,6 +42,9 @@ registerModel({ identifying: true, inverse: 'emojiCategoryViews', }), + emojiPickerView: one('EmojiPickerView', { + related: 'emojiCategoryBarViewOwner.emojiPickerView', + }), isActive: attr({ compute() { return Boolean(this.viewCategory.emojiPickerViewAsActive); diff --git a/addons/mail/static/src/models/emoji_grid_view.js b/addons/mail/static/src/models/emoji_grid_view.js index 7b96cef1349..bea1ee6357b 100644 --- a/addons/mail/static/src/models/emoji_grid_view.js +++ b/addons/mail/static/src/models/emoji_grid_view.js @@ -19,6 +19,9 @@ registerModel({ }); }, onScroll() { + if (!this.exists()) { + return; + } this.onScrollThrottle.do(); }, _onChangeScrollRecomputeCount() { diff --git a/addons/mail/static/src/models/emoji_picker_header_action_list_view.js b/addons/mail/static/src/models/emoji_picker_header_action_list_view.js new file mode 100644 index 00000000000..3b68243bd0f --- /dev/null +++ b/addons/mail/static/src/models/emoji_picker_header_action_list_view.js @@ -0,0 +1,28 @@ +/** @odoo-module **/ + +import { registerModel } from '@mail/model/model_core'; +import { many, one } from '@mail/model/model_field'; + +registerModel({ + name: 'EmojiPickerHeaderActionListView', + fields: { + __dummyActionView: one('EmojiPickerHeaderActionView', { + inverse: '__ownerAsDummy', + }), + actionViews: many('EmojiPickerHeaderActionView', { + inverse: 'owner', + sort() { + return [ + ['smaller-first', 'sequence'], + ]; + }, + }), + emojiPickerView: one('EmojiPickerView', { + related: 'owner.emojiPickerViewOwner', + }), + owner: one('EmojiPickerHeaderView', { + identifying: true, + inverse: 'actionListView', + }), + }, +}); diff --git a/addons/mail/static/src/models/emoji_picker_header_action_view.js b/addons/mail/static/src/models/emoji_picker_header_action_view.js new file mode 100644 index 00000000000..f69c9b4eb8a --- /dev/null +++ b/addons/mail/static/src/models/emoji_picker_header_action_view.js @@ -0,0 +1,39 @@ +/** @odoo-module **/ + +import { registerModel } from '@mail/model/model_core'; +import { attr, one } from '@mail/model/model_field'; +import { clear } from '@mail/model/model_field_command'; + +registerModel({ + name: 'EmojiPickerHeaderActionView', + identifyingMode: 'xor', + fields: { + // dummy identifying field, so that it works without defining one initially in mail + __ownerAsDummy: one('EmojiPickerHeaderActionListView', { + identifying: true, + inverse: '__dummyActionView', + }), + content: one('Record', { + compute() { + return clear(); + }, + required: true, + }), + contentComponentName: attr({ + compute() { + return clear(); + }, + required: true, + }), + owner: one('EmojiPickerHeaderActionListView', { + compute() { + return clear(); + }, + required: true, + inverse: 'actionViews', + }), + sequence: attr({ + default: 0, + }), + }, +}); diff --git a/addons/mail/static/src/models/emoji_picker_header_view.js b/addons/mail/static/src/models/emoji_picker_header_view.js new file mode 100644 index 00000000000..59e76f1051f --- /dev/null +++ b/addons/mail/static/src/models/emoji_picker_header_view.js @@ -0,0 +1,25 @@ +/** @odoo-module **/ + +import { registerModel } from '@mail/model/model_core'; +import { one } from '@mail/model/model_field'; + +registerModel({ + name: 'EmojiPickerHeaderView', + fields: { + actionListView: one('EmojiPickerHeaderActionListView', { + default: {}, + isCausal: true, + inverse: 'owner', + }), + emojiCategoryBarView: one('EmojiCategoryBarView', { + default: {}, + inverse: 'emojiPickerHeaderViewOwner', + readonly: true, + required: true, + }), + emojiPickerViewOwner: one('EmojiPickerView', { + identifying: true, + inverse: 'headerView', + }), + }, +}); diff --git a/addons/mail/static/src/models/emoji_picker_view.js b/addons/mail/static/src/models/emoji_picker_view.js index 830440b3aa4..99f3a897781 100644 --- a/addons/mail/static/src/models/emoji_picker_view.js +++ b/addons/mail/static/src/models/emoji_picker_view.js @@ -37,12 +37,6 @@ registerModel({ return this.categories[0]; }, }), - emojiCategoryBarView: one('EmojiCategoryBarView', { - default: {}, - inverse: 'emojiPickerViewOwner', - readonly: true, - required: true, - }), emojiGridView: one('EmojiGridView', { default: {}, inverse: 'emojiPickerViewOwner', @@ -54,6 +48,12 @@ registerModel({ inverse: 'emojiPickerView', readonly: true, }), + headerView: one('EmojiPickerHeaderView', { + default: {}, + inverse: 'emojiPickerViewOwner', + readonly: true, + required: true, + }), popoverViewOwner: one('PopoverView', { identifying: true, inverse: 'emojiPickerView',