Skip to content

Commit 00bb7e3

Browse files
feat: add toggle rule activation
1 parent 7924b98 commit 00bb7e3

File tree

7 files changed

+79
-4
lines changed

7 files changed

+79
-4
lines changed

src/common/helpers.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { Rule } from './types.ts';
2+
13
export function _clone(obj: any) {
24
if (obj === null || typeof obj !== 'object') {
35
return obj;
@@ -230,6 +232,14 @@ export function _getIcons() {
230232
];
231233
}
232234

233-
export function _generateRandomId() {
235+
export function _generateRandomId(): string {
234236
return Math.random().toString(36).substring(2, 9);
235237
}
238+
239+
export function _isRuleEnabled(rule: Rule): boolean {
240+
if (rule.is_enabled === undefined) {
241+
return true;
242+
}
243+
244+
return rule.is_enabled;
245+
}

src/common/storage.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export function _getDefaultTabModifierSettings(): TabModifierSettings {
1717
export function _getDefaultRule(name: string, title: string, urlFragment: string): Rule {
1818
return {
1919
id: _generateRandomId(),
20+
is_enabled: true,
2021
name: name,
2122
detection: 'CONTAINS',
2223
url_fragment: urlFragment,

src/common/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export type Rule = {
2525
detection: string;
2626
url_fragment: string;
2727
tab: Tab;
28+
is_enabled: boolean;
2829
};
2930

3031
export type Group = {

src/components/options/center/sections/TabRules/RuleForm.vue

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
<template>
2-
<h3 v-if="options.showTitle" class="font-bold text-lg flex justify-between mb-2">
3-
<span v-if="isEditMode">Edit rule</span>
2+
<h3 v-if="options.showTitle" class="font-bold text-lg flex justify-between mb-2 gap-4">
3+
<div v-if="isEditMode" class="flex justify-between w-full items-center justify-center">
4+
<span>Edit rule</span>
5+
6+
<input
7+
v-model="currentRule.is_enabled"
8+
type="checkbox"
9+
class="toggle toggle-xs toggle-primary"
10+
/>
11+
</div>
412
<span v-else>Add a new rule</span>
513

614
<div class="flex gap-2 items-center">

src/components/options/center/sections/TabRules/TableRules.vue

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<table class="table table-zebra">
44
<thead>
55
<tr>
6+
<th scope="col"></th>
67
<th scope="col">Name</th>
78
<th scope="col">Group</th>
89
<th scope="col">Title</th>
@@ -16,6 +17,23 @@
1617
<draggable v-model="rules" tag="tbody" item-key="id" @end="onDragEnd">
1718
<template #item="{ element: rule }">
1819
<tr class="group cursor-pointer hover:bg-base-100" @click="editRule(rule)">
20+
<td>
21+
<div class="tooltip tooltip-right" data-tip="Enable / Disable Rule">
22+
<input
23+
v-if="rule.is_enabled"
24+
checked="checked"
25+
type="checkbox"
26+
class="toggle toggle-xs toggle-primary"
27+
@click.prevent="(event) => toggleRule(event, rule)"
28+
/>
29+
<input
30+
v-else
31+
type="checkbox"
32+
class="toggle toggle-xs toggle-success"
33+
@click.prevent="(event) => toggleRule(event, rule)"
34+
/>
35+
</div>
36+
</td>
1937
<td scope="row">{{ rule.name }}</td>
2038
<td>
2139
<template v-if="!rule.tab.group_id">-</template>
@@ -129,6 +147,17 @@ const editRule = (rule: Rule) => {
129147
} as RuleModalParams);
130148
};
131149
150+
const toggleRule = async (event: MouseEvent, rule: Rule) => {
151+
event.stopPropagation();
152+
153+
if (typeof rule.is_enabled === 'undefined') {
154+
rule.is_enabled = true;
155+
}
156+
157+
await rulesStore.toggleRule(rule.id);
158+
rules.value = [...rulesStore.rules]; // Update the rules array after toggling
159+
};
160+
132161
const duplicateRule = async (event: MouseEvent, ruleId: string) => {
133162
event.stopPropagation();
134163
await rulesStore.duplicateRule(ruleId);

src/content.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,10 @@ export async function applyRule(ruleParam, updateTitle) {
189189
return;
190190
}
191191

192+
if (rule.is_enabled === undefined || !rule.is_enabled) {
193+
return;
194+
}
195+
192196
if (rule.tab.title && updateTitle) {
193197
let originalTitleElement = document.querySelector('meta[name="original-tab-modifier-title"]');
194198

src/stores/rules.store.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { defineStore } from 'pinia';
22
import { Group, Rule, Settings, TabModifierSettings } from '../common/types.ts';
3-
import { _clone, _generateRandomId } from '../common/helpers.ts';
3+
import { _clone, _generateRandomId, _isRuleEnabled } from '../common/helpers.ts';
44
import {
55
_clearStorage,
66
_getDefaultTabModifierSettings,
@@ -40,6 +40,17 @@ export const useRulesStore = defineStore('rules', {
4040

4141
return rules;
4242
},
43+
fixRuleIsEnabled(rules: Rule[]) {
44+
rules = rules.map((rule) => {
45+
if (rule.is_enabled === undefined) {
46+
rule.is_enabled = true;
47+
}
48+
49+
return rule;
50+
});
51+
52+
return rules;
53+
},
4354
handleMissingRuleSettings(rules: Rule[]): Rule[] {
4455
rules = rules.map((rule) => {
4556
if (!rule.id) {
@@ -106,6 +117,7 @@ export const useRulesStore = defineStore('rules', {
106117
tabModifier.groups = tabModifier.groups ?? [];
107118
tabModifier.rules = this.handleMissingRuleSettings(tabModifier.rules);
108119
tabModifier.rules = this.fixDuplicateRuleIds(tabModifier.rules);
120+
tabModifier.rules = this.fixRuleIsEnabled(tabModifier.rules);
109121
tabModifier.groups = this.addMissingInvisibleChar(tabModifier.groups);
110122

111123
this.groups = tabModifier.groups;
@@ -129,6 +141,7 @@ export const useRulesStore = defineStore('rules', {
129141
config.groups = config.groups ?? [];
130142
config.rules = this.handleMissingRuleSettings(config.rules);
131143
config.rules = this.fixDuplicateRuleIds(config.rules);
144+
config.rules = this.fixRuleIsEnabled(config.rules);
132145
config.groups = this.addMissingInvisibleChar(config.groups);
133146

134147
const defaultConfig = _getDefaultTabModifierSettings();
@@ -247,6 +260,15 @@ export const useRulesStore = defineStore('rules', {
247260

248261
await this.save();
249262
},
263+
async toggleRule(ruleId: string) {
264+
const index = this.getRuleIndexById(ruleId);
265+
const rule = this.rules[index];
266+
const isEnabled = _isRuleEnabled(rule);
267+
268+
this.rules[index].is_enabled = !isEnabled;
269+
270+
await this.save();
271+
},
250272
async duplicateRule(ruleId: string): Promise<Rule> {
251273
const index = this.getRuleIndexById(ruleId);
252274

0 commit comments

Comments
 (0)