refactor: rename groupped to grouped

This commit is contained in:
Aleix Soler 2025-07-16 17:52:30 +02:00
parent 200e8b4abd
commit 77442bec67
11 changed files with 101 additions and 104 deletions

View file

@ -22,7 +22,7 @@ export type GroupedByStatus = {
[frontmatterTag: string]: FilesByStatus;
};
export type GrouppedStatusViewProps = {
export type GroupedStatusViewProps = {
getAllFiles: () => FileItem[];
processFiles: (files: FileItem[]) => GroupedByStatus;
onFileClick: (file: FileItem) => void;
@ -32,13 +32,13 @@ export type GrouppedStatusViewProps = {
const ITEMS_PER_LOAD = 20;
export const GrouppedStatusView = ({
export const GroupedStatusView = ({
getAllFiles,
processFiles,
onFileClick,
subscribeToEvents,
getAvailableStatuses,
}: GrouppedStatusViewProps) => {
}: GroupedStatusViewProps) => {
const [groupedData, setGroupedData] = useState<GroupedByStatus>({});
const [searchFilter, setSearchFilter] = useState("");
const [noteNameFilter, setNoteNameFilter] = useState("");
@ -206,8 +206,8 @@ export const GrouppedStatusView = ({
if (isLoading) {
return (
<div className="groupped-status-view">
<div className="groupped-status-loading">
<div className="">
<div className="grouped-status-loading">
Loading statuses...
</div>
</div>
@ -215,7 +215,7 @@ export const GrouppedStatusView = ({
}
return (
<div className="groupped-status-view">
<div className="">
<FilterSection
searchFilter={searchFilter}
noteNameFilter={noteNameFilter}
@ -223,7 +223,7 @@ export const GrouppedStatusView = ({
onNoteNameFilterChange={setNoteNameFilter}
/>
<div className="groupped-status-content">
<div className="grouped-status-content">
{Object.entries(filteredData).map(([tag, statusGroups]) => {
const tagKey = `tag-${tag}`;
const isTagExpanded = expandedGroups.has(tagKey);
@ -247,7 +247,7 @@ export const GrouppedStatusView = ({
})}
{Object.keys(filteredData).length === 0 && (
<div className="groupped-status-empty">
<div className="grouped-status-empty">
{searchFilter
? "No files match your search."
: "No statuses found."}

View file

@ -1,5 +1,5 @@
import React, { useCallback } from "react";
import { FileItem } from "../GrouppedStatusView";
import { FileItem } from "../GroupedStatusView";
interface FileListProps {
files: FileItem[];
@ -44,27 +44,27 @@ export const FileList = ({
);
return (
<div className="groupped-status-files">
<div className="groupped-status-files-list" onScroll={handleScroll}>
<div className="grouped-status-files">
<div className="grouped-status-files-list" onScroll={handleScroll}>
{visibleFiles.map((file) => (
<div
key={file.id}
className="groupped-status-file-item"
className="grouped-status-file-item"
onClick={() => handleFileClick(file)}
>
<span className="groupped-status-file-name">
<span className="grouped-status-file-name">
{file.name}
</span>
<span className="groupped-status-file-path">
<span className="grouped-status-file-path">
{file.path}
</span>
</div>
))}
{hasMoreItems && (
<div className="groupped-status-load-more">
<div className="grouped-status-load-more">
<button
className="groupped-status-load-btn"
className="grouped-status-load-btn"
onClick={handleLoadMore}
>
Load more... ({files.length - loadedCount}{" "}

View file

@ -15,18 +15,18 @@ export const FilterSection = ({
onNoteNameFilterChange,
}: FilterSectionProps) => {
return (
<div className="groupped-status-header">
<h3 className="groupped-status-title">Status Groups</h3>
<div className="groupped-status-filters">
<div className="grouped-status-header">
<h3 className="grouped-status-title">Status Groups</h3>
<div className="grouped-status-filters">
<SearchFilter
value={searchFilter}
onFilterChange={onSearchFilterChange}
/>
<div className="groupped-status-note-filter">
<div className="grouped-status-note-filter">
<input
type="text"
placeholder="Filter by note name..."
className="groupped-status-note-input"
className="grouped-status-note-input"
value={noteNameFilter}
onChange={(e) => onNoteNameFilterChange(e.target.value)}
/>

View file

@ -1,7 +1,7 @@
import React, { useCallback } from "react";
import { StatusBadge } from "@/components/atoms/StatusBadge";
import { CollapsibleCounter } from "@/components/atoms/CollapsibleCounter";
import { FileItem, StatusItem } from "../GrouppedStatusView";
import { FileItem, StatusItem } from "../GroupedStatusView";
import { FileList } from "./FileList";
import { NoteStatus } from "@/types/noteStatus";
@ -41,17 +41,14 @@ export const StatusGroup = ({
}, [onToggle]);
return (
<div className="groupped-status-group">
<div
className="groupped-status-group-header"
onClick={handleToggle}
>
<div className="grouped-status-group">
<div className="grouped-status-group-header" onClick={handleToggle}>
<StatusBadge
status={
{ ...status, icon: status.icon || "" } as NoteStatus
}
/>
<div className="groupped-status-group-info">
<div className="grouped-status-group-info">
<CollapsibleCounter
count={files.length}
isCollapsed={!isExpanded}

View file

@ -1,7 +1,7 @@
import React, { useCallback } from "react";
import { GroupLabel } from "@/components/atoms/GroupLabel";
import { CollapsibleCounter } from "@/components/atoms/CollapsibleCounter";
import { FilesByStatus, FileItem, StatusItem } from "../GrouppedStatusView";
import { FilesByStatus, FileItem, StatusItem } from "../GroupedStatusView";
import { StatusGroup } from "./StatusGroup";
interface TagSectionProps {
@ -52,8 +52,8 @@ export const TagSection = ({
);
return (
<div className="groupped-status-tag-section">
<div className="groupped-status-tag-header" onClick={handleToggle}>
<div className="grouped-status-tag-section">
<div className="grouped-status-tag-header" onClick={handleToggle}>
<GroupLabel name={tag} />
<CollapsibleCounter
count={totalFilesInTag}
@ -63,7 +63,7 @@ export const TagSection = ({
</div>
{isExpanded && (
<div className="groupped-status-tag-content">
<div className="grouped-status-tag-content">
{Object.entries(statusGroups).map(([statusName, files]) => {
if (files.length === 0) return null;

View file

@ -394,7 +394,7 @@ export const StatusDashboard = () => {
const leaf =
BaseNoteStatusService.app.workspace.getLeaf();
leaf.setViewState({
type: "groupped-status-view",
type: "grouped-status-view",
active: true,
});
}}

View file

@ -1,12 +1,12 @@
import { ItemView, WorkspaceLeaf, TFile } from "obsidian";
import { Root, createRoot } from "react-dom/client";
import { GrouppedStatusView as GrouppedStatusViewComponent } from "@/components/GrouppedStatusView/GrouppedStatusView";
import { GroupedStatusView as GroupedStatusViewComponent } from "@/components/GroupedStatusView/GroupedStatusView";
import { BaseNoteStatusService } from "@/core/noteStatusService";
import eventBus from "@/core/eventBus";
import settingsService from "@/core/settingsService";
import { NoteStatus } from "@/types/noteStatus";
export const VIEW_TYPE_GROUPPED_DASHBOARD = "groupped-dashboard-view";
export const VIEW_TYPE_GROUPED_DASHBOARD = "grouped-dashboard-view";
interface FileItem {
id: string;
@ -28,7 +28,7 @@ interface GroupedByStatus {
[frontmatterTag: string]: FilesByStatus;
}
export class GrouppedDashboardView extends ItemView {
export class GroupedDashboardView extends ItemView {
root: Root | null = null;
constructor(leaf: WorkspaceLeaf) {
@ -36,11 +36,11 @@ export class GrouppedDashboardView extends ItemView {
}
getViewType() {
return VIEW_TYPE_GROUPPED_DASHBOARD;
return VIEW_TYPE_GROUPED_DASHBOARD;
}
getDisplayText() {
return "Groupped Status Dashboard";
return "Grouped Status Dashboard";
}
getIcon() {
@ -130,7 +130,7 @@ export class GrouppedDashboardView extends ItemView {
eventBus.subscribe(
"frontmatter-manually-changed",
onDataChange,
"groupped-dashboard-view-subscription",
"grouped-dashboard-view-subscription",
);
const unsubscribeActiveFile = BaseNoteStatusService.app.workspace.on(
"active-leaf-change",
@ -140,7 +140,7 @@ export class GrouppedDashboardView extends ItemView {
return () => {
eventBus.unsubscribe(
"frontmatter-manually-changed",
"groupped-dashboard-view-subscription",
"grouped-dashboard-view-subscription",
);
BaseNoteStatusService.app.workspace.offref(unsubscribeActiveFile);
};
@ -149,11 +149,11 @@ export class GrouppedDashboardView extends ItemView {
async onOpen() {
const container = this.containerEl.children[1];
container.empty();
container.addClass("groupped-dashboard-view-container");
container.addClass("grouped-dashboard-view-container");
this.root = createRoot(container);
this.root.render(
<GrouppedStatusViewComponent
<GroupedStatusViewComponent
getAllFiles={this.getAllFiles}
processFiles={this.processFiles}
onFileClick={this.handleFileClick}

View file

@ -3,17 +3,17 @@ import { Root, createRoot } from "react-dom/client";
import {
FileItem,
GroupedByStatus,
GrouppedStatusView as GrouppedStatusViewComponent,
GroupedStatusView as GroupedStatusViewComponent,
StatusItem,
} from "@/components/GrouppedStatusView/GrouppedStatusView";
} from "@/components/GroupedStatusView/GroupedStatusView";
import { BaseNoteStatusService } from "@/core/noteStatusService";
import eventBus from "@/core/eventBus";
import settingsService from "@/core/settingsService";
import { NoteStatus } from "@/types/noteStatus";
export const VIEW_TYPE_EXAMPLE = "groupped-status-view";
export const VIEW_TYPE_EXAMPLE = "grouped-status-view";
export class GrouppedStatusView extends ItemView {
export class GroupedStatusView extends ItemView {
root: Root | null = null;
constructor(leaf: WorkspaceLeaf) {
@ -25,7 +25,7 @@ export class GrouppedStatusView extends ItemView {
}
getDisplayText() {
return "Groupped Status View";
return "Grouped Status View";
}
getIcon() {
@ -115,7 +115,7 @@ export class GrouppedStatusView extends ItemView {
eventBus.subscribe(
"frontmatter-manually-changed",
onDataChange,
"groupped-status-view-subscription",
"grouped-status-view-subscription",
);
const unsubscribeActiveFile = BaseNoteStatusService.app.workspace.on(
"active-leaf-change",
@ -125,7 +125,7 @@ export class GrouppedStatusView extends ItemView {
return () => {
eventBus.unsubscribe(
"frontmatter-manually-changed",
"groupped-status-view-subscription",
"grouped-status-view-subscription",
);
BaseNoteStatusService.app.workspace.offref(unsubscribeActiveFile);
};
@ -134,11 +134,11 @@ export class GrouppedStatusView extends ItemView {
async onOpen() {
const container = this.containerEl.children[1];
container.empty();
container.addClass("groupped-status-view-container");
container.addClass("grouped-status-view-container");
this.root = createRoot(container);
this.root.render(
<GrouppedStatusViewComponent
<GroupedStatusViewComponent
getAllFiles={this.getAllFiles}
processFiles={this.processFiles}
onFileClick={this.handleFileClick}

View file

@ -9,9 +9,9 @@ import ContextMenuIntegration from "./integrations/context-menu/contextMenuInteg
import { FileExplorerIntegration } from "./integrations/file-explorer/file-explorer-integration";
import { CommandsIntegration } from "./integrations/commands/commandsIntegration";
import {
GrouppedStatusView,
GroupedStatusView,
VIEW_TYPE_EXAMPLE,
} from "./integrations/views/groupped-status-view";
} from "./integrations/views/grouped-status-view";
import {
StatusDashboardView,
VIEW_TYPE_STATUS_DASHBOARD,
@ -39,7 +39,7 @@ export default class NoteStatusPlugin extends Plugin {
this.registerView(
VIEW_TYPE_EXAMPLE,
(leaf) => new GrouppedStatusView(leaf),
(leaf) => new GroupedStatusView(leaf),
);
this.registerView(

View file

@ -1,34 +1,34 @@
.groupped-status-view-container {
.grouped-status-view-container {
height: 100%;
overflow: hidden;
}
.groupped-status-view {
.grouped-status-view {
height: 100%;
display: flex;
flex-direction: column;
background-color: var(--background-primary);
}
.groupped-status-header {
.grouped-status-header {
padding: var(--size-4-2) var(--size-4-3);
border-bottom: 1px solid var(--background-modifier-border);
background-color: var(--background-secondary);
flex-shrink: 0;
}
.groupped-status-filters {
.grouped-status-filters {
display: flex;
flex-direction: column;
gap: var(--size-4-2);
}
.groupped-status-note-filter {
.grouped-status-note-filter {
display: flex;
flex-direction: column;
}
.groupped-status-note-input {
.grouped-status-note-input {
width: 100%;
padding: var(--size-2-1) var(--size-2-3);
border: 1px solid var(--background-modifier-border);
@ -39,39 +39,39 @@
transition: border-color var(--anim-duration-fast) var(--anim-motion-smooth);
}
.groupped-status-note-input:focus {
.grouped-status-note-input:focus {
outline: none;
border-color: var(--interactive-accent);
box-shadow: 0 0 0 2px var(--interactive-accent-hover);
}
.groupped-status-note-input::placeholder {
.grouped-status-note-input::placeholder {
color: var(--text-muted);
}
.groupped-status-title {
.grouped-status-title {
margin: 0 0 var(--size-4-2) 0;
font-size: var(--font-ui-large);
font-weight: var(--font-weight-semibold);
color: var(--text-normal);
}
.groupped-status-content {
.grouped-status-content {
flex: 1;
overflow-y: auto;
padding: var(--size-4-2);
max-height: calc(100vh - 120px);
}
.groupped-status-tag-section {
.grouped-status-tag-section {
margin-bottom: var(--size-4-4);
}
.groupped-status-tag-section:last-child {
.grouped-status-tag-section:last-child {
margin-bottom: 0;
}
.groupped-status-tag-header {
.grouped-status-tag-header {
display: flex;
align-items: center;
justify-content: space-between;
@ -85,15 +85,15 @@
margin-bottom: var(--size-4-2);
}
.groupped-status-tag-header:hover {
.grouped-status-tag-header:hover {
background-color: var(--background-modifier-hover);
}
.groupped-status-tag-content {
.grouped-status-tag-content {
padding-left: var(--size-4-2);
}
.groupped-status-group {
.grouped-status-group {
margin-bottom: var(--size-4-2);
border: 1px solid var(--background-modifier-border);
border-radius: var(--radius-m);
@ -101,7 +101,7 @@
overflow: hidden;
}
.groupped-status-group-header {
.grouped-status-group-header {
display: flex;
align-items: center;
justify-content: space-between;
@ -112,31 +112,31 @@
border-bottom: 1px solid transparent;
}
.groupped-status-group-header:hover {
.grouped-status-group-header:hover {
background-color: var(--background-modifier-hover);
}
.groupped-status-group-header:active {
.grouped-status-group-header:active {
background-color: var(--background-modifier-active);
}
.groupped-status-group-info {
.grouped-status-group-info {
display: flex;
align-items: center;
gap: var(--size-2-1);
}
.groupped-status-files {
.grouped-status-files {
border-top: 1px solid var(--background-modifier-border);
background-color: var(--background-secondary);
}
.groupped-status-files-list {
.grouped-status-files-list {
max-height: 300px;
overflow-y: auto;
}
.groupped-status-file-item {
.grouped-status-file-item {
display: flex;
flex-direction: column;
padding: var(--size-2-3) var(--size-4-3);
@ -146,32 +146,32 @@
border-bottom: 1px solid var(--background-modifier-border-hover);
}
.groupped-status-file-item:last-child {
.grouped-status-file-item:last-child {
border-bottom: none;
}
.groupped-status-file-item:hover {
.grouped-status-file-item:hover {
background-color: var(--background-modifier-hover);
}
.groupped-status-file-item:active {
.grouped-status-file-item:active {
background-color: var(--background-modifier-active);
}
.groupped-status-file-name {
.grouped-status-file-name {
font-weight: var(--font-weight-medium);
color: var(--text-normal);
margin-bottom: var(--size-2-1);
font-size: var(--font-ui-medium);
}
.groupped-status-file-path {
.grouped-status-file-path {
font-size: var(--font-ui-small);
color: var(--text-muted);
opacity: 0.8;
}
.groupped-status-loading {
.grouped-status-loading {
display: flex;
align-items: center;
justify-content: center;
@ -180,7 +180,7 @@
color: var(--text-muted);
}
.groupped-status-empty {
.grouped-status-empty {
display: flex;
align-items: center;
justify-content: center;
@ -192,64 +192,64 @@
/* Responsive adjustments */
@media (max-width: 768px) {
.groupped-status-header {
.grouped-status-header {
padding: var(--size-4-1) var(--size-4-2);
}
.groupped-status-content {
.grouped-status-content {
padding: var(--size-4-1);
}
.groupped-status-group-header {
.grouped-status-group-header {
padding: var(--size-4-1) var(--size-4-2);
}
.groupped-status-file-item {
.grouped-status-file-item {
padding: var(--size-2-2) var(--size-4-2);
}
}
/* Dark theme adjustments */
.theme-dark .groupped-status-view {
.theme-dark .grouped-status-view {
border-color: var(--background-modifier-border);
}
.theme-dark .groupped-status-group {
.theme-dark .grouped-status-group {
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
/* Light theme adjustments */
.theme-light .groupped-status-group {
.theme-light .grouped-status-group {
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
}
/* Scrollbar styling for consistency with Obsidian */
.groupped-status-content::-webkit-scrollbar {
.grouped-status-content::-webkit-scrollbar {
width: var(--scrollbar-width);
}
.groupped-status-content::-webkit-scrollbar-track {
.grouped-status-content::-webkit-scrollbar-track {
background: var(--background-secondary);
}
.groupped-status-content::-webkit-scrollbar-thumb {
.grouped-status-content::-webkit-scrollbar-thumb {
background: var(--scrollbar-thumb-bg);
border-radius: var(--radius-s);
}
.groupped-status-content::-webkit-scrollbar-thumb:hover {
.grouped-status-content::-webkit-scrollbar-thumb:hover {
background: var(--scrollbar-thumb-bg-hover);
}
/* Infinite scroll styles */
.groupped-status-load-more {
.grouped-status-load-more {
display: flex;
justify-content: center;
padding: var(--size-4-2);
border-top: 1px solid var(--background-modifier-border-hover);
}
.groupped-status-load-btn {
.grouped-status-load-btn {
padding: var(--size-2-2) var(--size-4-2);
border: 1px solid var(--background-modifier-border);
border-radius: var(--radius-s);
@ -261,30 +261,30 @@
font-weight: var(--font-weight-medium);
}
.groupped-status-load-btn:hover {
.grouped-status-load-btn:hover {
background-color: var(--interactive-hover);
transform: translateY(-1px);
}
.groupped-status-load-btn:active {
.grouped-status-load-btn:active {
background-color: var(--interactive-active);
transform: translateY(0);
}
/* File list scrollbar styling */
.groupped-status-files-list::-webkit-scrollbar {
.grouped-status-files-list::-webkit-scrollbar {
width: var(--scrollbar-width);
}
.groupped-status-files-list::-webkit-scrollbar-track {
.grouped-status-files-list::-webkit-scrollbar-track {
background: var(--background-secondary);
}
.groupped-status-files-list::-webkit-scrollbar-thumb {
.grouped-status-files-list::-webkit-scrollbar-thumb {
background: var(--scrollbar-thumb-bg);
border-radius: var(--radius-s);
}
.groupped-status-files-list::-webkit-scrollbar-thumb:hover {
.grouped-status-files-list::-webkit-scrollbar-thumb:hover {
background: var(--scrollbar-thumb-bg-hover);
}

View file

@ -18,5 +18,5 @@
@import "components/group-label.css";
@import "components/file-explorer-icon.css";
@import "components/status-file-info-popup.css";
@import "components/groupped-status-view.css";
@import "components/grouped-status-view.css";
@import "components/status-dashboard.css";