diff options
author | Marius David Wieschollek <passwords.public@mdns.eu> | 2020-12-15 00:42:32 +0300 |
---|---|---|
committer | Marius David Wieschollek <passwords.public@mdns.eu> | 2020-12-15 00:42:32 +0300 |
commit | a2a323cbfeaf7fc4e241f7de6d51bcb187950fde (patch) | |
tree | 8b3cde20a15130ae434f1725060d699e37f1e5e5 /src | |
parent | bc7e010a9591a12af7c00d9b1967a4b6cc6ca511 (diff) |
Add option to create passwords manually
Signed-off-by: Marius David Wieschollek <passwords.public@mdns.eu>
Diffstat (limited to 'src')
-rw-r--r-- | src/js/Controller/Password/AddBlank.js | 12 | ||||
-rw-r--r-- | src/js/Manager/ControllerManager.js | 7 | ||||
-rw-r--r-- | src/js/Manager/MiningManager.js | 23 | ||||
-rw-r--r-- | src/js/Models/Queue/MiningItem.js | 23 | ||||
-rw-r--r-- | src/platform/generic/_locales/de/messages.json | 4 | ||||
-rw-r--r-- | src/platform/generic/_locales/en/messages.json | 4 | ||||
-rw-r--r-- | src/vue/Components/Collected/MinedProperty.vue | 117 | ||||
-rw-r--r-- | src/vue/Components/Form/SliderField.vue | 2 | ||||
-rw-r--r-- | src/vue/Components/Popup/Collected.vue | 45 |
9 files changed, 169 insertions, 68 deletions
diff --git a/src/js/Controller/Password/AddBlank.js b/src/js/Controller/Password/AddBlank.js new file mode 100644 index 0000000..064bc37 --- /dev/null +++ b/src/js/Controller/Password/AddBlank.js @@ -0,0 +1,12 @@ +import AbstractController from '@js/Controller/AbstractController'; +import MiningManager from '@js/Manager/MiningManager'; +import TabManager from "@js/Manager/TabManager"; + +export default class AddBlank extends AbstractController { + async execute(message, reply) { + let url = TabManager.get('url'), + title = TabManager.get('tab').title; + + MiningManager.createItem({title, url, manual: true, user: {value: ''}, password: {value: ''}}); + } +}
\ No newline at end of file diff --git a/src/js/Manager/ControllerManager.js b/src/js/Manager/ControllerManager.js index 82c12ae..fb4e7d3 100644 --- a/src/js/Manager/ControllerManager.js +++ b/src/js/Manager/ControllerManager.js @@ -54,6 +54,13 @@ class ControllerManager { } ); MessageService.listen( + 'password.add.blank', + async (message, reply) => { + let module = await import(/* webpackChunkName: "PasswordAddBlank" */ '@js/Controller/Password/AddBlank'); + await this._executeController(module, message, reply); + } + ); + MessageService.listen( 'folder.list', async (message, reply) => { let module = await import(/* webpackChunkName: "FolderList" */ '@js/Controller/Folder/List'); diff --git a/src/js/Manager/MiningManager.js b/src/js/Manager/MiningManager.js index 6ce1ede..05b8d4d 100644 --- a/src/js/Manager/MiningManager.js +++ b/src/js/Manager/MiningManager.js @@ -30,6 +30,14 @@ class MiningManager { addPassword(data) { this.validateData(data); if(this.checkIfDuplicate(data)) return; + data.manual = false; + this.createItem(data); + } + + /** + * @param {Object} data + */ + createItem(data) { let hidden = TabManager.get().tab.incognito; let task = new MiningItem() @@ -38,13 +46,16 @@ class MiningManager { .setTaskField('password', data.password.value) .setTaskField('url', data.url) .setTaskField('hidden', hidden) + .setTaskManual(data.manual) .setTaskNew(true); - let basePassword = this.findPossibleUpdate(data); - if(basePassword !== null) { - task.setTaskField('id', basePassword.getId()) - .setTaskField('label', basePassword.getLabel()) - .setTaskNew(false); + if(!data.manual) { + let basePassword = this.findPossibleUpdate(data); + if(basePassword !== null) { + task.setTaskField('id', basePassword.getId()) + .setTaskField('label', basePassword.getLabel()) + .setTaskNew(false); + } } this.processTask(task); @@ -55,7 +66,7 @@ class MiningManager { */ async processTask(task) { try { - NotificationService.newPasswordNotification(task); + if(task.isNew() && !task.isManual()) NotificationService.newPasswordNotification(task); task = await this._miningQueue.push(task); if(task.isDiscarded()) { diff --git a/src/js/Models/Queue/MiningItem.js b/src/js/Models/Queue/MiningItem.js index 7b99dcf..4202956 100644 --- a/src/js/Models/Queue/MiningItem.js +++ b/src/js/Models/Queue/MiningItem.js @@ -31,6 +31,19 @@ export default class MiningItem extends FeedbackItem { return this; } + + /** + * @param {Boolean} value + * @returns {MiningItem} + */ + setTaskManual(value) { + let task = this.getTask(); + task.manual = value; + this.setTask(task); + + return this; + } + /** * @param {String} name * @param {*} value @@ -116,6 +129,16 @@ export default class MiningItem extends FeedbackItem { return (task.hasOwnProperty('new') && task.new) || (result.hasOwnProperty('new') && result.new); } + /** + * + * @returns {Boolean} + */ + isManual() { + let task = this.getTask(); + + return (task.hasOwnProperty('manual') && task.manual); + } + /** * @param {Boolean} value diff --git a/src/platform/generic/_locales/de/messages.json b/src/platform/generic/_locales/de/messages.json index 34d8025..8d79537 100644 --- a/src/platform/generic/_locales/de/messages.json +++ b/src/platform/generic/_locales/de/messages.json @@ -287,6 +287,10 @@ "message" : "Keine neuen Passwörter vorhanden", "description": "" }, + "AddPasswordForCurrentTab" : { + "message" : "Konto wür aktuellen Tab hinzufügen", + "description": "Used in the collected tab for the option to add a blank entry with just the url of the current tab" + }, "NoServerItems" : { "message" : "Keine Elemente vorhanden", "description": "" diff --git a/src/platform/generic/_locales/en/messages.json b/src/platform/generic/_locales/en/messages.json index 44625d0..2a0d082 100644 --- a/src/platform/generic/_locales/en/messages.json +++ b/src/platform/generic/_locales/en/messages.json @@ -301,6 +301,10 @@ "message" : "No new passwords found", "description": "Used in the collected tab when no new passwords have been found" }, + "AddPasswordForCurrentTab" : { + "message" : "Add account for current tab", + "description": "Used in the collected tab for the option to add a blank entry with just the url of the current tab" + }, "NoServerItems" : { "message" : "No elements found", "description": "Used in the browse tab when a server has no entries to list" diff --git a/src/vue/Components/Collected/MinedProperty.vue b/src/vue/Components/Collected/MinedProperty.vue index 0d4f978..78541e5 100644 --- a/src/vue/Components/Collected/MinedProperty.vue +++ b/src/vue/Components/Collected/MinedProperty.vue @@ -1,8 +1,9 @@ <template> <div :class="classList"> - <label :for="id" @dblclick="edit()" :title="editing ? '':title">{{label}}</label> - <div @dblclick="edit()" v-if="!editing" :title="title">{{text}}</div> - <input-field :id="id" :type="type" v-model="value" @keypress="checkEnter($event)" title="TitleEnterToExit" v-else/> + <label :for="id" @dblclick="edit()" :title="title">{{ label }}</label> + <div @dblclick="edit()" v-if="!editing" :title="title">{{ text }}</div> + <input-field :id="id" v-model="value" @keypress="checkEnter($event)" title="TitleEnterToExit" v-else-if="type === 'text'"/> + <slider-field :id="id" v-model="value" v-else/> </div> </template> @@ -11,9 +12,10 @@ import MiningItem from '@js/Models/Queue/MiningItem'; import MessageService from '@js/Services/MessageService'; import InputField from '@vue/Components/Form/InputField'; + import SliderField from "@vue/Components/Form/SliderField"; export default { - components: {InputField}, + components: {SliderField, InputField}, props : { item : { type: MiningItem @@ -26,8 +28,7 @@ data() { return { editing: this.field === 'hidden', - value : this.item.getResultField(this.field), - title : LocalisationService.translate('TitleClickToEdit') + value : this.item.getResultField(this.field) }; }, @@ -50,6 +51,10 @@ }, type() { return this.field === 'hidden' ? 'checkbox':'text'; + }, + title() { + if(this.field === 'hidden') return ''; + return this.editing ? LocalisationService.translate('TitleEnterToExit'):LocalisationService.translate('TitleClickToEdit'); } }, @@ -78,63 +83,67 @@ </script> <style lang="scss"> - .mining-property { - padding : .5rem; +.mining-property { + padding : .5rem; + + label { + cursor : pointer; + display : block; + font-weight : bold; + color : var(--element-active-fg-color) + } - label { - cursor : pointer; - display : block; - font-weight : bold; - color : var(--element-active-fg-color) + div { + cursor : pointer; + padding : .25rem; + box-sizing : border-box; + border-radius : 3px; + border : none; + line-height : 2rem; + height : 2.5rem; + white-space : nowrap; + text-overflow : ellipsis; + overflow : hidden; + box-shadow : 0 0 0 1px transparent; + transition : box-shadow .15s ease-in-out; + color : var(--element-fg-color); + + &:hover { + box-shadow : 0 0 0 1px var(--element-hover-bg-color); } + } + input { + width : 100%; + padding : .25rem; + box-sizing : border-box; + box-shadow : 0 0 0 1px var(--element-active-fg-color); + border-radius : 3px; + border : none; + line-height : 2rem; + background-color : var(--element-bg-color); + color : var(--element-fg-color); + } + + &.field-password { div { - cursor : pointer; - padding : .25rem; - box-sizing : border-box; - border-radius : 3px; - border : none; - line-height : 2rem; - white-space : nowrap; - text-overflow : ellipsis; - overflow : hidden; - box-shadow : 0 0 0 1px transparent; - transition : box-shadow .15s ease-in-out; - color : var(--element-fg-color); - - &:hover { - box-shadow : 0 0 0 1px var(--element-hover-bg-color); - } + font-family : "Font Awesome 5 Free", sans-serif; + font-size : .5rem; + letter-spacing : .25rem; + font-weight : bold; } + } - input { - width : 100%; - padding : .25rem; - box-sizing : border-box; - box-shadow : 0 0 0 1px var(--element-active-fg-color); - border-radius : 3px; - border : none; - line-height : 2rem; - background-color : var(--element-bg-color); - color : var(--element-fg-color); - } + &.field-hidden { + display : flex; - &.field-password { - div { - font-family : "Font Awesome 5 Free", sans-serif; - font-size : .5rem; - letter-spacing : .25rem; - font-weight : bold; - } + label { + flex-grow : 1; } - &.field-hidden { - display: flex; - - input { - width: auto; - margin-left: auto; - } + .input-slider { + margin-top : 2px; } } +} </style>
\ No newline at end of file diff --git a/src/vue/Components/Form/SliderField.vue b/src/vue/Components/Form/SliderField.vue index efa0db8..544f2cd 100644 --- a/src/vue/Components/Form/SliderField.vue +++ b/src/vue/Components/Form/SliderField.vue @@ -115,7 +115,7 @@ &.on { .input-slider-button { - left : .55rem; + left : calc(100% - .9em); } } diff --git a/src/vue/Components/Popup/Collected.vue b/src/vue/Components/Popup/Collected.vue index fa8c769..03f1f01 100644 --- a/src/vue/Components/Popup/Collected.vue +++ b/src/vue/Components/Popup/Collected.vue @@ -8,6 +8,9 @@ <mining-item :item="item" :slot="item.getId()" :key="item.getId()" v-for="item of items"/> </foldout> <translate tag="div" class="no-results" say="NoCollectedPasswords" v-if="items.length === 0"/> + <translate class="collected-add-blank" say="AddPasswordForCurrentTab" @click="addBlankPassword" v-if="items.length === 0"> + <icon slot="before" icon="user-plus" font="solid"/> + </translate> </div> </template> @@ -18,6 +21,7 @@ import MiningClient from '@js/Queue/Client/MiningClient'; import MiningItem from '@vue/Components/Collected/MiningItem'; import MessageService from '@js/Services/MessageService'; + import ErrorManager from '@js/Manager/ErrorManager'; export default { components: {MiningItem, Translate, Foldout, Icon}, @@ -35,8 +39,8 @@ data() { return { - items : MiningClient.getItems(), - current: null, + items : MiningClient.getItems(), + current : null, listener: (i) => { this.addItem(i); } }; }, @@ -103,12 +107,19 @@ this.items.push(item); }, + addBlankPassword() { + MessageService + .send('password.add.blank') + .catch(ErrorManager.catchEvt); + }, + sendStatus() { let status = { current: this.current }; MessageService - .send({type: 'popup.status.set', payload: {tab: 'collected', status}}); + .send({type: 'popup.status.set', payload: {tab: 'collected', status}}) + .catch(ErrorManager.catchEvt); } }, @@ -121,10 +132,30 @@ </script> <style lang="scss"> - .collected-container { - .no-results { - line-height : 3rem; - text-align : center; +.collected-container { + .no-results { + line-height : 3rem; + text-align : center; + } + + .collected-add-blank { + position : fixed; + bottom : 0; + padding : 1rem; + width : 100%; + border-top : 1px solid var(--element-active-fg-color); + background-color : var(--element-active-bg-color); + color : var(--element-active-hover-fg-color); + cursor : pointer; + transition : var(--element-transition); + + &:hover { + background-color : var(--element-active-hover-bg-color); + } + + .icon { + margin-right : .5rem; } } +} </style>
\ No newline at end of file |