Rebuild organize imports: move furniture between categories, 500-item cap
This commit is contained in:
1 parent
67430e7e9d
commit
644d53ca16
28 files changed
+578
-224
No files matched your search
@@ -349,7 +349,7 @@ export async function createAutoCategory(input: {
|
||||
}
|
||||
|
||||
const MAX_ORGANIZE_GROUPS = 50;
|
||||
const MAX_ORGANIZE_ITEMS = 1000;
|
||||
const MAX_ORGANIZE_ITEMS = 500;
|
||||
|
||||
export interface OrganizeImportGroup {
|
||||
caption: string;
|
||||
|
||||
@@ -210,6 +210,7 @@ export const GET = withAdmin(
|
||||
// then we can use the extra fields in the returned groups.
|
||||
const sugItems = items.map((it) => ({
|
||||
id: it.itemId,
|
||||
itemId: it.itemId,
|
||||
itemName: it.itemName,
|
||||
publicName: it.publicName,
|
||||
type: it.type,
|
||||
@@ -217,6 +218,7 @@ export const GET = withAdmin(
|
||||
interactionType: it.interactionType,
|
||||
alreadyPlaced: it.alreadyPlaced,
|
||||
catalogItemId: it.catalogItemId,
|
||||
sourcePageCaption: it.sourcePageCaption,
|
||||
})) as SugFurniEntryExtra[];
|
||||
const groups = groupSuggestedCategories(sugItems).map((g) => {
|
||||
const moved = g.items.filter((i) => i.alreadyPlaced).length;
|
||||
@@ -227,17 +229,16 @@ export const GET = withAdmin(
|
||||
total: g.items.length,
|
||||
moved,
|
||||
added: g.items.length - moved,
|
||||
thumbs: g.items.slice(0, 12).map((i) => ({
|
||||
itemName: i.itemName,
|
||||
publicName: i.publicName,
|
||||
spriteId: i.spriteId,
|
||||
alreadyPlaced: i.alreadyPlaced,
|
||||
sourcePageCaption: i.sourcePageCaption,
|
||||
})),
|
||||
items: g.items.map((i) => ({
|
||||
itemId: i.itemId,
|
||||
catalogItemId: i.catalogItemId,
|
||||
alreadyPlaced: i.alreadyPlaced,
|
||||
itemName: i.itemName,
|
||||
publicName: i.publicName,
|
||||
spriteId: i.spriteId,
|
||||
type: i.type,
|
||||
interactionType: i.interactionType,
|
||||
sourcePageCaption: i.sourcePageCaption ?? null,
|
||||
})),
|
||||
};
|
||||
});
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
Plus,
|
||||
RefreshCw,
|
||||
Search,
|
||||
Trash2,
|
||||
Wand2,
|
||||
X,
|
||||
} from "lucide-react";
|
||||
@@ -42,10 +43,13 @@ import {
|
||||
isValidCatalogLayout,
|
||||
LAYOUT_DESCRIPTIONS,
|
||||
} from "@/lib/catalog-layouts";
|
||||
// import { CATALOG_LAYOUTS } from "@/lib/catalog-layouts";
|
||||
import { getLocalIconUrl } from "@/lib/furni/classname";
|
||||
import { cn } from "@/lib/utils";
|
||||
|
||||
const MAX_ITEMS_PER_RUN = 500;
|
||||
const ITEMS_VISIBLE = 40;
|
||||
const QUICK_PICKS = 40;
|
||||
|
||||
interface OrganizeGroupOverride {
|
||||
caption?: string;
|
||||
icon?: number;
|
||||
@@ -57,6 +61,18 @@ interface RootPage {
|
||||
caption: string;
|
||||
}
|
||||
|
||||
interface OrganizeImportItem {
|
||||
itemId: number;
|
||||
catalogItemId: number | null;
|
||||
alreadyPlaced: boolean;
|
||||
itemName: string;
|
||||
publicName: string;
|
||||
spriteId: number;
|
||||
type: string;
|
||||
interactionType: string;
|
||||
sourcePageCaption: string | null;
|
||||
}
|
||||
|
||||
interface OrganizeImportGroup {
|
||||
name: string;
|
||||
icon: number;
|
||||
@@ -64,18 +80,7 @@ interface OrganizeImportGroup {
|
||||
total: number;
|
||||
moved: number;
|
||||
added: number;
|
||||
thumbs: {
|
||||
itemName: string;
|
||||
publicName: string;
|
||||
spriteId: number;
|
||||
alreadyPlaced: boolean;
|
||||
sourcePageCaption: string | null;
|
||||
}[];
|
||||
items: {
|
||||
itemId: number;
|
||||
catalogItemId: number | null;
|
||||
alreadyPlaced: boolean;
|
||||
}[];
|
||||
items: OrganizeImportItem[];
|
||||
}
|
||||
|
||||
interface OrganizeImportsDialogProps {
|
||||
@@ -129,6 +134,9 @@ export function OrganizeImportsDialog({
|
||||
const [batchLayout, setBatchLayout] = useState<CatalogLayout>("default_3x3");
|
||||
const [batchPrefix, setBatchPrefix] = useState("");
|
||||
|
||||
const [expanded, setExpanded] = useState<Record<string, boolean>>({});
|
||||
const [selection, setSelection] = useState<Set<number>>(new Set());
|
||||
|
||||
const load = useCallback(async () => {
|
||||
setLoading(true);
|
||||
setLoadError(false);
|
||||
@@ -168,6 +176,8 @@ export function OrganizeImportsDialog({
|
||||
setGroups([]);
|
||||
setApproved({});
|
||||
setOverrides({});
|
||||
setExpanded({});
|
||||
setSelection(new Set());
|
||||
setParentId(-1);
|
||||
setMoveMode(false);
|
||||
setDestinationPageId(null);
|
||||
@@ -220,11 +230,11 @@ export function OrganizeImportsDialog({
|
||||
}, [moveMode, destDebounced]);
|
||||
|
||||
const allApproved =
|
||||
groups.length > 0 && groups.every((g) => approved[g.name]);
|
||||
groups.length > 0 && groups.every((g) => approved[g.name] !== false);
|
||||
const totalSelected = useMemo(
|
||||
() =>
|
||||
groups.reduce(
|
||||
(sum, g) => sum + (approved[g.name] ? g.items.length : 0),
|
||||
(sum, g) => sum + (approved[g.name] !== false ? g.items.length : 0),
|
||||
0,
|
||||
),
|
||||
[groups, approved],
|
||||
@@ -233,7 +243,7 @@ export function OrganizeImportsDialog({
|
||||
// One approved group becomes exactly one page, so the "Create … pages"
|
||||
// label must count groups, not the furni items inside them.
|
||||
const selectedGroupsCount = useMemo(
|
||||
() => groups.filter((g) => approved[g.name]).length,
|
||||
() => groups.filter((g) => approved[g.name] !== false).length,
|
||||
[groups, approved],
|
||||
);
|
||||
|
||||
@@ -294,27 +304,77 @@ export function OrganizeImportsDialog({
|
||||
const filteredGroups = useMemo(() => {
|
||||
const q = groupSearchQuery.trim().toLowerCase();
|
||||
return groups.filter((g) => {
|
||||
if (onlyUnplaced && g.added === 0 && g.moved === 0) return false;
|
||||
const movedCount = g.items.filter((i) => i.alreadyPlaced).length;
|
||||
const addedCount = g.items.length - movedCount;
|
||||
if (onlyUnplaced && addedCount === 0 && movedCount === 0) return false;
|
||||
if (!q) return true;
|
||||
if (g.name.toLowerCase().includes(q)) return true;
|
||||
const caption = overrides[g.name]?.caption?.toLowerCase();
|
||||
if (caption?.includes(q)) return true;
|
||||
return g.thumbs.some((t) => t.itemName.toLowerCase().includes(q));
|
||||
return g.items.some((i) => i.itemName.toLowerCase().includes(q));
|
||||
});
|
||||
}, [groups, groupSearchQuery, onlyUnplaced, overrides]);
|
||||
|
||||
const moveItemToGroup = (
|
||||
item: OrganizeImportItem,
|
||||
fromName: string,
|
||||
toName: string,
|
||||
) => {
|
||||
if (!toName || toName === fromName) return;
|
||||
setGroups((prev) =>
|
||||
prev.map((g) => {
|
||||
if (g.name === fromName) {
|
||||
const items = g.items.filter((i) => i.itemId !== item.itemId);
|
||||
return { ...g, items };
|
||||
}
|
||||
if (g.name === toName) {
|
||||
const exists = g.items.some((i) => i.itemId === item.itemId);
|
||||
return exists ? g : { ...g, items: [...g.items, item] };
|
||||
}
|
||||
return g;
|
||||
}),
|
||||
);
|
||||
};
|
||||
|
||||
const moveSelectedToGroup = (toName: string) => {
|
||||
if (selection.size === 0 || !toName) return;
|
||||
setGroups((prev) => {
|
||||
const moved: OrganizeImportItem[] = [];
|
||||
const next = prev.map((g) => {
|
||||
if (g.name === toName) return g;
|
||||
const taken = g.items.filter((i) => selection.has(i.itemId));
|
||||
const kept = g.items.filter((i) => !selection.has(i.itemId));
|
||||
moved.push(...taken);
|
||||
return taken.length === 0 ? g : { ...g, items: kept };
|
||||
});
|
||||
if (moved.length === 0) return prev;
|
||||
return next.map((g) =>
|
||||
g.name === toName ? { ...g, items: [...g.items, ...moved] } : g,
|
||||
);
|
||||
});
|
||||
setSelection(new Set());
|
||||
};
|
||||
|
||||
const moveItemOptions = (fromName: string) =>
|
||||
groups.filter((g) => g.name !== fromName);
|
||||
|
||||
const handleCreate = async () => {
|
||||
if (isCreating) return;
|
||||
if (totalSelected > 1000) {
|
||||
toast.error(t("errorMaxItems"));
|
||||
if (totalSelected === 0) {
|
||||
toast.error(t("errorNoName"));
|
||||
return;
|
||||
}
|
||||
if (totalSelected > MAX_ITEMS_PER_RUN) {
|
||||
toast.error(t("errorMaxItems", { count: MAX_ITEMS_PER_RUN }));
|
||||
return;
|
||||
}
|
||||
if (groups.length === 0) return;
|
||||
if (moveMode && destinationPageId == null) {
|
||||
toast.error(t("chooseDestination"));
|
||||
return;
|
||||
}
|
||||
const payload = groups
|
||||
.filter((g) => approved[g.name])
|
||||
.filter((g) => approved[g.name] !== false)
|
||||
.map((g) => {
|
||||
const o = overrides[g.name] ?? {};
|
||||
return {
|
||||
@@ -342,7 +402,7 @@ export function OrganizeImportsDialog({
|
||||
return;
|
||||
}
|
||||
|
||||
if (payload.length === 0 || payload.some((g) => !g.caption)) {
|
||||
if (payload.some((g) => !g.caption)) {
|
||||
toast.error(t("errorNoName"));
|
||||
return;
|
||||
}
|
||||
@@ -351,9 +411,9 @@ export function OrganizeImportsDialog({
|
||||
const result = await organizeImportFurni({ parentId, groups: payload });
|
||||
if (!result.ok) throw new Error(result.error ?? "Failed");
|
||||
const created = result.data?.created ?? [];
|
||||
const moved = created.reduce((sum, c) => sum + c.moved, 0);
|
||||
const added = created.reduce((sum, c) => sum + c.added, 0);
|
||||
if (moveMode) {
|
||||
const moved = created.reduce((sum, c) => sum + c.moved, 0);
|
||||
const added = created.reduce((sum, c) => sum + c.added, 0);
|
||||
toast.success(
|
||||
t("successMove", {
|
||||
moved,
|
||||
@@ -362,8 +422,6 @@ export function OrganizeImportsDialog({
|
||||
}),
|
||||
);
|
||||
} else {
|
||||
const moved = created.reduce((sum, c) => sum + c.moved, 0);
|
||||
const added = created.reduce((sum, c) => sum + c.added, 0);
|
||||
toast.success(
|
||||
t("successCreate", {
|
||||
count: created.length,
|
||||
@@ -382,10 +440,12 @@ export function OrganizeImportsDialog({
|
||||
}
|
||||
};
|
||||
|
||||
const quickPicks = rootPages.slice(0, QUICK_PICKS);
|
||||
|
||||
return (
|
||||
<>
|
||||
<Dialog open={open} onOpenChange={onOpenChange}>
|
||||
<DialogContent className="flex h-[90vh] max-h-[90vh] w-[800px] max-w-[95vw] flex-col overflow-hidden p-0">
|
||||
<DialogContent className="flex h-[90vh] max-h-[90vh] w-[860px] max-w-[95vw] flex-col overflow-hidden p-0">
|
||||
<DialogHeader className="flex-none border-b px-4 py-3">
|
||||
<DialogTitle className="flex items-center gap-2 text-sm font-semibold">
|
||||
<FolderTree className="h-4 w-4" />
|
||||
@@ -543,47 +603,70 @@ export function OrganizeImportsDialog({
|
||||
</button>
|
||||
</div>
|
||||
) : (
|
||||
<div className="relative">
|
||||
<Search className="absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground" />
|
||||
<Input
|
||||
className="h-8 pl-8 text-xs"
|
||||
placeholder={t("destinationSearchPlaceholder")}
|
||||
value={destQuery}
|
||||
onChange={(e) => setDestQuery(e.target.value)}
|
||||
/>
|
||||
{destSearchLoading && (
|
||||
<Loader2 className="absolute right-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 animate-spin text-muted-foreground" />
|
||||
<>
|
||||
<div className="relative">
|
||||
<Search className="absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground" />
|
||||
<Input
|
||||
className="h-8 pl-8 text-xs"
|
||||
placeholder={t("destinationSearchPlaceholder")}
|
||||
value={destQuery}
|
||||
onChange={(e) => setDestQuery(e.target.value)}
|
||||
/>
|
||||
{destSearchLoading && (
|
||||
<Loader2 className="absolute right-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 animate-spin text-muted-foreground" />
|
||||
)}
|
||||
</div>
|
||||
{/* Quick pick: click a root page without typing */}
|
||||
{destQuery.length < 2 && quickPicks.length > 0 && (
|
||||
<div className="flex max-h-[140px] flex-wrap gap-1 overflow-y-auto rounded border bg-[var(--admin-canvas)] p-1.5">
|
||||
{quickPicks.map((p) => (
|
||||
<button
|
||||
type="button"
|
||||
key={p.id}
|
||||
onClick={() => {
|
||||
setDestinationPageId(p.id);
|
||||
setDestinationCaption(p.caption);
|
||||
}}
|
||||
className="flex max-w-full items-center gap-1 rounded border border-[var(--admin-border)] bg-[var(--admin-surface)] px-2 py-1 text-[10px] text-[var(--admin-text)] hover:border-current"
|
||||
>
|
||||
<Folder className="h-3 w-3 shrink-0" />
|
||||
<span className="min-w-0 truncate">
|
||||
{p.caption}
|
||||
</span>
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
{destinationPageId == null && destDebounced.length >= 2 && (
|
||||
<div className="max-h-[160px] divide-y overflow-y-auto rounded border">
|
||||
{destResults.length === 0 && !destSearchLoading ? (
|
||||
<p className="py-3 text-center text-[10px] text-muted-foreground">
|
||||
{t("noDestResults")}
|
||||
</p>
|
||||
) : (
|
||||
destResults.map((p) => (
|
||||
<button
|
||||
key={p.id}
|
||||
type="button"
|
||||
onClick={() => {
|
||||
setDestinationPageId(p.id);
|
||||
setDestinationCaption(p.caption);
|
||||
}}
|
||||
className="flex w-full items-center gap-2 px-2 py-1.5 text-left hover:bg-accent"
|
||||
>
|
||||
<Folder className="h-3.5 w-3.5 shrink-0" />
|
||||
<span className="min-w-0 flex-1 truncate text-xs">
|
||||
{p.caption}
|
||||
</span>
|
||||
<span className="font-mono text-[9px] text-muted-foreground">
|
||||
#{p.id}
|
||||
</span>
|
||||
</button>
|
||||
))
|
||||
{destQuery.length >= 2 && (
|
||||
<div className="max-h-[160px] divide-y overflow-y-auto rounded border">
|
||||
{destResults.length === 0 && !destSearchLoading ? (
|
||||
<p className="py-3 text-center text-[10px] text-muted-foreground">
|
||||
{t("noDestResults")}
|
||||
</p>
|
||||
) : (
|
||||
destResults.map((p) => (
|
||||
<button
|
||||
key={p.id}
|
||||
type="button"
|
||||
onClick={() => {
|
||||
setDestinationPageId(p.id);
|
||||
setDestinationCaption(p.caption);
|
||||
}}
|
||||
className="flex w-full items-center gap-2 px-2 py-1.5 text-left hover:bg-accent"
|
||||
>
|
||||
<Folder className="h-3.5 w-3.5 shrink-0" />
|
||||
<span className="min-w-0 flex-1 truncate text-xs">
|
||||
{p.caption}
|
||||
</span>
|
||||
<span className="font-mono text-[9px] text-muted-foreground">
|
||||
#{p.id}
|
||||
</span>
|
||||
</button>
|
||||
))
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
<p className="text-[10px] text-muted-foreground">
|
||||
{t("destinationHint")}
|
||||
@@ -748,6 +831,52 @@ export function OrganizeImportsDialog({
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Move selected to another category */}
|
||||
{selection.size > 0 && (
|
||||
<div className="flex flex-wrap items-center gap-2 rounded-md border border-[var(--admin-accent)]/40 bg-[var(--admin-accent-subtle)] px-2.5 py-2">
|
||||
<span className="text-[10px] font-semibold text-[var(--admin-accent)]">
|
||||
{t("selectedCount", { count: selection.size })}
|
||||
</span>
|
||||
<span className="text-[10px] text-muted-foreground">
|
||||
{t("batchMoveTo")}
|
||||
</span>
|
||||
<Select
|
||||
value=""
|
||||
onValueChange={(v) => {
|
||||
if (v) {
|
||||
moveSelectedToGroup(v);
|
||||
setExpanded((prev) => ({ ...prev, [v]: true }));
|
||||
}
|
||||
}}
|
||||
>
|
||||
<SelectTrigger className="h-7 w-[180px] text-[10px]">
|
||||
<SelectValue placeholder={t("batchMoveTo")} />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{groups.map((g) => (
|
||||
<SelectItem
|
||||
key={g.name}
|
||||
value={g.name}
|
||||
className="text-xs"
|
||||
>
|
||||
{g.name}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
<Button
|
||||
type="button"
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
className="h-7 px-2 text-[10px] text-muted-foreground hover:text-foreground"
|
||||
onClick={() => setSelection(new Set())}
|
||||
>
|
||||
<Trash2 className="mr-1 h-3 w-3" />
|
||||
{t("clearSelection")}
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{filteredGroups.map((group) => {
|
||||
@@ -756,16 +885,23 @@ export function OrganizeImportsDialog({
|
||||
const icon = o.icon ?? group.icon;
|
||||
const layout = o.layout ?? group.layout ?? "default_3x3";
|
||||
const isApproved = approved[group.name] !== false;
|
||||
const moved = group.moved;
|
||||
const added = group.added;
|
||||
const movedCount = group.items.filter(
|
||||
(i) => i.alreadyPlaced,
|
||||
).length;
|
||||
const addedCount = group.items.length - movedCount;
|
||||
const isExpanded = expanded[group.name] ?? false;
|
||||
const visibleItems = isExpanded
|
||||
? group.items
|
||||
: group.items.slice(0, ITEMS_VISIBLE);
|
||||
const moveTargets = moveItemOptions(group.name);
|
||||
return (
|
||||
<label
|
||||
<div
|
||||
key={group.name}
|
||||
className={cn(
|
||||
"block rounded-md border bg-[var(--admin-surface)] p-3 transition-colors",
|
||||
isApproved
|
||||
? "border-[var(--admin-accent)]/40"
|
||||
: "opacity-60",
|
||||
: "opacity-70",
|
||||
)}
|
||||
>
|
||||
<div className="flex items-center gap-2">
|
||||
@@ -788,32 +924,28 @@ export function OrganizeImportsDialog({
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
className="h-5 gap-1 px-1.5 text-[10px]"
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
setPreviewGroup(group);
|
||||
}}
|
||||
onClick={() => setPreviewGroup(group)}
|
||||
>
|
||||
<Eye className="h-3 w-3" />
|
||||
{t("visualPreview")}
|
||||
</Button>
|
||||
<Badge variant="secondary" className="h-4 text-[9px]">
|
||||
{group.total}
|
||||
{group.items.length}
|
||||
</Badge>
|
||||
{moved > 0 && (
|
||||
{movedCount > 0 && (
|
||||
<Badge
|
||||
variant="outline"
|
||||
className="h-4 gap-1 text-[9px] text-muted-foreground"
|
||||
>
|
||||
{t("movedLabel", { count: moved })}
|
||||
{t("movedLabel", { count: movedCount })}
|
||||
</Badge>
|
||||
)}
|
||||
{added > 0 && (
|
||||
{addedCount > 0 && (
|
||||
<Badge
|
||||
variant="outline"
|
||||
className="h-4 gap-1 text-[9px] text-muted-foreground"
|
||||
>
|
||||
{t("newLabel", { count: added })}
|
||||
{t("newLabel", { count: addedCount })}
|
||||
</Badge>
|
||||
)}
|
||||
</div>
|
||||
@@ -827,7 +959,6 @@ export function OrganizeImportsDialog({
|
||||
<Input
|
||||
className="h-7 text-xs"
|
||||
value={caption}
|
||||
onClick={(e) => e.stopPropagation()}
|
||||
onChange={(e) =>
|
||||
updateGroup(group.name, {
|
||||
caption: e.target.value,
|
||||
@@ -840,13 +971,11 @@ export function OrganizeImportsDialog({
|
||||
variant="outline"
|
||||
size="sm"
|
||||
className="h-7 shrink-0 px-2 text-[10px]"
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
onClick={() =>
|
||||
updateGroup(group.name, {
|
||||
caption: group.name,
|
||||
});
|
||||
}}
|
||||
})
|
||||
}
|
||||
>
|
||||
<Wand2 className="mr-0.5 h-2.5 w-2.5" />
|
||||
{t("resetSuggestion")}
|
||||
@@ -869,7 +998,6 @@ export function OrganizeImportsDialog({
|
||||
variant="outline"
|
||||
size="sm"
|
||||
className="h-7 gap-1.5 px-2"
|
||||
onClick={(e) => e.stopPropagation()}
|
||||
>
|
||||
<CatalogIcon iconImage={icon} size={16} />
|
||||
<span className="font-mono text-[10px] text-muted-foreground">
|
||||
@@ -883,11 +1011,9 @@ export function OrganizeImportsDialog({
|
||||
variant="outline"
|
||||
size="sm"
|
||||
className="h-7 px-2 text-[10px]"
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
updateGroup(group.name, { icon: group.icon });
|
||||
}}
|
||||
onClick={() =>
|
||||
updateGroup(group.name, { icon: group.icon })
|
||||
}
|
||||
>
|
||||
<Wand2 className="mr-0.5 h-2.5 w-2.5" />
|
||||
{group.icon}
|
||||
@@ -906,13 +1032,11 @@ export function OrganizeImportsDialog({
|
||||
"bg-muted text-muted-foreground";
|
||||
return (
|
||||
<button
|
||||
key={l}
|
||||
type="button"
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
updateGroup(group.name, { layout: l });
|
||||
}}
|
||||
key={l}
|
||||
onClick={() =>
|
||||
updateGroup(group.name, { layout: l })
|
||||
}
|
||||
className={cn(
|
||||
"rounded border px-1.5 py-0.5 font-mono text-[10px] transition-colors",
|
||||
layout === l
|
||||
@@ -936,9 +1060,7 @@ export function OrganizeImportsDialog({
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
className="h-6 w-fit border border-[var(--admin-warning-border)] bg-[var(--admin-warning-subtle)] px-2 text-[10px] text-[var(--admin-warning)]"
|
||||
onClick={(e) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
onClick={() =>
|
||||
updateGroup(group.name, {
|
||||
layout:
|
||||
group.layout === null
|
||||
@@ -946,8 +1068,8 @@ export function OrganizeImportsDialog({
|
||||
: isValidCatalogLayout(group.layout)
|
||||
? group.layout
|
||||
: undefined,
|
||||
});
|
||||
}}
|
||||
})
|
||||
}
|
||||
>
|
||||
<Wand2 className="mr-0.5 h-2.5 w-2.5" />
|
||||
{t("suggestedLayout", {
|
||||
@@ -959,41 +1081,113 @@ export function OrganizeImportsDialog({
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className="mt-2 flex flex-wrap gap-1.5 border-t pt-2">
|
||||
{group.thumbs.slice(0, 12).map((thumb) => (
|
||||
<div
|
||||
key={thumb.itemName}
|
||||
className="group flex flex-col items-center gap-0.5"
|
||||
>
|
||||
{/* Item rows: every furniture item in this category */}
|
||||
<div className="mt-2 border-t pt-2">
|
||||
{visibleItems.map((item) => {
|
||||
const checked = selection.has(item.itemId);
|
||||
return (
|
||||
<div
|
||||
className="relative"
|
||||
title={thumb.publicName || thumb.itemName}
|
||||
key={item.itemId}
|
||||
className="flex items-center gap-2 rounded border border-[var(--admin-border)] bg-[var(--admin-canvas)] px-2 py-1"
|
||||
>
|
||||
<FurniThumb item={{ itemName: thumb.itemName }} />
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={checked}
|
||||
onChange={(e) =>
|
||||
setSelection((prev) => {
|
||||
const next = new Set(prev);
|
||||
if (e.target.checked) next.add(item.itemId);
|
||||
else next.delete(item.itemId);
|
||||
return next;
|
||||
})
|
||||
}
|
||||
/>
|
||||
<FurniThumb
|
||||
item={{ itemName: item.itemName }}
|
||||
size={28}
|
||||
/>
|
||||
<div className="min-w-0 flex-1">
|
||||
<p className="truncate text-xs font-medium text-[var(--admin-text)]">
|
||||
{item.publicName || item.itemName}
|
||||
</p>
|
||||
<p className="truncate font-mono text-[9px] text-muted-foreground">
|
||||
{item.itemName}
|
||||
</p>
|
||||
</div>
|
||||
{item.alreadyPlaced ? (
|
||||
<span className="shrink-0 rounded bg-[var(--admin-success-subtle)] px-1.5 py-0.5 text-[9px] text-[var(--admin-text)]">
|
||||
{item.sourcePageCaption
|
||||
? item.sourcePageCaption.replace(
|
||||
new RegExp(`^${t("impPrefix")}`),
|
||||
"",
|
||||
)
|
||||
: t("isMoved")}
|
||||
</span>
|
||||
) : (
|
||||
<span className="shrink-0 rounded bg-[var(--admin-info-subtle)] px-1.5 py-0.5 text-[9px] text-[var(--admin-text)]">
|
||||
{t("isNew")}
|
||||
</span>
|
||||
)}
|
||||
{moveTargets.length > 0 && (
|
||||
<select
|
||||
title={t("moveItemTo")}
|
||||
value=""
|
||||
onChange={(e) => {
|
||||
moveItemToGroup(
|
||||
item,
|
||||
group.name,
|
||||
e.target.value,
|
||||
);
|
||||
e.target.value = "";
|
||||
}}
|
||||
className="h-6 shrink-0 rounded border border-[var(--admin-border)] bg-[var(--admin-surface)] px-1 text-[9px] text-[var(--admin-text)]"
|
||||
>
|
||||
<option value="" disabled>
|
||||
{t("moveItemTo")}
|
||||
</option>
|
||||
{moveTargets.map((g) => (
|
||||
<option key={g.name} value={g.name}>
|
||||
{g.name}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
)}
|
||||
</div>
|
||||
{thumb.alreadyPlaced ? (
|
||||
<span className="max-w-14 truncate text-[8px] text-muted-foreground">
|
||||
{thumb.sourcePageCaption
|
||||
? thumb.sourcePageCaption.replace(
|
||||
new RegExp(`^${t("impPrefix")}`),
|
||||
"",
|
||||
)
|
||||
: t("isMoved")}
|
||||
</span>
|
||||
) : (
|
||||
<span className="max-w-14 truncate text-[8px] text-muted-foreground">
|
||||
{t("isNew")}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
))}
|
||||
{group.total > 12 && (
|
||||
<p className="self-center text-[10px] text-muted-foreground">
|
||||
+{group.total - 12}
|
||||
</p>
|
||||
)}
|
||||
);
|
||||
})}
|
||||
|
||||
{group.items.length > ITEMS_VISIBLE &&
|
||||
(isExpanded ? (
|
||||
<button
|
||||
type="button"
|
||||
onClick={() =>
|
||||
setExpanded((prev) => ({
|
||||
...prev,
|
||||
[group.name]: false,
|
||||
}))
|
||||
}
|
||||
className="mt-1 w-full rounded border border-[var(--admin-border)] py-1 text-[10px] text-muted-foreground hover:text-foreground"
|
||||
>
|
||||
{t("showLess")}
|
||||
</button>
|
||||
) : (
|
||||
<button
|
||||
type="button"
|
||||
onClick={() =>
|
||||
setExpanded((prev) => ({
|
||||
...prev,
|
||||
[group.name]: true,
|
||||
}))
|
||||
}
|
||||
className="mt-1 w-full rounded border border-[var(--admin-border)] py-1 text-[10px] text-muted-foreground hover:text-foreground"
|
||||
>
|
||||
{t("showAll", {
|
||||
count: group.items.length,
|
||||
})}
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
</label>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</>
|
||||
@@ -1017,6 +1211,7 @@ export function OrganizeImportsDialog({
|
||||
loading ||
|
||||
isCreating ||
|
||||
totalSelected === 0 ||
|
||||
totalSelected > MAX_ITEMS_PER_RUN ||
|
||||
(moveMode && destinationPageId == null)
|
||||
}
|
||||
onClick={() => void handleCreate()}
|
||||
@@ -1039,7 +1234,7 @@ export function OrganizeImportsDialog({
|
||||
open={previewGroup != null}
|
||||
onOpenChange={(open) => !open && setPreviewGroup(null)}
|
||||
>
|
||||
<DialogContent className="max-w-md">
|
||||
<DialogContent className="max-w-lg">
|
||||
<DialogHeader>
|
||||
<DialogTitle className="flex items-center gap-2 text-base">
|
||||
<CatalogIcon iconImage={previewGroup?.icon ?? 1} size={24} />
|
||||
@@ -1056,7 +1251,7 @@ export function OrganizeImportsDialog({
|
||||
</span>
|
||||
</div>
|
||||
<Badge variant="outline" className="text-[10px]">
|
||||
{previewGroup.total} items
|
||||
{previewGroup.items.length} items
|
||||
</Badge>
|
||||
</div>
|
||||
{previewGroup.layout &&
|
||||
@@ -1065,20 +1260,28 @@ export function OrganizeImportsDialog({
|
||||
{LAYOUT_DESCRIPTIONS[previewGroup.layout]}
|
||||
</p>
|
||||
)}
|
||||
<div className="max-h-[220px] overflow-y-auto rounded border p-2">
|
||||
<div className="max-h-[260px] overflow-y-auto rounded border p-2">
|
||||
<div className="grid grid-cols-4 gap-1.5">
|
||||
{previewGroup.thumbs.map((thumb) => (
|
||||
{previewGroup.items.slice(0, 40).map((item) => (
|
||||
<div
|
||||
key={thumb.itemName}
|
||||
key={item.itemId}
|
||||
className="flex flex-col items-center gap-1 rounded border bg-background p-1.5"
|
||||
>
|
||||
<FurniThumb item={thumb} size={32} />
|
||||
<FurniThumb
|
||||
item={{ itemName: item.itemName }}
|
||||
size={32}
|
||||
/>
|
||||
<span className="w-full truncate text-center text-[9px] text-muted-foreground">
|
||||
{thumb.itemName}
|
||||
{item.itemName}
|
||||
</span>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
{previewGroup.items.length > 40 && (
|
||||
<p className="py-2 text-center text-[10px] text-muted-foreground">
|
||||
{t("showAll", { count: previewGroup.items.length })}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
@@ -907,12 +907,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -920,7 +920,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2034,12 +2034,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2047,7 +2047,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2034,12 +2034,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2047,7 +2047,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2034,12 +2034,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2047,7 +2047,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2004,12 +2004,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2017,7 +2017,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Alle anzeigen ({count})",
|
||||
"showLess": "Weniger anzeigen",
|
||||
"moveItemTo": "Verschieben zu…",
|
||||
"batchMoveTo": "Auswahl verschieben zu…",
|
||||
"selectedCount": "{count} ausgewählt",
|
||||
"clearSelection": "Auswahl aufheben"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2034,12 +2034,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2047,7 +2047,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2260,12 +2260,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2273,7 +2273,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"bulk": {
|
||||
|
||||
@@ -2004,12 +2004,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2017,7 +2017,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Mostrar todo ({count})",
|
||||
"showLess": "Mostrar menos",
|
||||
"moveItemTo": "Mover a…",
|
||||
"batchMoveTo": "Mover seleccionados a…",
|
||||
"selectedCount": "{count} seleccionados",
|
||||
"clearSelection": "Limpiar selección"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -907,12 +907,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -920,7 +920,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2004,12 +2004,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2017,7 +2017,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Tout afficher ({count})",
|
||||
"showLess": "Afficher moins",
|
||||
"moveItemTo": "Déplacer vers…",
|
||||
"batchMoveTo": "Déplacer la sélection vers…",
|
||||
"selectedCount": "{count} sélectionné(s)",
|
||||
"clearSelection": "Effacer la sélection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2034,12 +2034,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2047,7 +2047,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2034,12 +2034,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2047,7 +2047,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2179,12 +2179,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2192,7 +2192,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Mostra tutto ({count})",
|
||||
"showLess": "Mostra meno",
|
||||
"moveItemTo": "Sposta verso…",
|
||||
"batchMoveTo": "Sposta la selezione verso…",
|
||||
"selectedCount": "{count} selezionati",
|
||||
"clearSelection": "Azzera selezione"
|
||||
}
|
||||
},
|
||||
"bulk": {
|
||||
|
||||
@@ -907,12 +907,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -920,7 +920,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2124,12 +2124,12 @@
|
||||
"visualPreview": "Voorbeeld",
|
||||
"resetAll": "Wijzigingen herstellen",
|
||||
"onlyUnplaced": "Toon alleen ongeplaatste items",
|
||||
"errorMaxItems": "Maximaal 1000 items per run. Verlaag de selectie.",
|
||||
"errorMaxItems": "Maximaal 500 items per run. Verlaag de selectie.",
|
||||
"errorMaxGroups": "Maximaal {count} groepen per run. Verlaag de selectie.",
|
||||
"errorNoName": "Elke goedgekeurde pagina heeft een naam nodig",
|
||||
"tipMove": "Tip: Kies de doelpagina in het vak hieronder om meubels te verplaatsen.",
|
||||
"tipCreate": "Tip: Kies deze modus om nieuwe pagina's aan te maken.",
|
||||
"limitHint": "Maximaal 1000 items en 50 groepen per run.",
|
||||
"limitHint": "Maximaal 500 items en 50 groepen per run.",
|
||||
"errorFailed": "Kon imports niet organiseren",
|
||||
"successMove": "{moved} item{moved, plural, one { verplaatst} other {s verplaatst}}{added, plural, =0 {} other {, {added} nieuw toegevoegd}} naar \"{destination}\"",
|
||||
"successCreate": "{count, plural, one {1 pagina} other {# pagina's}} aangemaakt met {moved} verplaatste en {added} toegevoegde meubels",
|
||||
@@ -2137,7 +2137,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "verplaatst"
|
||||
"isMoved": "verplaatst",
|
||||
"showAll": "Alles tonen ({count})",
|
||||
"showLess": "Minder tonen",
|
||||
"moveItemTo": "Verplaatsen naar…",
|
||||
"batchMoveTo": "Geselecteerde verplaatsen naar…",
|
||||
"selectedCount": "{count} geselecteerd",
|
||||
"clearSelection": "Selectie wissen"
|
||||
}
|
||||
},
|
||||
"bulk": {
|
||||
|
||||
@@ -2034,12 +2034,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2047,7 +2047,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2034,12 +2034,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2047,7 +2047,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2034,12 +2034,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2047,7 +2047,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Mostrar tudo ({count})",
|
||||
"showLess": "Mostrar menos",
|
||||
"moveItemTo": "Mover para…",
|
||||
"batchMoveTo": "Mover seleção para…",
|
||||
"selectedCount": "{count} selecionados",
|
||||
"clearSelection": "Limpar seleção"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2034,12 +2034,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2047,7 +2047,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2032,12 +2032,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2045,7 +2045,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2034,12 +2034,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2047,7 +2047,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2034,12 +2034,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2047,7 +2047,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2034,12 +2034,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2047,7 +2047,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2034,12 +2034,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2047,7 +2047,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Tümünü göster ({count})",
|
||||
"showLess": "Daha az göster",
|
||||
"moveItemTo": "Taşı…",
|
||||
"batchMoveTo": "Seçimi taşı…",
|
||||
"selectedCount": "{count} seçildi",
|
||||
"clearSelection": "Seçimi temizle"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
@@ -2034,12 +2034,12 @@
|
||||
"visualPreview": "Preview",
|
||||
"resetAll": "Reset overrides",
|
||||
"onlyUnplaced": "Only show unplaced items",
|
||||
"errorMaxItems": "Max 1000 items per run. Reduce selection.",
|
||||
"errorMaxItems": "Max 500 items per run. Reduce selection.",
|
||||
"errorMaxGroups": "Max {count} groups per run. Reduce selection.",
|
||||
"errorNoName": "Every approved page needs a name",
|
||||
"tipMove": "Tip: Pick a destination page below to move furniture.",
|
||||
"tipCreate": "Tip: Pick this mode to create new pages.",
|
||||
"limitHint": "Max 1000 items and 50 groups per run.",
|
||||
"limitHint": "Max 500 items and 50 groups per run.",
|
||||
"errorFailed": "Failed to organize imports",
|
||||
"successMove": "Moved {moved} offer{moved, plural, one {} other {s}}{added, plural, =0 {} other {, added {added} new}} to \"{destination}\"",
|
||||
"successCreate": "Created {count, plural, one {1 page} other {# pages}} with {moved} moved and {added} added furniture",
|
||||
@@ -2047,7 +2047,13 @@
|
||||
"layoutFallbackDefault3x3": "3x3",
|
||||
"itemsUnit": "items",
|
||||
"impPrefix": "Imp ",
|
||||
"isMoved": "moved"
|
||||
"isMoved": "moved",
|
||||
"showAll": "Show all ({count})",
|
||||
"showLess": "Show less",
|
||||
"moveItemTo": "Move to…",
|
||||
"batchMoveTo": "Move selected to…",
|
||||
"selectedCount": "{count} selected",
|
||||
"clearSelection": "Clear selection"
|
||||
}
|
||||
},
|
||||
"discovery": {
|
||||
|
||||
Reference in new issue
Block a user