1
Fork 0

Add an option to hide the user label editor [+].

This commit is contained in:
Bauke 2023-10-19 14:09:00 +02:00
parent 1222ec4f13
commit cf18323f27
Signed by: Bauke
GPG Key ID: C1C0F29952BCF558
6 changed files with 105 additions and 41 deletions

View File

@ -16,6 +16,7 @@ import {
type Props = { type Props = {
anonymizeUsernamesEnabled: boolean; anonymizeUsernamesEnabled: boolean;
onSiteNewLabelEnabled: boolean;
userLabels: UserLabelsData; userLabels: UserLabelsData;
}; };
@ -59,7 +60,7 @@ export class UserLabelsFeature extends Component<Props, State> {
}; };
addLabelsToUsernames = (elements: HTMLElement[], onlyID?: number): number => { addLabelsToUsernames = (elements: HTMLElement[], onlyID?: number): number => {
const {userLabels} = this.props; const {onSiteNewLabelEnabled, userLabels} = this.props;
const inTopicListing = document.querySelector(".topic-listing") !== null; const inTopicListing = document.querySelector(".topic-listing") !== null;
// Sort the labels by priority or alphabetically, so 2 labels with the same // Sort the labels by priority or alphabetically, so 2 labels with the same
@ -103,7 +104,7 @@ export class UserLabelsFeature extends Component<Props, State> {
[+] [+]
</span> </span>
); );
if (!inTopicListing && onlyID === undefined) { if (onSiteNewLabelEnabled && !inTopicListing && onlyID === undefined) {
const addLabelPlaceholder = document.createElement("span"); const addLabelPlaceholder = document.createElement("span");
element.after(addLabelPlaceholder); element.after(addLabelPlaceholder);
render(addLabel, element.parentElement!, addLabelPlaceholder); render(addLabel, element.parentElement!, addLabelPlaceholder);
@ -111,6 +112,7 @@ export class UserLabelsFeature extends Component<Props, State> {
if (userLabels.length === 0 && onlyID === undefined) { if (userLabels.length === 0 && onlyID === undefined) {
if ( if (
onSiteNewLabelEnabled &&
inTopicListing && inTopicListing &&
(element.nextElementSibling === null || (element.nextElementSibling === null ||
!element.nextElementSibling.className.includes("trx-user-label")) !element.nextElementSibling.className.includes("trx-user-label"))

View File

@ -156,9 +156,11 @@ async function initialize() {
} }
if (enabledFeatures.value.has(Feature.UserLabels)) { if (enabledFeatures.value.has(Feature.UserLabels)) {
const onSiteNewLabelEnabled = await fromStorage(Data.OnSiteNewLabel);
components.userLabels = ( components.userLabels = (
<UserLabelsFeature <UserLabelsFeature
anonymizeUsernamesEnabled={anonymizeUsernamesEnabled} anonymizeUsernamesEnabled={anonymizeUsernamesEnabled}
onSiteNewLabelEnabled={onSiteNewLabelEnabled.value}
userLabels={userLabels} userLabels={userLabels}
/> />
); );

View File

@ -1,46 +1,97 @@
import {Component} from "preact";
import {Data, fromStorage, type StorageValues} from "../../storage/exports.js";
import {Setting, type SettingProps} from "./index.js"; import {Setting, type SettingProps} from "./index.js";
export function UserLabelsSetting(props: SettingProps) { type State = {
return ( onSiteNewLabelEnabled:
<Setting {...props}> | Awaited<StorageValues[Data.OnSiteNewLabel]>
<p class="info"> | undefined;
Adds a way to create customizable labels to users. Wherever a link to a };
person's profile is available, a <code>[+]</code> will be put next to
it. Clicking on that will bring up a dialog to add a new label and
clicking on existing labels will bring up the same dialog to edit them.
<br />
Or you can use the dedicated{" "}
<a href="/options/user-label-editor.html">User Label Editor</a> to add,
edit, or remove user labels.
</p>
<details> export class UserLabelsSetting extends Component<SettingProps, State> {
<summary>View Customizable Values</summary> constructor(props: SettingProps) {
<ul class="user-label-values"> super(props);
this.state = {
onSiteNewLabelEnabled: undefined,
};
}
async componentDidMount() {
this.setState({
onSiteNewLabelEnabled: await fromStorage(Data.OnSiteNewLabel),
});
}
toggleOnSiteNewLabelEnabled = async () => {
const onSiteNewLabelEnabled = this.state.onSiteNewLabelEnabled!;
onSiteNewLabelEnabled.value = !onSiteNewLabelEnabled.value;
await onSiteNewLabelEnabled.save();
this.setState({onSiteNewLabelEnabled});
};
render() {
const {onSiteNewLabelEnabled} = this.state;
if (onSiteNewLabelEnabled === undefined) {
return;
}
return (
<Setting {...this.props}>
<p class="info">
Adds a way to create customizable labels to users. Wherever a link to
a person's profile is available, a <code>[+]</code> will be put next
to it. Clicking on that will bring up a dialog to add a new label and
clicking on existing labels will bring up the same dialog to edit
them.
<br />
Or you can use the dedicated{" "}
<a href="/options/user-label-editor.html">User Label Editor</a> to
add, edit, or remove user labels.
</p>
<ul class="checkbox-list">
<li> <li>
<b>Username</b>: who to apply the label to. <label class="styled-checkbox">
</li> <input
<li> type="checkbox"
<b>Priority</b>: determines the order of labels. If multiple labels checked={onSiteNewLabelEnabled.value}
have the same priority they will be sorted alphabetically. In the onClick={this.toggleOnSiteNewLabelEnabled}
topic listing only the highest priority label will be shown. />
</li> Show new label editor next to usernames
<li> </label>
<b>Color</b>: will set the background color of the label. The
foreground color is calculated to be black or white depending on the
brightness of the background color.
<br />
Valid values are hex colors or <code>transparent</code>.
<br />
Colors based on your current Tildes theme are also available in the
dropdown menu.
</li>
<li>
<b>Text</b>: the text to go in the label. If left empty the label
will show as a 12 by 12 pixel square instead.
</li> </li>
</ul> </ul>
</details>
</Setting> <details>
); <summary>View Customizable Values</summary>
<ul class="user-label-values">
<li>
<b>Username</b>: who to apply the label to.
</li>
<li>
<b>Priority</b>: determines the order of labels. If multiple
labels have the same priority they will be sorted alphabetically.
In the topic listing only the highest priority label will be
shown.
</li>
<li>
<b>Color</b>: will set the background color of the label. The
foreground color is calculated to be black or white depending on
the brightness of the background color.
<br />
Valid values are hex colors or <code>transparent</code>.
<br />
Colors based on your current Tildes theme are also available in
the dropdown menu.
</li>
<li>
<b>Text</b>: the text to go in the label. If left empty the label
will show as a 12 by 12 pixel square instead.
</li>
</ul>
</details>
</Setting>
);
}
} }

View File

@ -86,6 +86,7 @@
flex-direction: column; flex-direction: column;
gap: 8px; gap: 8px;
list-style: none; list-style: none;
margin-bottom: 8px;
label { label {
cursor: pointer; cursor: pointer;

View File

@ -36,6 +36,7 @@ export enum Data {
KnownGroups = "known-groups", KnownGroups = "known-groups",
LatestActiveFeatureTab = "latest-active-feature-tab", LatestActiveFeatureTab = "latest-active-feature-tab",
MiscellaneousEnabledFeatures = "miscellaneous-enabled-features", MiscellaneousEnabledFeatures = "miscellaneous-enabled-features",
OnSiteNewLabel = "on-site-new-label",
RandomizeUsernameColors = "randomize-username-colors", RandomizeUsernameColors = "randomize-username-colors",
Version = "data-version", Version = "data-version",
} }

View File

@ -64,6 +64,13 @@ export const storageValues = {
value: new Set([MiscellaneousFeature.CommentAnchorFix]), value: new Set([MiscellaneousFeature.CommentAnchorFix]),
storage: browser.storage.sync, storage: browser.storage.sync,
}), }),
[Data.OnSiteNewLabel]: createValue({
deserialize: (input) => JSON.parse(input) as boolean,
serialize: (input) => JSON.stringify(input),
key: Data.OnSiteNewLabel,
value: true,
storage: browser.storage.sync,
}),
[Data.Version]: createValue({ [Data.Version]: createValue({
deserialize: (input) => JSON.parse(input) as string, deserialize: (input) => JSON.parse(input) as string,
serialize: (input) => JSON.stringify(input), serialize: (input) => JSON.stringify(input),