Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/marius-wieschollek/passwords-webextension.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/js/Controller/Password/AddBlank.js12
-rw-r--r--src/js/Manager/ControllerManager.js7
-rw-r--r--src/js/Manager/MiningManager.js23
-rw-r--r--src/js/Models/Queue/MiningItem.js23
-rw-r--r--src/platform/generic/_locales/de/messages.json4
-rw-r--r--src/platform/generic/_locales/en/messages.json4
-rw-r--r--src/vue/Components/Collected/MinedProperty.vue117
-rw-r--r--src/vue/Components/Form/SliderField.vue2
-rw-r--r--src/vue/Components/Popup/Collected.vue45
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