From b1c4a63de9c4c184745cb7c7be90b17fba69b7bc Mon Sep 17 00:00:00 2001
From: Eugen Ciur <eugen@papermerge.com>
Date: Wed, 23 Mar 2022 20:23:13 +0100
Subject: [PATCH] when clicking outside search component toggles its visibility
---
app/components/search/index.hbs | 4 ++-
app/components/search/index.js | 5 +++
app/modifiers/on-click-outside.js | 54 +++++++++++++++++++++++++++++++
package-lock.json | 37 +++------------------
package.json | 2 +-
5 files changed, 67 insertions(+), 35 deletions(-)
create mode 100644 app/modifiers/on-click-outside.js
diff --git a/app/components/search/index.hbs b/app/components/search/index.hbs
index ad023c6..3a28959 100644
--- a/app/components/search/index.hbs
+++ b/app/components/search/index.hbs
@@ -1,4 +1,6 @@
-<form class="d-flex flex-column autocomplete-search">
+<form
+ class="d-flex flex-column autocomplete-search"
+ {{on-click-outside this.onClickOutside}}>
<div class="d-flex">
<div class="input-group">
<button class="btn btn-light border-0" type="button">
diff --git a/app/components/search/index.js b/app/components/search/index.js
index 7f8ae23..bd2e5fd 100644
--- a/app/components/search/index.js
+++ b/app/components/search/index.js
@@ -49,6 +49,11 @@ export default class SearchComponent extends Component {
}
}
+ @action
+ onClickOutside() {
+ this._reset();
+ }
+
_reset() {
this.query = '';
this.autocomplete_items = [];
diff --git a/app/modifiers/on-click-outside.js b/app/modifiers/on-click-outside.js
new file mode 100644
index 0000000..2bacdbb
--- /dev/null
+++ b/app/modifiers/on-click-outside.js
@@ -0,0 +1,54 @@
+import { action } from '@ember/object';
+import Modifier from 'ember-modifier';
+
+
+export default class OnClickOutsideModifier extends Modifier {
+ /*
+ Modifier which will trigger given handler if 'click' event occured
+ outside of the element.
+
+ Example:
+
+ <SomeComponent {{on-click-outside this.onClickOutside}} />
+
+ Whenever click event occurs outside <SomeComponent /> `this.onClickOutside`
+ will be invoked. Handler is invoked without any arguments.
+ */
+
+ on_click_user_handler = null;
+
+ _init() {
+ document.addEventListener('click', this.onClick);
+ }
+
+ _destroy() {
+ document.removeEventListener('click', this.onClick);
+ }
+
+ didReceiveArguments() {
+ this.on_click_user_handler = this.args.positional[0];
+ this._init();
+ }
+
+ willDestroy() {
+ this._destroy();
+ }
+
+ @action
+ onClick(event) {
+ let path;
+
+ // composedPath() method of the Event interface returns the event's path
+ // which is an array of the objects on which listeners will be invoked.
+ // https://developer.mozilla.org/en-US/docs/Web/API/Event/composedPath The
+ if (event.composedPath) {
+ path = event.composedPath();
+ }
+
+ if (path && !path.includes(this.element)) {
+ if (this.on_click_user_handler) {
+ this.on_click_user_handler();
+ }
+ }
+ }
+}
diff --git a/package-lock.json b/package-lock.json
index 8b9f7c0..a9e4ab5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1331,11 +1331,6 @@
"picocolors": "^1.0.0"
}
},
- "caniuse-lite": {
- "version": "1.0.30001299",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001299.tgz",
- "integrity": "sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw=="
- },
"electron-to-chromium": {
"version": "1.4.44",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.44.tgz",
@@ -2521,11 +2516,6 @@
"picocolors": "^1.0.0"
}
},
- "caniuse-lite": {
- "version": "1.0.30001299",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001299.tgz",
- "integrity": "sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw=="
- },
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -4298,11 +4288,6 @@
"picocolors": "^1.0.0"
}
},
- "caniuse-lite": {
- "version": "1.0.30001299",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001299.tgz",
- "integrity": "sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw=="
- },
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -9971,9 +9956,9 @@
}
},
"caniuse-lite": {
- "version": "1.0.30001259",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001259.tgz",
- "integrity": "sha512-V7mQTFhjITxuk9zBpI6nYsiTXhcPe05l+364nZjK7MFK/E7ibvYBSAXr4YcA6oPR8j3ZLM/LN+lUqUVAQEUZFg=="
+ "version": "1.0.30001319",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz",
+ "integrity": "sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw=="
},
"capture-exit": {
"version": "2.0.0",
@@ -12032,11 +12017,6 @@
"picocolors": "^1.0.0"
}
},
- "caniuse-lite": {
- "version": "1.0.30001299",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001299.tgz",
- "integrity": "sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw=="
- },
"ci-info": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz",
@@ -13395,11 +13375,6 @@
"picocolors": "^1.0.0"
}
},
- "caniuse-lite": {
- "version": "1.0.30001299",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001299.tgz",
- "integrity": "sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw=="
- },
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -15070,7 +15045,6 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/ember-keyboard/-/ember-keyboard-7.0.0.tgz",
"integrity": "sha512-NuFZqIU1SahX0dFWqBJ8rD30cQF92RbuVPwbHTYU0SJFhVltYen6G66b3u2PkshK/WpdGHDL8XS+hZvpsoP2DA==",
- "dev": true,
"requires": {
"ember-cli-babel": "^7.26.6",
"ember-cli-htmlbars": "^6.0.1",
@@ -15352,7 +15326,6 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/ember-modifier-manager-polyfill/-/ember-modifier-manager-polyfill-1.2.0.tgz",
"integrity": "sha512-bnaKF1LLKMkBNeDoetvIJ4vhwRPKIIumWr6dbVuW6W6p4QV8ZiO+GdF8J7mxDNlog9CeL9Z/7wam4YS86G8BYA==",
- "dev": true,
"requires": {
"ember-cli-babel": "^7.10.0",
"ember-cli-version-checker": "^2.1.2",
@@ -15363,7 +15336,6 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz",
"integrity": "sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg==",
- "dev": true,
"requires": {
"resolve": "^1.3.3",
"semver": "^5.3.0"
@@ -15372,8 +15344,7 @@
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
}
}
},
diff --git a/package.json b/package.json
index 251405e..5a6e869 100644
--- a/package.json
+++ b/package.json
@@ -49,6 +49,7 @@
"ember-data": "^4.1.0",
"ember-export-application-global": "^2.0.1",
"ember-fetch": "^8.1.1",
+ "ember-keyboard": "^7.0.0",
"ember-load-initializers": "^2.1.2",
"ember-modifier": "^3.0.0",
"ember-page-title": "^7.0.0",
@@ -57,7 +58,6 @@
"ember-simple-auth": "^4.1.1",
"ember-source": "^4.1.0",
"ember-template-lint": "^3.16.0",
- "ember-keyboard": "^7.0.0",
"eslint": "^7.32.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-ember": "^10.5.8",
--
GitLab