diff --git a/app/assets/javascripts/discourse/components/composer-editor.js.es6 b/app/assets/javascripts/discourse/components/composer-editor.js.es6 index ae1a873611..0388c7d396 100644 --- a/app/assets/javascripts/discourse/components/composer-editor.js.es6 +++ b/app/assets/javascripts/discourse/components/composer-editor.js.es6 @@ -108,14 +108,6 @@ export default Ember.Component.extend({ this._bindUploadTarget(); this.appEvents.trigger('composer:will-open'); - - if (this.site.mobileView) { - $(window).on('resize.composer-popup-menu', () => { - if (this.get('optionsVisible')) { - this.appEvents.trigger('popup-menu:open', this._optionsLocation()); - } - }); - } }, @computed('composer.reply', 'composer.replyLength', 'composer.missingReplyCharacters', 'composer.minimumPostLength', 'lastValidatedAt') @@ -515,34 +507,6 @@ export default Ember.Component.extend({ this._firefoxPastingHack(); }, - _optionsLocation() { - const composer = $("#reply-control"); - const composerOffset = composer.offset(); - const composerPosition = composer.position(); - - const buttonBarOffset = $('#reply-control .d-editor-button-bar').offset(); - const optionsButton = $('#reply-control .d-editor-button-bar .options'); - - const popupMenu = $("#reply-control .popup-menu"); - const popupWidth = popupMenu.outerWidth(); - const popupHeight = popupMenu.outerHeight(); - - const headerHeight = $(".d-header").outerHeight(); - - let left = optionsButton.offset().left - composerOffset.left; - let top = buttonBarOffset.top - composerOffset.top - popupHeight + popupMenu.innerHeight(); - - if (top + composerPosition.top - headerHeight - popupHeight < 0) { - top += popupHeight + optionsButton.outerHeight(); - } - - if (left + popupWidth > composer.width()) { - left -= popupWidth - optionsButton.outerWidth(); - } - - return { position: "absolute", left, top }; - }, - // Believe it or not pasting an image in Firefox doesn't work without this code _firefoxPastingHack() { const uaMatch = navigator.userAgent.match(/Firefox\/(\d+)\.\d/); @@ -653,10 +617,6 @@ export default Ember.Component.extend({ }); if (this._enableAdvancedEditorPreviewSync()) this._teardownInputPreviewSync(); - - if (this.site.mobileView) { - $(window).off('resize.composer-popup-menu'); - } }, actions: { @@ -672,15 +632,10 @@ export default Ember.Component.extend({ this._resetUpload(true); }, - toggleOptions(toolbarEvent) { - if (this.get('optionsVisible')) { - this.sendAction('hideOptions'); - } else { - const selected = toolbarEvent.selected; - toolbarEvent.selectText(selected.start, selected.end - selected.start); - - this.sendAction('showOptions', toolbarEvent, this._optionsLocation()); - } + onExpandPopupMenuOptions(toolbarEvent) { + const selected = toolbarEvent.selected; + toolbarEvent.selectText(selected.start, selected.end - selected.start); + this.sendAction('storeToolbarState', toolbarEvent); }, togglePreview() { @@ -709,15 +664,14 @@ export default Ember.Component.extend({ sendAction: 'showUploadModal' }); - if (this.get("showPopupMenu")) { - toolbar.addButton({ - id: 'options', - group: 'extras', - icon: 'gear', - title: 'composer.options', - sendAction: 'toggleOptions' - }); - } + toolbar.addButton({ + id: 'options', + group: 'extras', + icon: 'gear', + title: 'composer.options', + sendAction: 'onExpandPopupMenuOptions', + popupMenu: true + }); if (this.site.mobileView) { toolbar.addButton({ diff --git a/app/assets/javascripts/discourse/components/d-editor.js.es6 b/app/assets/javascripts/discourse/components/d-editor.js.es6 index d1b3f0bfce..eda16824b7 100644 --- a/app/assets/javascripts/discourse/components/d-editor.js.es6 +++ b/app/assets/javascripts/discourse/components/d-editor.js.es6 @@ -123,7 +123,8 @@ class Toolbar { icon: button.label ? null : button.icon || button.id, action: button.action || 'toolbarButton', perform: button.perform || function() { }, - trimLeading: button.trimLeading + trimLeading: button.trimLeading, + popupMenu: button.popupMenu || false }; if (button.sendAction) { diff --git a/app/assets/javascripts/discourse/components/popup-menu.js.es6 b/app/assets/javascripts/discourse/components/popup-menu.js.es6 deleted file mode 100644 index 64ef71752d..0000000000 --- a/app/assets/javascripts/discourse/components/popup-menu.js.es6 +++ /dev/null @@ -1,47 +0,0 @@ -import { on } from 'ember-addons/ember-computed-decorators'; - -export default Ember.Component.extend({ - classNameBindings: ["visible::hidden", ":popup-menu", "extraClasses"], - - @on('didInsertElement') - _setup() { - this.appEvents.on("popup-menu:open", this, "_changeLocation"); - - $('html').on(`keydown.popup-menu-${this.get('elementId')}`, () => { - this.sendAction('hide'); - }); - - $('html').on(`mouseup.popup-menu-${this.get('elementId')}`, () => { - this.sendAction('hide'); - }); - }, - - @on('willDestroyElement') - _cleanup() { - $('html').off(`mouseup.popup-menu-${this.get('elementId')}`); - $('html').off(`keydown.popup-menu-${this.get('elementId')}`); - this.appEvents.off("popup-menu:open", this, "_changeLocation"); - }, - - _changeLocation(location) { - const $this = this.$(); - switch (location.position) { - case "absolute": { - $this.css({ - position: "absolute", - top: location.top - $this.innerHeight() + 5, - left: location.left, - }); - break; - } - case "fixed": { - $this.css({ - position: "fixed", - top: location.top, - left: location.left - $this.innerWidth(), - }); - break; - } - } - } -}); diff --git a/app/assets/javascripts/discourse/controllers/composer.js.es6 b/app/assets/javascripts/discourse/controllers/composer.js.es6 index b9ae01d5f4..cc02504b7f 100644 --- a/app/assets/javascripts/discourse/controllers/composer.js.es6 +++ b/app/assets/javascripts/discourse/controllers/composer.js.es6 @@ -63,7 +63,6 @@ export default Ember.Controller.extend({ showEditReason: false, editReason: null, scopedCategoryId: null, - optionsVisible: false, lastValidatedAt: null, isUploading: false, topic: null, @@ -160,11 +159,6 @@ export default Ember.Controller.extend({ return isStaffUser && this.siteSettings.enable_whispers && action === Composer.REPLY; }, - @computed("popupMenuOptions") - showPopupMenu(popupMenuOptions) { - return popupMenuOptions ? popupMenuOptions.some(option => option.condition) : false; - }, - _setupPopupMenuOption(callback) { let option = callback(); @@ -225,6 +219,13 @@ export default Ember.Controller.extend({ }, actions: { + onPopupMenuAction(action) { + this.send(action); + }, + + storeToolbarState(toolbarEvent) { + this.set('toolbarEvent', toolbarEvent); + }, togglePreview() { this.toggleProperty('showPreview'); @@ -237,7 +238,6 @@ export default Ember.Controller.extend({ cancelled() { this.send('hitEsc'); - this.send('hideOptions'); }, addLinkLookup(linkLookup) { @@ -290,16 +290,6 @@ export default Ember.Controller.extend({ this.toggleProperty('showToolbar'); }, - showOptions(toolbarEvent, loc) { - this.set('toolbarEvent', toolbarEvent); - this.appEvents.trigger('popup-menu:open', loc); - this.set('optionsVisible', true); - }, - - hideOptions() { - this.set('optionsVisible', false); - }, - // Toggle the reply view toggle() { this.closeAutocomplete(); diff --git a/app/assets/javascripts/discourse/templates/components/composer-editor.hbs b/app/assets/javascripts/discourse/templates/components/composer-editor.hbs index bf6dcecd21..006cd5eddc 100644 --- a/app/assets/javascripts/discourse/templates/components/composer-editor.hbs +++ b/app/assets/javascripts/discourse/templates/components/composer-editor.hbs @@ -5,13 +5,15 @@ markdownOptions=markdownOptions extraButtons="extraButtons" importQuote="importQuote" - toggleOptions="toggleOptions" showUploadModal="showUploadModal" togglePreview="togglePreview" validation=validation loading=composer.loading forcePreview=forcePreview - composerEvents=true}} + composerEvents=true + onExpandPopupMenuOptions="onExpandPopupMenuOptions" + onPopupMenuAction=onPopupMenuAction + popupMenuOptions=popupMenuOptions}} {{#if site.mobileView}} diff --git a/app/assets/javascripts/discourse/templates/components/d-editor.hbs b/app/assets/javascripts/discourse/templates/components/d-editor.hbs index c928412ebc..6029c6395b 100644 --- a/app/assets/javascripts/discourse/templates/components/d-editor.hbs +++ b/app/assets/javascripts/discourse/templates/components/d-editor.hbs @@ -13,8 +13,25 @@
- {{#if model.archetype.hasOptions}} - {{d-button action="showOptions" label="topic.options"}} - {{/if}} {{/if}} {{#if canEditTags}} {{tag-chooser tags=model.tags tabIndex="4" categoryId=model.categoryId}} @@ -96,7 +80,9 @@ composer=model lastValidatedAt=lastValidatedAt canWhisper=canWhisper - showPopupMenu=showPopupMenu + storeToolbarState="storeToolbarState" + onPopupMenuAction=(action "onPopupMenuAction") + popupMenuOptions=popupMenuOptions draftStatus=model.draftStatus isUploading=isUploading isCancellable=isCancellable @@ -104,9 +90,6 @@ groupsMentioned="groupsMentioned" cannotSeeMention="cannotSeeMention" importQuote="importQuote" - showOptions="showOptions" - hideOptions="hideOptions" - optionsVisible=optionsVisible togglePreview="togglePreview" showToolbar=showToolbar showUploadSelector="showUploadSelector" diff --git a/app/assets/javascripts/select-kit/components/dropdown-select-box.js.es6 b/app/assets/javascripts/select-kit/components/dropdown-select-box.js.es6 index 8e7636445a..5f76542aac 100644 --- a/app/assets/javascripts/select-kit/components/dropdown-select-box.js.es6 +++ b/app/assets/javascripts/select-kit/components/dropdown-select-box.js.es6 @@ -21,7 +21,7 @@ export default SingleSelectComponent.extend({ }, didClickOutside() { - if (this.get("isExpanded") === false) { return; } + if (this.get("isExpanded") === false) return; this.close(); }, diff --git a/app/assets/javascripts/select-kit/components/select-kit.js.es6 b/app/assets/javascripts/select-kit/components/select-kit.js.es6 index fe2049d716..c34c8b10f8 100644 --- a/app/assets/javascripts/select-kit/components/select-kit.js.es6 +++ b/app/assets/javascripts/select-kit/components/select-kit.js.es6 @@ -62,6 +62,7 @@ export default Ember.Component.extend(UtilsMixin, PluginApiMixin, DomHelpersMixi limitMatches: 100, nameChanges: false, allowsContentReplacement: false, + collectionHeader: null, init() { this._super(); @@ -228,6 +229,10 @@ export default Ember.Component.extend(UtilsMixin, PluginApiMixin, DomHelpersMixi actions: { onToggle() { + if (this.get("onToggle")) this.sendAction("onToggle"); + if (this.get("onCollapse") && this.get("isExpanded") === true) this.sendAction("onCollapse"); + if (this.get("onExpand") && this.get("isExpanded") === false) this.sendAction("onExpand"); + this.get("isExpanded") === true ? this.collapse() : this.expand(); }, diff --git a/app/assets/javascripts/select-kit/components/select-kit/select-kit-header.js.es6 b/app/assets/javascripts/select-kit/components/select-kit/select-kit-header.js.es6 index 30863d179c..e827709568 100644 --- a/app/assets/javascripts/select-kit/components/select-kit/select-kit-header.js.es6 +++ b/app/assets/javascripts/select-kit/components/select-kit/select-kit-header.js.es6 @@ -26,8 +26,10 @@ export default Ember.Component.extend({ @computed("computedContent.dataName", "name") dataName(dataName, name) { return dataName || name; }, - @computed("computedContent.title", "name") - title(title, name) { return title || name; }, + @computed("title", "computedContent.title", "name") + title(title, computedContentTitle, name) { + return title || computedContentTitle || name; + }, click() { this.sendAction("onToggle"); diff --git a/app/assets/javascripts/select-kit/components/toolbar-popup-menu-options.js.es6 b/app/assets/javascripts/select-kit/components/toolbar-popup-menu-options.js.es6 new file mode 100644 index 0000000000..4939fb30b7 --- /dev/null +++ b/app/assets/javascripts/select-kit/components/toolbar-popup-menu-options.js.es6 @@ -0,0 +1,47 @@ +import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; +import computed from "ember-addons/ember-computed-decorators"; + +export default DropdownSelectBoxComponent.extend({ + pluginApiIdentifiers: ["toolbar-popup-menu-options"], + classNames: ["toolbar-popup-menu-options"], + isHidden: Ember.computed.empty("computedContent"), + showFullTitle: false, + + @computed("title") + collectionHeader(title) { + return `