From fa409ef5dd6864f6cb07b6c8d6ead10979fab472 Mon Sep 17 00:00:00 2001 From: Kushagra Gour Date: Tue, 24 Jan 2017 12:03:32 +0530 Subject: [PATCH 01/13] add keyboard navigation in saved library pane. fixes #50 --- src/script.js | 25 +++++++++++++++++++++++++ src/style.css | 3 ++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/script.js b/src/script.js index e8f1667..26818e0 100644 --- a/src/script.js +++ b/src/script.js @@ -988,6 +988,31 @@ settingsBtn, onboardModal, notificationsBtn, onboardShowInTabOptionBtn, onboardD else if (event.keyCode === 27) { closeAllOverlays(); } + if (event.keyCode === 40 && savedItemsPane.classList.contains('is-open')) { + var selectedItemElement = $('.js-saved-item-tile.selected'); + if (selectedItemElement) { + selectedItemElement.classList.remove('selected'); + selectedItemElement.nextElementSibling.classList.add('selected'); + } else { + $('.js-saved-item-tile:first-child').classList.add('selected'); + } + } else if (event.keyCode === 38 && savedItemsPane.classList.contains('is-open')) { + var selectedItemElement = $('.js-saved-item-tile.selected'); + if (selectedItemElement) { + selectedItemElement.classList.remove('selected'); + selectedItemElement.previousElementSibling.classList.add('selected'); + } else { + $('.js-saved-item-tile:first-child').classList.add('selected'); + } + } else if (event.keyCode === 13 && savedItemsPane.classList.contains('is-open')) { + var selectedItemElement = $('.js-saved-item-tile.selected'); + setTimeout(function () { + openItem(selectedItemElement.dataset.itemId); + }, 350); + toggleSavedItemsPane(); + } + + utils.log(event.keyCode) }); window.addEventListener('click', function(e) { diff --git a/src/style.css b/src/style.css index 9f12bd2..6a0a702 100644 --- a/src/style.css +++ b/src/style.css @@ -466,7 +466,8 @@ li.CodeMirror-hint-active { transform: translateX(0px); } } -.saved-item-tile:hover { +.saved-item-tile:hover, +.saved-item-tile.selected { background: rgba(255,255,255,0.1); } .saved-item-tile__close-btn { From 7aa764cea0cd29e7b5bc81455344455ed07a4393 Mon Sep 17 00:00:00 2001 From: Kushagra Gour Date: Sun, 29 Jan 2017 17:53:04 +0530 Subject: [PATCH 02/13] fix date in new item title. fixes #58 --- src/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/script.js b/src/script.js index 26818e0..92b84cc 100644 --- a/src/script.js +++ b/src/script.js @@ -312,7 +312,7 @@ settingsBtn, onboardModal, notificationsBtn, onboardShowInTabOptionBtn, onboardD function createNewItem() { var d = new Date(); currentItem = { - title: 'Untitled ' + d.getDate() + '-' + d.getMonth() + '-' + d.getHours() + ':' + d.getMinutes(), + title: 'Untitled ' + d.getDate() + '-' + (d.getMonth() + 1) + '-' + d.getHours() + ':' + d.getMinutes(), html: '', css: '', js: '', From 1615c7f8895988c00a2e2c388c80cd1e2917e464 Mon Sep 17 00:00:00 2001 From: Kushagra Gour Date: Wed, 1 Feb 2017 10:44:19 +0530 Subject: [PATCH 03/13] add autocomplete in library add textarea. fixes #49 --- src/index.html | 1 + src/script.js | 9 +-- src/style.css | 8 +++ src/textarea-autocomplete.js | 119 +++++++++++++++++++++++++++++++++++ 4 files changed, 133 insertions(+), 4 deletions(-) create mode 100644 src/textarea-autocomplete.js diff --git a/src/index.html b/src/index.html index f6f5f21..9352097 100644 --- a/src/index.html +++ b/src/index.html @@ -405,6 +405,7 @@ + diff --git a/src/script.js b/src/script.js index 92b84cc..e3560fd 100644 --- a/src/script.js +++ b/src/script.js @@ -1011,8 +1011,6 @@ settingsBtn, onboardModal, notificationsBtn, onboardShowInTabOptionBtn, onboardD }, 350); toggleSavedItemsPane(); } - - utils.log(event.keyCode) }); window.addEventListener('click', function(e) { @@ -1049,8 +1047,11 @@ settingsBtn, onboardModal, notificationsBtn, onboardShowInTabOptionBtn, onboardD trackEvent('ui', 'addLibrarySelect', target.selectedOptions[0].label); onExternalLibChange(); }); - externalJsTextarea.addEventListener('change', onExternalLibChange); - externalCssTextarea.addEventListener('change', onExternalLibChange); + externalJsTextarea.addEventListener('blur', onExternalLibChange); + externalCssTextarea.addEventListener('blur', onExternalLibChange); + + new TextareaAutoComplete(externalJsTextarea, obj => obj.latest.match(/\.js$/)); + new TextareaAutoComplete(externalCssTextarea, obj => obj.latest.match(/\.css$/)); chrome.storage.local.get({ layoutMode: 1, diff --git a/src/style.css b/src/style.css index 6a0a702..2f53c58 100644 --- a/src/style.css +++ b/src/style.css @@ -582,6 +582,7 @@ li.CodeMirror-hint-active { color: #333; cursor: pointer; } +.dropdown__menu > li.selected > a, .dropdown__menu > li > a:hover { background: var(--color-sidebar); color: white; @@ -678,3 +679,10 @@ li.CodeMirror-hint-active { background: white url('data:image/svg+xml;charset=UTF-8,'); } +.autocomplete-dropdown { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + right: 0; + max-height: 200px; + overflow-y: auto; +} \ No newline at end of file diff --git a/src/textarea-autocomplete.js b/src/textarea-autocomplete.js new file mode 100644 index 0000000..3dc289b --- /dev/null +++ b/src/textarea-autocomplete.js @@ -0,0 +1,119 @@ +// textarea-autocomplete.js +(function() { + + var timeout; + var t, list; + var isShowingSuggestions = false; + + class TextareaAutoComplete { + + constructor (textarea, filter) { + this.t = textarea; + this.filter = filter; + var wrap = document.createElement('div'); + wrap.classList.add('btn-group'); + textarea.parentElement.insertBefore(wrap, textarea); + wrap.insertBefore(textarea, null); + this.list = document.createElement('ul'); + this.list.classList.add('dropdown__menu'); + this.list.classList.add('autocomplete-dropdown'); + wrap.insertBefore(this.list, null); + + this.t.addEventListener('input', e => this.onInput(e)); + this.t.addEventListener('keydown', e => this.onKeyDown(e)); + this.t.addEventListener('blur', e => this.closeSuggestions()) + } + + get currentLineNumber() { + return this.t.value.substr(0, this.t.selectionStart).split('\n').length; + } + get currentLine() { + var line = this.currentLineNumber; + return this.t.value.split('\n')[line - 1]; + } + closeSuggestions() { + this.list.parentElement.classList.remove('open'); + this.isShowingSuggestions = false; + } + getList(input) { + // return new Promise((resolve) => { + // resolve([ + // { name: 'asdsd', latest: 'dsfdsfsdf/sdf/sd/f/df'}, + // { name: 'asdsd', latest: 'dsfdsfsdf/sdf/sd/f/df'}, + // { name: 'asdsd', latest: 'dsfdsfsdf/sdf/sd/f/df'}, + // { name: 'asdsd', latest: 'dsfdsfsdf/sdf/sd/f/df'}, + // { name: 'asdsd', latest: 'dsfdsfsdf/sdf/sd/f/df'}, + // { name: 'asdsd', latest: 'dsfdsfsdf/sdf/sd/f/df'}, + // { name: 'asdsd', latest: 'dsfdsfsdf/sdf/sd/f/df'}, + // { name: 'asdsd', latest: 'dsfdsfsdf/sdf/sd/f/df'}, + // { name: 'asdsd', latest: 'dsfdsfsdf/sdf/sd/f/df'}, + // ]) + // }) + var url = 'https://api.cdnjs.com/libraries?search='; + return fetch(url + input) + .then(response => { + return response.json().then(json => json.results); + }); + } + replaceCurrentLine(val) { + var lines = this.t.value.split('\n'); + lines.splice(this.currentLineNumber - 1, 1, val) + this.t.value = lines.join('\n'); + } + onInput() { + var currentLine = this.currentLine; + if (currentLine) { + clearTimeout(this.timeout); + this.timeout = setTimeout(() => { + this.getList(currentLine).then(arr => { + if (!arr.length) { + this.closeSuggestions(); + return; + } + this.list.innerHTML = ''; + if (this.filter) { + arr = arr.filter(this.filter); + } + for (var i = 0; i < Math.min(arr.length, 10); i++) { + this.list.innerHTML += `
  • ${arr[i].name}
  • `; + } + this.list.parentElement.classList.add('open'); + this.isShowingSuggestions = true; + }); + }, 500); + } + } + onKeyDown(event) { + if (event.keyCode === 27) { + this.closeSuggestions(); + event.stopPropagation(); + } + if (event.keyCode === 40 && this.isShowingSuggestions) { + var selectedItemElement = this.list.querySelector('.selected'); + if (selectedItemElement) { + selectedItemElement.classList.remove('selected'); + selectedItemElement.nextElementSibling.classList.add('selected'); + } else { + this.list.querySelector('li:first-child').classList.add('selected'); + } + event.preventDefault(); + } else if (event.keyCode === 38 && this.isShowingSuggestions) { + var selectedItemElement = this.list.querySelector('.selected'); + if (selectedItemElement) { + selectedItemElement.classList.remove('selected'); + selectedItemElement.previousElementSibling.classList.add('selected'); + } else { + this.list.querySelector('li:first-child').classList.add('selected'); + } + event.preventDefault(); + } else if (event.keyCode === 13 && this.isShowingSuggestions) { + var selectedItemElement = this.list.querySelector('.selected'); + this.replaceCurrentLine(selectedItemElement.dataset.url) + this.closeSuggestions(); + } + } + } + + window.TextareaAutoComplete = TextareaAutoComplete; + +})(); \ No newline at end of file From cd583c35c37ab97f0bb6bcb332787b222e47b609 Mon Sep 17 00:00:00 2001 From: Kushagra Gour Date: Sun, 5 Feb 2017 04:11:50 +0530 Subject: [PATCH 04/13] add loader and polish library autocompletion --- src/index.html | 4 ++-- src/style.css | 45 ++++++++++++++++++++++++++++++++---- src/textarea-autocomplete.js | 40 +++++++++++++++++++++++++++++--- 3 files changed, 79 insertions(+), 10 deletions(-) diff --git a/src/index.html b/src/index.html index 9352097..9da7727 100644 --- a/src/index.html +++ b/src/index.html @@ -172,10 +172,10 @@