feat:user management table, create user
This commit is contained in:
parent
cd3d4b1570
commit
4a63d9c334
|
|
@ -0,0 +1,752 @@
|
||||||
|
"use client";
|
||||||
|
|
||||||
|
import SiteBreadcrumb from "@/components/site-breadcrumb";
|
||||||
|
import { zodResolver } from "@hookform/resolvers/zod";
|
||||||
|
import { Check, ChevronsUpDown } from "lucide-react";
|
||||||
|
import { useForm } from "react-hook-form";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { cn, getCookiesDecrypt } from "@/lib/utils";
|
||||||
|
import { Button } from "@/components/ui/button";
|
||||||
|
import {
|
||||||
|
Command,
|
||||||
|
CommandEmpty,
|
||||||
|
CommandGroup,
|
||||||
|
CommandInput,
|
||||||
|
CommandItem,
|
||||||
|
CommandList,
|
||||||
|
} from "@/components/ui/command";
|
||||||
|
import {
|
||||||
|
Form,
|
||||||
|
FormControl,
|
||||||
|
FormField,
|
||||||
|
FormItem,
|
||||||
|
FormLabel,
|
||||||
|
FormMessage,
|
||||||
|
} from "@/components/ui/form";
|
||||||
|
import {
|
||||||
|
Popover,
|
||||||
|
PopoverContent,
|
||||||
|
PopoverTrigger,
|
||||||
|
} from "@/components/ui/popover";
|
||||||
|
import {
|
||||||
|
AdministrationLevelList,
|
||||||
|
getListCompetencies,
|
||||||
|
getListEducation,
|
||||||
|
getListSchools,
|
||||||
|
saveUserInternal,
|
||||||
|
} from "@/service/management-user/management-user";
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
|
import { Input } from "@/components/ui/input";
|
||||||
|
import { Textarea } from "@/components/ui/textarea";
|
||||||
|
import { Link, useRouter } from "@/i18n/routing";
|
||||||
|
import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group";
|
||||||
|
import dynamic from "next/dynamic";
|
||||||
|
import { Checkbox } from "@/components/ui/checkbox";
|
||||||
|
import {
|
||||||
|
Select,
|
||||||
|
SelectContent,
|
||||||
|
SelectItem,
|
||||||
|
SelectTrigger,
|
||||||
|
SelectValue,
|
||||||
|
} from "@/components/ui/select";
|
||||||
|
import Swal from "sweetalert2";
|
||||||
|
import withReactContent from "sweetalert2-react-content";
|
||||||
|
import { close, error, loading } from "@/config/swal";
|
||||||
|
|
||||||
|
const PasswordChecklist = dynamic(() => import("react-password-checklist"), {
|
||||||
|
ssr: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
const sns = [
|
||||||
|
{
|
||||||
|
key: 1,
|
||||||
|
id: "comment",
|
||||||
|
typeId: 1,
|
||||||
|
name: "Komentar Konten",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 2,
|
||||||
|
id: "fb",
|
||||||
|
typeId: 2,
|
||||||
|
name: "Facebook",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 3,
|
||||||
|
id: "ig",
|
||||||
|
typeId: 3,
|
||||||
|
name: "Instagram",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 4,
|
||||||
|
id: "twt",
|
||||||
|
typeId: 4,
|
||||||
|
name: "Twitter",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 5,
|
||||||
|
id: "yt",
|
||||||
|
typeId: 5,
|
||||||
|
name: "Youtube",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 6,
|
||||||
|
id: "emergency",
|
||||||
|
typeId: 6,
|
||||||
|
name: "Emergency Issue",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 7,
|
||||||
|
id: "email",
|
||||||
|
typeId: 7,
|
||||||
|
name: "Email",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 8,
|
||||||
|
id: "inbox",
|
||||||
|
typeId: 8,
|
||||||
|
name: "Pesan Masuk",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 9,
|
||||||
|
id: "whatsapp",
|
||||||
|
typeId: 9,
|
||||||
|
name: "Whatssapp",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 10,
|
||||||
|
id: "tiktok",
|
||||||
|
typeId: 10,
|
||||||
|
name: "Tiktok",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
interface RoleData {
|
||||||
|
id: number;
|
||||||
|
label: string;
|
||||||
|
name: string;
|
||||||
|
value: string;
|
||||||
|
levelNumber: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FormSchema = z.object({
|
||||||
|
level: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
fullname: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
username: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
role: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
nrp: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
address: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
email: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
phoneNumber: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
password: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
confirmPassword: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
isValidPassword: z.boolean().refine((val) => val === true, {
|
||||||
|
message: "Check Password",
|
||||||
|
}),
|
||||||
|
sns: z.array(z.string()).optional(),
|
||||||
|
education: z.string().optional(),
|
||||||
|
school: z.string().optional(),
|
||||||
|
competency: z.string().optional(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export default function CreateUserForm() {
|
||||||
|
const router = useRouter();
|
||||||
|
const MySwal = withReactContent(Swal);
|
||||||
|
const levelName = getCookiesDecrypt("ulnae");
|
||||||
|
const [roleList, setRoleList] = useState<RoleData[]>([]);
|
||||||
|
|
||||||
|
const [userEducations, setUserEducations] = useState<any>();
|
||||||
|
const [userSchools, setUserSchools] = useState<any>();
|
||||||
|
const [userCompetencies, setUserCompetencies] = useState<any>();
|
||||||
|
|
||||||
|
const form = useForm<z.infer<typeof FormSchema>>({
|
||||||
|
resolver: zodResolver(FormSchema),
|
||||||
|
defaultValues: {
|
||||||
|
password: "",
|
||||||
|
confirmPassword: "",
|
||||||
|
sns: [],
|
||||||
|
education: "1",
|
||||||
|
school: "4",
|
||||||
|
competency: "2",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const passwordVal = form.watch("password");
|
||||||
|
const confPasswordVal = form.watch("confirmPassword");
|
||||||
|
const selectedRole = form.watch("role");
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
initFetch();
|
||||||
|
getDataAdditional();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const initFetch = async () => {
|
||||||
|
const response = await AdministrationLevelList();
|
||||||
|
const res = response?.data?.data;
|
||||||
|
var levelsArr: RoleData[] = [];
|
||||||
|
res.forEach((levels: RoleData) => {
|
||||||
|
levelsArr.push({
|
||||||
|
id: levels.id,
|
||||||
|
label: levels.name,
|
||||||
|
name: levels.name,
|
||||||
|
value: String(levels.id),
|
||||||
|
levelNumber: levels.levelNumber,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
setRoleList(levelsArr);
|
||||||
|
};
|
||||||
|
|
||||||
|
async function getDataAdditional() {
|
||||||
|
const resEducations = await getListEducation();
|
||||||
|
setUserEducations(resEducations?.data?.data);
|
||||||
|
const resSchools = await getListSchools();
|
||||||
|
setUserSchools(resSchools?.data?.data);
|
||||||
|
const resCompetencies = await getListCompetencies();
|
||||||
|
setUserCompetencies(resCompetencies?.data?.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
const roles =
|
||||||
|
levelName == "MABES POLRI"
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
id: "ADM-ID",
|
||||||
|
name: "Admin",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "APP-ID",
|
||||||
|
name: "Approver",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "CON-ID",
|
||||||
|
name: "Kontributor",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "SPV-ID",
|
||||||
|
name: "Supervisor Feedback Center",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "OPT-ID",
|
||||||
|
name: "Operator Feedback Center",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "KKUR-ID",
|
||||||
|
name: "Koor Kurator",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "KUR-ID",
|
||||||
|
name: "Kurator",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
{
|
||||||
|
id: "APP-ID",
|
||||||
|
name: "Approver",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "CON-ID",
|
||||||
|
name: "Kontributor",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
async function save(data: z.infer<typeof FormSchema>) {
|
||||||
|
let req: any = {
|
||||||
|
firstName: data.fullname,
|
||||||
|
username: data.username,
|
||||||
|
roleId: data.role,
|
||||||
|
userLevelId: Number(data.level),
|
||||||
|
memberIdentity: data.nrp,
|
||||||
|
address: data.address,
|
||||||
|
email: data.email,
|
||||||
|
password: data.password,
|
||||||
|
passwordConf: data.confirmPassword,
|
||||||
|
isDefault: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (data.role == "OPT-ID") {
|
||||||
|
req.handledSocialMedia = data?.sns ? data.sns.join(",") : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.role == "KUR-ID") {
|
||||||
|
req.userEducationId = Number(data.education);
|
||||||
|
req.userSchoolsId = Number(data.school);
|
||||||
|
req.userCompetencyId = Number(data.competency);
|
||||||
|
}
|
||||||
|
|
||||||
|
loading();
|
||||||
|
const response = await saveUserInternal(req);
|
||||||
|
|
||||||
|
if (response?.error) {
|
||||||
|
error(response.message);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
close();
|
||||||
|
MySwal.fire({
|
||||||
|
title: "Sukses",
|
||||||
|
icon: "success",
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonColor: "#3085d6",
|
||||||
|
confirmButtonText: "Simpan",
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
router.push("/admin/management-user");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function onSubmit(data: z.infer<typeof FormSchema>) {
|
||||||
|
MySwal.fire({
|
||||||
|
title: "Simpan Data?",
|
||||||
|
text: "",
|
||||||
|
icon: "warning",
|
||||||
|
showCancelButton: true,
|
||||||
|
cancelButtonColor: "#d33",
|
||||||
|
confirmButtonColor: "#3085d6",
|
||||||
|
confirmButtonText: "Simpan",
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
save(data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<SiteBreadcrumb />
|
||||||
|
<Form {...form}>
|
||||||
|
<form
|
||||||
|
onSubmit={form.handleSubmit(onSubmit)}
|
||||||
|
className="space-y-6 bg-white p-10 w-full"
|
||||||
|
>
|
||||||
|
<p className="text-xl">Data Pengelola Media Hub</p>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="level"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem className="flex flex-col">
|
||||||
|
<FormLabel>Pilih Level</FormLabel>
|
||||||
|
<Popover>
|
||||||
|
<PopoverTrigger asChild>
|
||||||
|
<FormControl>
|
||||||
|
<Button
|
||||||
|
variant="outline"
|
||||||
|
role="combobox"
|
||||||
|
className={cn(
|
||||||
|
"w-[400px] justify-between",
|
||||||
|
!field.value && "text-muted-foreground"
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{field.value
|
||||||
|
? roleList.find((role) => role.value === field.value)
|
||||||
|
?.label
|
||||||
|
: "Pilih level"}
|
||||||
|
<ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
|
||||||
|
</Button>
|
||||||
|
</FormControl>
|
||||||
|
</PopoverTrigger>
|
||||||
|
<PopoverContent className="w-[400px] p-0">
|
||||||
|
<Command>
|
||||||
|
<CommandInput />
|
||||||
|
<CommandList>
|
||||||
|
<CommandEmpty>No role found.</CommandEmpty>
|
||||||
|
<CommandGroup>
|
||||||
|
{roleList.map((role) => (
|
||||||
|
<CommandItem
|
||||||
|
value={role.label}
|
||||||
|
key={role.value}
|
||||||
|
onSelect={() => {
|
||||||
|
form.setValue("level", role.value);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{role.label}
|
||||||
|
<Check
|
||||||
|
className={cn(
|
||||||
|
"ml-auto",
|
||||||
|
role.value === field.value
|
||||||
|
? "opacity-100"
|
||||||
|
: "opacity-0"
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</CommandItem>
|
||||||
|
))}
|
||||||
|
</CommandGroup>
|
||||||
|
</CommandList>
|
||||||
|
</Command>
|
||||||
|
</PopoverContent>
|
||||||
|
</Popover>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="fullname"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Nama Lengkap</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
placeholder="Masukkan nama lengkap"
|
||||||
|
{...field}
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="username"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Username</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
placeholder="Masukkan username"
|
||||||
|
{...field}
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="role"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem className="space-y-3">
|
||||||
|
<FormLabel>Role</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<RadioGroup
|
||||||
|
onValueChange={field.onChange}
|
||||||
|
defaultValue={field.value}
|
||||||
|
className="flex flex-wrap gap-3 w-1/2"
|
||||||
|
>
|
||||||
|
{roles.map((role) => (
|
||||||
|
<FormItem
|
||||||
|
key={role.id}
|
||||||
|
className="flex items-center space-x-3 space-y-0"
|
||||||
|
>
|
||||||
|
<FormControl>
|
||||||
|
<RadioGroupItem value={role.id} />
|
||||||
|
</FormControl>
|
||||||
|
<FormLabel className="font-normal">
|
||||||
|
{role.name}
|
||||||
|
</FormLabel>
|
||||||
|
</FormItem>
|
||||||
|
))}
|
||||||
|
</RadioGroup>
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
{selectedRole === "OPT-ID" && (
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="sns"
|
||||||
|
render={() => (
|
||||||
|
<FormItem>
|
||||||
|
<div className="mb-4">
|
||||||
|
<FormLabel>Social Media Yang Ditangani</FormLabel>
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-5 gap-2 w-1/2">
|
||||||
|
{sns.map((item) => (
|
||||||
|
<FormField
|
||||||
|
key={item.id}
|
||||||
|
control={form.control}
|
||||||
|
name="sns"
|
||||||
|
render={({ field }) => {
|
||||||
|
return (
|
||||||
|
<FormItem
|
||||||
|
key={item.typeId}
|
||||||
|
className="flex flex-row items-start space-x-3 space-y-0"
|
||||||
|
>
|
||||||
|
<FormControl>
|
||||||
|
<Checkbox
|
||||||
|
checked={field.value?.includes(
|
||||||
|
String(item.typeId)
|
||||||
|
)}
|
||||||
|
onCheckedChange={(checked) => {
|
||||||
|
return checked
|
||||||
|
? field.onChange([
|
||||||
|
...(field.value || []),
|
||||||
|
String(item.typeId),
|
||||||
|
])
|
||||||
|
: field.onChange(
|
||||||
|
(field.value || []).filter(
|
||||||
|
(value) =>
|
||||||
|
value !== String(item.typeId)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
<FormLabel className="font-normal">
|
||||||
|
{item.name}
|
||||||
|
</FormLabel>
|
||||||
|
</FormItem>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{selectedRole === "KUR-ID" && (
|
||||||
|
<>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="education"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Pendidikan Terakhir</FormLabel>
|
||||||
|
<Select onValueChange={field.onChange} value={field.value}>
|
||||||
|
<FormControl>
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue />
|
||||||
|
</SelectTrigger>
|
||||||
|
</FormControl>
|
||||||
|
<SelectContent>
|
||||||
|
{userEducations?.map((edu: any) => (
|
||||||
|
<SelectItem key={edu.id} value={String(edu.id)}>
|
||||||
|
{edu.name}
|
||||||
|
</SelectItem>
|
||||||
|
))}
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="school"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Universitas / Perguruan Tinggi</FormLabel>
|
||||||
|
<Select onValueChange={field.onChange} value={field.value}>
|
||||||
|
<FormControl>
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue />
|
||||||
|
</SelectTrigger>
|
||||||
|
</FormControl>
|
||||||
|
<SelectContent>
|
||||||
|
{userSchools?.map((edu: any) => (
|
||||||
|
<SelectItem key={edu.id} value={String(edu.id)}>
|
||||||
|
{edu.name}
|
||||||
|
</SelectItem>
|
||||||
|
))}
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="competency"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Kompetensi</FormLabel>
|
||||||
|
<Select onValueChange={field.onChange} value={field.value}>
|
||||||
|
<FormControl>
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue />
|
||||||
|
</SelectTrigger>
|
||||||
|
</FormControl>
|
||||||
|
<SelectContent>
|
||||||
|
{userCompetencies?.map((edu: any) => (
|
||||||
|
<SelectItem key={edu.id} value={String(edu.id)}>
|
||||||
|
{edu.name}
|
||||||
|
</SelectItem>
|
||||||
|
))}
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="nrp"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Nomor Regitrasi Polri {`(NRP)`}</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
type="number"
|
||||||
|
placeholder="Masukkan NRP"
|
||||||
|
{...field}
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="address"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Alamat</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Textarea
|
||||||
|
placeholder="Masukkan alamat"
|
||||||
|
className="resize-none w-1/2"
|
||||||
|
{...field}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="email"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Email</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
type="email"
|
||||||
|
placeholder="Masukkan email"
|
||||||
|
{...field}
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="phoneNumber"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>No. Handphone</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
type="number"
|
||||||
|
placeholder="Masukkan nomor handphone"
|
||||||
|
{...field}
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="password"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Password</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
type="password"
|
||||||
|
placeholder="Masukkan kata sandi"
|
||||||
|
{...field}
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="confirmPassword"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Konfirmasi Kata Sandi</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
type="password"
|
||||||
|
placeholder="Masukkan kata sandi"
|
||||||
|
{...field}
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<PasswordChecklist
|
||||||
|
rules={["minLength", "specialChar", "number", "capital", "match"]}
|
||||||
|
minLength={8}
|
||||||
|
value={passwordVal}
|
||||||
|
valueAgain={confPasswordVal}
|
||||||
|
onChange={(isValid) => {
|
||||||
|
form.setValue("isValidPassword", isValid);
|
||||||
|
}}
|
||||||
|
className="text-sm"
|
||||||
|
messages={{
|
||||||
|
minLength: "Password harus lebih dari 8 karakter",
|
||||||
|
specialChar: "Password harus memiliki spesial karakter",
|
||||||
|
number: "Password harus memiliki angka",
|
||||||
|
capital: "Password harus memiliki huruf kapital",
|
||||||
|
match: "Password sama",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<Link href="/admin/management-user">
|
||||||
|
<Button type="button" color="primary" variant="outline">
|
||||||
|
Back
|
||||||
|
</Button>
|
||||||
|
</Link>
|
||||||
|
<Button type="submit" color="primary" className="mx-3">
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</form>
|
||||||
|
</Form>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,743 @@
|
||||||
|
"use client";
|
||||||
|
|
||||||
|
import SiteBreadcrumb from "@/components/site-breadcrumb";
|
||||||
|
import { zodResolver } from "@hookform/resolvers/zod";
|
||||||
|
import { Check, ChevronsUpDown } from "lucide-react";
|
||||||
|
import { useForm } from "react-hook-form";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { cn, getCookiesDecrypt } from "@/lib/utils";
|
||||||
|
import { Button } from "@/components/ui/button";
|
||||||
|
import {
|
||||||
|
Command,
|
||||||
|
CommandEmpty,
|
||||||
|
CommandGroup,
|
||||||
|
CommandInput,
|
||||||
|
CommandItem,
|
||||||
|
CommandList,
|
||||||
|
} from "@/components/ui/command";
|
||||||
|
import {
|
||||||
|
Form,
|
||||||
|
FormControl,
|
||||||
|
FormField,
|
||||||
|
FormItem,
|
||||||
|
FormLabel,
|
||||||
|
FormMessage,
|
||||||
|
} from "@/components/ui/form";
|
||||||
|
import {
|
||||||
|
Popover,
|
||||||
|
PopoverContent,
|
||||||
|
PopoverTrigger,
|
||||||
|
} from "@/components/ui/popover";
|
||||||
|
import {
|
||||||
|
AdministrationLevelList,
|
||||||
|
getListCompetencies,
|
||||||
|
getListEducation,
|
||||||
|
getListSchools,
|
||||||
|
getUserById,
|
||||||
|
saveUserInternal,
|
||||||
|
} from "@/service/management-user/management-user";
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
|
import { Input } from "@/components/ui/input";
|
||||||
|
import { Textarea } from "@/components/ui/textarea";
|
||||||
|
import { Link, useRouter } from "@/i18n/routing";
|
||||||
|
import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group";
|
||||||
|
import dynamic from "next/dynamic";
|
||||||
|
import { Checkbox } from "@/components/ui/checkbox";
|
||||||
|
import {
|
||||||
|
Select,
|
||||||
|
SelectContent,
|
||||||
|
SelectItem,
|
||||||
|
SelectTrigger,
|
||||||
|
SelectValue,
|
||||||
|
} from "@/components/ui/select";
|
||||||
|
import Swal from "sweetalert2";
|
||||||
|
import withReactContent from "sweetalert2-react-content";
|
||||||
|
import { close, error, loading } from "@/config/swal";
|
||||||
|
import { useParams } from "next/navigation";
|
||||||
|
|
||||||
|
const sns = [
|
||||||
|
{
|
||||||
|
key: 1,
|
||||||
|
id: "comment",
|
||||||
|
typeId: 1,
|
||||||
|
name: "Komentar Konten",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 2,
|
||||||
|
id: "fb",
|
||||||
|
typeId: 2,
|
||||||
|
name: "Facebook",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 3,
|
||||||
|
id: "ig",
|
||||||
|
typeId: 3,
|
||||||
|
name: "Instagram",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 4,
|
||||||
|
id: "twt",
|
||||||
|
typeId: 4,
|
||||||
|
name: "Twitter",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 5,
|
||||||
|
id: "yt",
|
||||||
|
typeId: 5,
|
||||||
|
name: "Youtube",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 6,
|
||||||
|
id: "emergency",
|
||||||
|
typeId: 6,
|
||||||
|
name: "Emergency Issue",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 7,
|
||||||
|
id: "email",
|
||||||
|
typeId: 7,
|
||||||
|
name: "Email",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 8,
|
||||||
|
id: "inbox",
|
||||||
|
typeId: 8,
|
||||||
|
name: "Pesan Masuk",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 9,
|
||||||
|
id: "whatsapp",
|
||||||
|
typeId: 9,
|
||||||
|
name: "Whatssapp",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 10,
|
||||||
|
id: "tiktok",
|
||||||
|
typeId: 10,
|
||||||
|
name: "Tiktok",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
interface RoleData {
|
||||||
|
id: number;
|
||||||
|
label: string;
|
||||||
|
name: string;
|
||||||
|
value: string;
|
||||||
|
levelNumber: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FormSchema = z.object({
|
||||||
|
level: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
fullname: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
username: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
role: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
nrp: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
address: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
email: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
phoneNumber: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
password: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
confirmPassword: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
isValidPassword: z.boolean().refine((val) => val === true, {
|
||||||
|
message: "Check Password",
|
||||||
|
}),
|
||||||
|
sns: z.array(z.string()).optional(),
|
||||||
|
education: z.string().optional(),
|
||||||
|
school: z.string().optional(),
|
||||||
|
competency: z.string().optional(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export default function DetailUserForm() {
|
||||||
|
const router = useRouter();
|
||||||
|
const params = useParams();
|
||||||
|
const id = params?.id;
|
||||||
|
const MySwal = withReactContent(Swal);
|
||||||
|
const levelName = getCookiesDecrypt("ulnae");
|
||||||
|
const [roleList, setRoleList] = useState<RoleData[]>([]);
|
||||||
|
|
||||||
|
const [userEducations, setUserEducations] = useState<any>();
|
||||||
|
const [userSchools, setUserSchools] = useState<any>();
|
||||||
|
const [userCompetencies, setUserCompetencies] = useState<any>();
|
||||||
|
|
||||||
|
const form = useForm<z.infer<typeof FormSchema>>({
|
||||||
|
resolver: zodResolver(FormSchema),
|
||||||
|
defaultValues: {
|
||||||
|
password: "",
|
||||||
|
confirmPassword: "",
|
||||||
|
sns: [],
|
||||||
|
education: "1",
|
||||||
|
school: "4",
|
||||||
|
competency: "2",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const passwordVal = form.watch("password");
|
||||||
|
const confPasswordVal = form.watch("confirmPassword");
|
||||||
|
const selectedRole = form.watch("role");
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
getDataAdditional();
|
||||||
|
initData();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const initData = async () => {
|
||||||
|
loading();
|
||||||
|
const response = await getUserById(String(id));
|
||||||
|
const res = response?.data?.data;
|
||||||
|
close();
|
||||||
|
console.log("res", res);
|
||||||
|
if (Number(res.roleId) > 4) {
|
||||||
|
form.setValue("fullname", res?.fullname);
|
||||||
|
form.setValue("username", res?.username);
|
||||||
|
form.setValue("phoneNumber", res?.phoneNumber);
|
||||||
|
form.setValue("nrp", res?.memberIdentity);
|
||||||
|
form.setValue("address", res?.address);
|
||||||
|
form.setValue("email", res?.email);
|
||||||
|
form.setValue("role", res?.role?.code);
|
||||||
|
form.setValue("level", String(res?.userLevelId));
|
||||||
|
} else {
|
||||||
|
initFetch();
|
||||||
|
console.log("sadad", res?.role?.code);
|
||||||
|
form.setValue("fullname", res?.fullname);
|
||||||
|
form.setValue("username", res?.username);
|
||||||
|
form.setValue("phoneNumber", res?.phoneNumber);
|
||||||
|
form.setValue("nrp", res?.memberIdentity);
|
||||||
|
form.setValue("address", res?.address);
|
||||||
|
form.setValue("email", res?.email);
|
||||||
|
form.setValue("role", res?.role?.code);
|
||||||
|
form.setValue("level", String(res?.userLevelId));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const initFetch = async () => {
|
||||||
|
const response = await AdministrationLevelList();
|
||||||
|
const res = response?.data?.data;
|
||||||
|
var levelsArr: RoleData[] = [];
|
||||||
|
res.forEach((levels: RoleData) => {
|
||||||
|
levelsArr.push({
|
||||||
|
id: levels.id,
|
||||||
|
label: levels.name,
|
||||||
|
name: levels.name,
|
||||||
|
value: String(levels.id),
|
||||||
|
levelNumber: levels.levelNumber,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
setRoleList(levelsArr);
|
||||||
|
};
|
||||||
|
|
||||||
|
async function getDataAdditional() {
|
||||||
|
const resEducations = await getListEducation();
|
||||||
|
setUserEducations(resEducations?.data?.data);
|
||||||
|
const resSchools = await getListSchools();
|
||||||
|
setUserSchools(resSchools?.data?.data);
|
||||||
|
const resCompetencies = await getListCompetencies();
|
||||||
|
setUserCompetencies(resCompetencies?.data?.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
const roles =
|
||||||
|
levelName == "MABES POLRI"
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
id: "ADM-ID",
|
||||||
|
name: "Admin",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "APP-ID",
|
||||||
|
name: "Approver",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "CON-ID",
|
||||||
|
name: "Kontributor",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "SPV-ID",
|
||||||
|
name: "Supervisor Feedback Center",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "OPT-ID",
|
||||||
|
name: "Operator Feedback Center",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "KKUR-ID",
|
||||||
|
name: "Koor Kurator",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "KUR-ID",
|
||||||
|
name: "Kurator",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
{
|
||||||
|
id: "APP-ID",
|
||||||
|
name: "Approver",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "CON-ID",
|
||||||
|
name: "Kontributor",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
async function save(data: z.infer<typeof FormSchema>) {
|
||||||
|
let req: any = {
|
||||||
|
id: id,
|
||||||
|
firstName: data.fullname,
|
||||||
|
username: data.username,
|
||||||
|
roleId: data.role,
|
||||||
|
userLevelId: Number(data.level),
|
||||||
|
memberIdentity: data.nrp,
|
||||||
|
address: data.address,
|
||||||
|
email: data.email,
|
||||||
|
password: data.password,
|
||||||
|
passwordConf: data.confirmPassword,
|
||||||
|
isDefault: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (data.role == "OPT-ID") {
|
||||||
|
req.handledSocialMedia = data?.sns ? data.sns.join(",") : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.role == "KUR-ID") {
|
||||||
|
req.userEducationId = Number(data.education);
|
||||||
|
req.userSchoolsId = Number(data.school);
|
||||||
|
req.userCompetencyId = Number(data.competency);
|
||||||
|
}
|
||||||
|
|
||||||
|
loading();
|
||||||
|
const response = await saveUserInternal(req);
|
||||||
|
|
||||||
|
if (response?.error) {
|
||||||
|
error(response.message);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
close();
|
||||||
|
MySwal.fire({
|
||||||
|
title: "Sukses",
|
||||||
|
icon: "success",
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonColor: "#3085d6",
|
||||||
|
confirmButtonText: "Simpan",
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
router.push("/admin/management-user");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function onSubmit(data: z.infer<typeof FormSchema>) {
|
||||||
|
MySwal.fire({
|
||||||
|
title: "Simpan Data?",
|
||||||
|
text: "",
|
||||||
|
icon: "warning",
|
||||||
|
showCancelButton: true,
|
||||||
|
cancelButtonColor: "#d33",
|
||||||
|
confirmButtonColor: "#3085d6",
|
||||||
|
confirmButtonText: "Simpan",
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
save(data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<SiteBreadcrumb />
|
||||||
|
<Form {...form}>
|
||||||
|
<form
|
||||||
|
onSubmit={form.handleSubmit(onSubmit)}
|
||||||
|
className="space-y-6 bg-white p-10 w-full"
|
||||||
|
>
|
||||||
|
<p className="text-xl">Data Pengelola Media Hub</p>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="level"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem className="flex flex-col">
|
||||||
|
<FormLabel>Pilih Level</FormLabel>
|
||||||
|
<Popover>
|
||||||
|
<PopoverTrigger asChild disabled>
|
||||||
|
<FormControl>
|
||||||
|
<Button
|
||||||
|
variant="outline"
|
||||||
|
role="combobox"
|
||||||
|
className={cn(
|
||||||
|
"w-[400px] justify-between",
|
||||||
|
!field.value && "text-muted-foreground"
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{field.value
|
||||||
|
? roleList.find((role) => role.value === field.value)
|
||||||
|
?.label
|
||||||
|
: "Pilih level"}
|
||||||
|
<ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
|
||||||
|
</Button>
|
||||||
|
</FormControl>
|
||||||
|
</PopoverTrigger>
|
||||||
|
<PopoverContent className="w-[400px] p-0">
|
||||||
|
<Command>
|
||||||
|
<CommandInput />
|
||||||
|
<CommandList>
|
||||||
|
<CommandEmpty>No role found.</CommandEmpty>
|
||||||
|
<CommandGroup>
|
||||||
|
{roleList.map((role) => (
|
||||||
|
<CommandItem
|
||||||
|
value={role.label}
|
||||||
|
key={role.value}
|
||||||
|
onSelect={() => {
|
||||||
|
form.setValue("level", role.value);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{role.label}
|
||||||
|
<Check
|
||||||
|
className={cn(
|
||||||
|
"ml-auto",
|
||||||
|
role.value === field.value
|
||||||
|
? "opacity-100"
|
||||||
|
: "opacity-0"
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</CommandItem>
|
||||||
|
))}
|
||||||
|
</CommandGroup>
|
||||||
|
</CommandList>
|
||||||
|
</Command>
|
||||||
|
</PopoverContent>
|
||||||
|
</Popover>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="fullname"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Nama Lengkap</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
placeholder="Masukkan nama lengkap"
|
||||||
|
{...field}
|
||||||
|
readOnly
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="username"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Username</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
placeholder="Masukkan username"
|
||||||
|
{...field}
|
||||||
|
readOnly
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="role"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem className="space-y-3">
|
||||||
|
<FormLabel>Role</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<RadioGroup
|
||||||
|
onValueChange={field.onChange}
|
||||||
|
value={field.value}
|
||||||
|
className="flex flex-wrap gap-3 w-1/2"
|
||||||
|
disabled
|
||||||
|
>
|
||||||
|
{roles.map((role) => (
|
||||||
|
<FormItem
|
||||||
|
key={role.id}
|
||||||
|
className="flex items-center space-x-3 space-y-0"
|
||||||
|
>
|
||||||
|
<FormControl>
|
||||||
|
<RadioGroupItem value={role.id} />
|
||||||
|
</FormControl>
|
||||||
|
<FormLabel className="font-normal">
|
||||||
|
{role.name}
|
||||||
|
</FormLabel>
|
||||||
|
</FormItem>
|
||||||
|
))}
|
||||||
|
</RadioGroup>
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
{selectedRole === "OPT-ID" && (
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="sns"
|
||||||
|
render={() => (
|
||||||
|
<FormItem>
|
||||||
|
<div className="mb-4">
|
||||||
|
<FormLabel>Social Media Yang Ditangani</FormLabel>
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-5 gap-2 w-1/2">
|
||||||
|
{sns.map((item) => (
|
||||||
|
<FormField
|
||||||
|
key={item.id}
|
||||||
|
control={form.control}
|
||||||
|
name="sns"
|
||||||
|
render={({ field }) => {
|
||||||
|
return (
|
||||||
|
<FormItem
|
||||||
|
key={item.typeId}
|
||||||
|
className="flex flex-row items-start space-x-3 space-y-0"
|
||||||
|
>
|
||||||
|
<FormControl>
|
||||||
|
<Checkbox
|
||||||
|
disabled
|
||||||
|
checked={field.value?.includes(
|
||||||
|
String(item.typeId)
|
||||||
|
)}
|
||||||
|
onCheckedChange={(checked) => {
|
||||||
|
return checked
|
||||||
|
? field.onChange([
|
||||||
|
...(field.value || []),
|
||||||
|
String(item.typeId),
|
||||||
|
])
|
||||||
|
: field.onChange(
|
||||||
|
(field.value || []).filter(
|
||||||
|
(value) =>
|
||||||
|
value !== String(item.typeId)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
<FormLabel className="font-normal">
|
||||||
|
{item.name}
|
||||||
|
</FormLabel>
|
||||||
|
</FormItem>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{selectedRole === "KUR-ID" && (
|
||||||
|
<>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="education"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Pendidikan Terakhir</FormLabel>
|
||||||
|
<Select
|
||||||
|
onValueChange={field.onChange}
|
||||||
|
value={field.value}
|
||||||
|
disabled
|
||||||
|
>
|
||||||
|
<FormControl>
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue />
|
||||||
|
</SelectTrigger>
|
||||||
|
</FormControl>
|
||||||
|
<SelectContent>
|
||||||
|
{userEducations?.map((edu: any) => (
|
||||||
|
<SelectItem key={edu.id} value={String(edu.id)}>
|
||||||
|
{edu.name}
|
||||||
|
</SelectItem>
|
||||||
|
))}
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="school"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Universitas / Perguruan Tinggi</FormLabel>
|
||||||
|
<Select
|
||||||
|
onValueChange={field.onChange}
|
||||||
|
value={field.value}
|
||||||
|
disabled
|
||||||
|
>
|
||||||
|
<FormControl>
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue />
|
||||||
|
</SelectTrigger>
|
||||||
|
</FormControl>
|
||||||
|
<SelectContent>
|
||||||
|
{userSchools?.map((edu: any) => (
|
||||||
|
<SelectItem key={edu.id} value={String(edu.id)}>
|
||||||
|
{edu.name}
|
||||||
|
</SelectItem>
|
||||||
|
))}
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="competency"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Kompetensi</FormLabel>
|
||||||
|
<Select
|
||||||
|
onValueChange={field.onChange}
|
||||||
|
value={field.value}
|
||||||
|
disabled
|
||||||
|
>
|
||||||
|
<FormControl>
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue />
|
||||||
|
</SelectTrigger>
|
||||||
|
</FormControl>
|
||||||
|
<SelectContent>
|
||||||
|
{userCompetencies?.map((edu: any) => (
|
||||||
|
<SelectItem key={edu.id} value={String(edu.id)}>
|
||||||
|
{edu.name}
|
||||||
|
</SelectItem>
|
||||||
|
))}
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="nrp"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Nomor Regitrasi Polri {`(NRP)`}</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
type="number"
|
||||||
|
placeholder="Masukkan NRP"
|
||||||
|
readOnly
|
||||||
|
{...field}
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="address"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Alamat</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Textarea
|
||||||
|
placeholder="Masukkan alamat"
|
||||||
|
readOnly
|
||||||
|
className="resize-none w-1/2"
|
||||||
|
{...field}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="email"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Email</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
type="email"
|
||||||
|
readOnly
|
||||||
|
placeholder="Masukkan email"
|
||||||
|
{...field}
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="phoneNumber"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>No. Handphone</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
type="number"
|
||||||
|
placeholder="Masukkan nomor handphone"
|
||||||
|
{...field}
|
||||||
|
readOnly
|
||||||
|
className="w-1/2 mb-2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<Link href="/admin/management-user">
|
||||||
|
<Button type="button" color="primary" variant="outline">
|
||||||
|
Back
|
||||||
|
</Button>
|
||||||
|
</Link>
|
||||||
|
</form>
|
||||||
|
</Form>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,785 @@
|
||||||
|
"use client";
|
||||||
|
|
||||||
|
import SiteBreadcrumb from "@/components/site-breadcrumb";
|
||||||
|
import { zodResolver } from "@hookform/resolvers/zod";
|
||||||
|
import { Check, ChevronsUpDown } from "lucide-react";
|
||||||
|
import { useForm } from "react-hook-form";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
import { cn, getCookiesDecrypt } from "@/lib/utils";
|
||||||
|
import { Button } from "@/components/ui/button";
|
||||||
|
import {
|
||||||
|
Command,
|
||||||
|
CommandEmpty,
|
||||||
|
CommandGroup,
|
||||||
|
CommandInput,
|
||||||
|
CommandItem,
|
||||||
|
CommandList,
|
||||||
|
} from "@/components/ui/command";
|
||||||
|
import {
|
||||||
|
Form,
|
||||||
|
FormControl,
|
||||||
|
FormField,
|
||||||
|
FormItem,
|
||||||
|
FormLabel,
|
||||||
|
FormMessage,
|
||||||
|
} from "@/components/ui/form";
|
||||||
|
import {
|
||||||
|
Popover,
|
||||||
|
PopoverContent,
|
||||||
|
PopoverTrigger,
|
||||||
|
} from "@/components/ui/popover";
|
||||||
|
import {
|
||||||
|
AdministrationLevelList,
|
||||||
|
getListCompetencies,
|
||||||
|
getListEducation,
|
||||||
|
getListSchools,
|
||||||
|
getUserById,
|
||||||
|
saveUserInternal,
|
||||||
|
} from "@/service/management-user/management-user";
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
|
import { Input } from "@/components/ui/input";
|
||||||
|
import { Textarea } from "@/components/ui/textarea";
|
||||||
|
import { Link, useRouter } from "@/i18n/routing";
|
||||||
|
import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group";
|
||||||
|
import dynamic from "next/dynamic";
|
||||||
|
import { Checkbox } from "@/components/ui/checkbox";
|
||||||
|
import {
|
||||||
|
Select,
|
||||||
|
SelectContent,
|
||||||
|
SelectItem,
|
||||||
|
SelectTrigger,
|
||||||
|
SelectValue,
|
||||||
|
} from "@/components/ui/select";
|
||||||
|
import Swal from "sweetalert2";
|
||||||
|
import withReactContent from "sweetalert2-react-content";
|
||||||
|
import { close, error, loading } from "@/config/swal";
|
||||||
|
import { useParams } from "next/navigation";
|
||||||
|
|
||||||
|
const PasswordChecklist = dynamic(() => import("react-password-checklist"), {
|
||||||
|
ssr: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
const sns = [
|
||||||
|
{
|
||||||
|
key: 1,
|
||||||
|
id: "comment",
|
||||||
|
typeId: 1,
|
||||||
|
name: "Komentar Konten",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 2,
|
||||||
|
id: "fb",
|
||||||
|
typeId: 2,
|
||||||
|
name: "Facebook",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 3,
|
||||||
|
id: "ig",
|
||||||
|
typeId: 3,
|
||||||
|
name: "Instagram",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 4,
|
||||||
|
id: "twt",
|
||||||
|
typeId: 4,
|
||||||
|
name: "Twitter",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 5,
|
||||||
|
id: "yt",
|
||||||
|
typeId: 5,
|
||||||
|
name: "Youtube",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 6,
|
||||||
|
id: "emergency",
|
||||||
|
typeId: 6,
|
||||||
|
name: "Emergency Issue",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 7,
|
||||||
|
id: "email",
|
||||||
|
typeId: 7,
|
||||||
|
name: "Email",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 8,
|
||||||
|
id: "inbox",
|
||||||
|
typeId: 8,
|
||||||
|
name: "Pesan Masuk",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 9,
|
||||||
|
id: "whatsapp",
|
||||||
|
typeId: 9,
|
||||||
|
name: "Whatssapp",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 10,
|
||||||
|
id: "tiktok",
|
||||||
|
typeId: 10,
|
||||||
|
name: "Tiktok",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
interface RoleData {
|
||||||
|
id: number;
|
||||||
|
label: string;
|
||||||
|
name: string;
|
||||||
|
value: string;
|
||||||
|
levelNumber: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FormSchema = z.object({
|
||||||
|
level: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
fullname: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
username: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
role: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
nrp: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
address: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
email: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
phoneNumber: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
password: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
confirmPassword: z.string({
|
||||||
|
required_error: "Required",
|
||||||
|
}),
|
||||||
|
isValidPassword: z.boolean().refine((val) => val === true, {
|
||||||
|
message: "Check Password",
|
||||||
|
}),
|
||||||
|
sns: z.array(z.string()).optional(),
|
||||||
|
education: z.string().optional(),
|
||||||
|
school: z.string().optional(),
|
||||||
|
competency: z.string().optional(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export default function EditUserForm() {
|
||||||
|
const router = useRouter();
|
||||||
|
const params = useParams();
|
||||||
|
const id = params?.id;
|
||||||
|
const MySwal = withReactContent(Swal);
|
||||||
|
const levelName = getCookiesDecrypt("ulnae");
|
||||||
|
const [roleList, setRoleList] = useState<RoleData[]>([]);
|
||||||
|
|
||||||
|
const [userEducations, setUserEducations] = useState<any>();
|
||||||
|
const [userSchools, setUserSchools] = useState<any>();
|
||||||
|
const [userCompetencies, setUserCompetencies] = useState<any>();
|
||||||
|
|
||||||
|
const form = useForm<z.infer<typeof FormSchema>>({
|
||||||
|
resolver: zodResolver(FormSchema),
|
||||||
|
defaultValues: {
|
||||||
|
password: "",
|
||||||
|
confirmPassword: "",
|
||||||
|
sns: [],
|
||||||
|
education: "1",
|
||||||
|
school: "4",
|
||||||
|
competency: "2",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const passwordVal = form.watch("password");
|
||||||
|
const confPasswordVal = form.watch("confirmPassword");
|
||||||
|
const selectedRole = form.watch("role");
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
getDataAdditional();
|
||||||
|
initData();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const initData = async () => {
|
||||||
|
loading();
|
||||||
|
const response = await getUserById(String(id));
|
||||||
|
const res = response?.data?.data;
|
||||||
|
close();
|
||||||
|
console.log("res", res);
|
||||||
|
if (Number(res.roleId) > 4) {
|
||||||
|
form.setValue("fullname", res?.fullname);
|
||||||
|
form.setValue("username", res?.username);
|
||||||
|
form.setValue("phoneNumber", res?.phoneNumber);
|
||||||
|
form.setValue("nrp", res?.memberIdentity);
|
||||||
|
form.setValue("address", res?.address);
|
||||||
|
form.setValue("email", res?.email);
|
||||||
|
form.setValue("role", res?.role?.code);
|
||||||
|
form.setValue("level", String(res?.userLevelId));
|
||||||
|
} else {
|
||||||
|
initFetch();
|
||||||
|
console.log("sadad", res?.role?.code);
|
||||||
|
form.setValue("fullname", res?.fullname);
|
||||||
|
form.setValue("username", res?.username);
|
||||||
|
form.setValue("phoneNumber", res?.phoneNumber);
|
||||||
|
form.setValue("nrp", res?.memberIdentity);
|
||||||
|
form.setValue("address", res?.address);
|
||||||
|
form.setValue("email", res?.email);
|
||||||
|
form.setValue("role", res?.role?.code);
|
||||||
|
form.setValue("level", String(res?.userLevelId));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const initFetch = async () => {
|
||||||
|
const response = await AdministrationLevelList();
|
||||||
|
const res = response?.data?.data;
|
||||||
|
var levelsArr: RoleData[] = [];
|
||||||
|
res.forEach((levels: RoleData) => {
|
||||||
|
levelsArr.push({
|
||||||
|
id: levels.id,
|
||||||
|
label: levels.name,
|
||||||
|
name: levels.name,
|
||||||
|
value: String(levels.id),
|
||||||
|
levelNumber: levels.levelNumber,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
setRoleList(levelsArr);
|
||||||
|
};
|
||||||
|
|
||||||
|
async function getDataAdditional() {
|
||||||
|
const resEducations = await getListEducation();
|
||||||
|
setUserEducations(resEducations?.data?.data);
|
||||||
|
const resSchools = await getListSchools();
|
||||||
|
setUserSchools(resSchools?.data?.data);
|
||||||
|
const resCompetencies = await getListCompetencies();
|
||||||
|
setUserCompetencies(resCompetencies?.data?.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
const roles =
|
||||||
|
levelName == "MABES POLRI"
|
||||||
|
? [
|
||||||
|
{
|
||||||
|
id: "ADM-ID",
|
||||||
|
name: "Admin",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "APP-ID",
|
||||||
|
name: "Approver",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "CON-ID",
|
||||||
|
name: "Kontributor",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "SPV-ID",
|
||||||
|
name: "Supervisor Feedback Center",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "OPT-ID",
|
||||||
|
name: "Operator Feedback Center",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "KKUR-ID",
|
||||||
|
name: "Koor Kurator",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "KUR-ID",
|
||||||
|
name: "Kurator",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
: [
|
||||||
|
{
|
||||||
|
id: "APP-ID",
|
||||||
|
name: "Approver",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "CON-ID",
|
||||||
|
name: "Kontributor",
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
async function save(data: z.infer<typeof FormSchema>) {
|
||||||
|
let req: any = {
|
||||||
|
id: id,
|
||||||
|
firstName: data.fullname,
|
||||||
|
username: data.username,
|
||||||
|
roleId: data.role,
|
||||||
|
userLevelId: Number(data.level),
|
||||||
|
memberIdentity: data.nrp,
|
||||||
|
address: data.address,
|
||||||
|
email: data.email,
|
||||||
|
password: data.password,
|
||||||
|
passwordConf: data.confirmPassword,
|
||||||
|
isDefault: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (data.role == "OPT-ID") {
|
||||||
|
req.handledSocialMedia = data?.sns ? data.sns.join(",") : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.role == "KUR-ID") {
|
||||||
|
req.userEducationId = Number(data.education);
|
||||||
|
req.userSchoolsId = Number(data.school);
|
||||||
|
req.userCompetencyId = Number(data.competency);
|
||||||
|
}
|
||||||
|
|
||||||
|
loading();
|
||||||
|
const response = await saveUserInternal(req);
|
||||||
|
|
||||||
|
if (response?.error) {
|
||||||
|
error(response.message);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
close();
|
||||||
|
MySwal.fire({
|
||||||
|
title: "Sukses",
|
||||||
|
icon: "success",
|
||||||
|
showCancelButton: true,
|
||||||
|
confirmButtonColor: "#3085d6",
|
||||||
|
confirmButtonText: "Simpan",
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
router.push("/admin/management-user");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function onSubmit(data: z.infer<typeof FormSchema>) {
|
||||||
|
MySwal.fire({
|
||||||
|
title: "Simpan Data?",
|
||||||
|
text: "",
|
||||||
|
icon: "warning",
|
||||||
|
showCancelButton: true,
|
||||||
|
cancelButtonColor: "#d33",
|
||||||
|
confirmButtonColor: "#3085d6",
|
||||||
|
confirmButtonText: "Simpan",
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
save(data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<SiteBreadcrumb />
|
||||||
|
<Form {...form}>
|
||||||
|
<form
|
||||||
|
onSubmit={form.handleSubmit(onSubmit)}
|
||||||
|
className="space-y-6 bg-white p-10 w-full"
|
||||||
|
>
|
||||||
|
<p className="text-xl">Data Pengelola Media Hub</p>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="level"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem className="flex flex-col">
|
||||||
|
<FormLabel>Pilih Level</FormLabel>
|
||||||
|
<Popover>
|
||||||
|
<PopoverTrigger asChild>
|
||||||
|
<FormControl>
|
||||||
|
<Button
|
||||||
|
variant="outline"
|
||||||
|
role="combobox"
|
||||||
|
className={cn(
|
||||||
|
"w-[400px] justify-between",
|
||||||
|
!field.value && "text-muted-foreground"
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
{field.value
|
||||||
|
? roleList.find((role) => role.value === field.value)
|
||||||
|
?.label
|
||||||
|
: "Pilih level"}
|
||||||
|
<ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
|
||||||
|
</Button>
|
||||||
|
</FormControl>
|
||||||
|
</PopoverTrigger>
|
||||||
|
<PopoverContent className="w-[400px] p-0">
|
||||||
|
<Command>
|
||||||
|
<CommandInput />
|
||||||
|
<CommandList>
|
||||||
|
<CommandEmpty>No role found.</CommandEmpty>
|
||||||
|
<CommandGroup>
|
||||||
|
{roleList.map((role) => (
|
||||||
|
<CommandItem
|
||||||
|
value={role.label}
|
||||||
|
key={role.value}
|
||||||
|
onSelect={() => {
|
||||||
|
form.setValue("level", role.value);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{role.label}
|
||||||
|
<Check
|
||||||
|
className={cn(
|
||||||
|
"ml-auto",
|
||||||
|
role.value === field.value
|
||||||
|
? "opacity-100"
|
||||||
|
: "opacity-0"
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</CommandItem>
|
||||||
|
))}
|
||||||
|
</CommandGroup>
|
||||||
|
</CommandList>
|
||||||
|
</Command>
|
||||||
|
</PopoverContent>
|
||||||
|
</Popover>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="fullname"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Nama Lengkap</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
placeholder="Masukkan nama lengkap"
|
||||||
|
{...field}
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="username"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Username</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
placeholder="Masukkan username"
|
||||||
|
{...field}
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="role"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem className="space-y-3">
|
||||||
|
<FormLabel>Role</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<RadioGroup
|
||||||
|
onValueChange={field.onChange}
|
||||||
|
value={field.value}
|
||||||
|
className="flex flex-wrap gap-3 w-1/2"
|
||||||
|
>
|
||||||
|
{roles.map((role) => (
|
||||||
|
<FormItem
|
||||||
|
key={role.id}
|
||||||
|
className="flex items-center space-x-3 space-y-0"
|
||||||
|
>
|
||||||
|
<FormControl>
|
||||||
|
<RadioGroupItem value={role.id} />
|
||||||
|
</FormControl>
|
||||||
|
<FormLabel className="font-normal">
|
||||||
|
{role.name}
|
||||||
|
</FormLabel>
|
||||||
|
</FormItem>
|
||||||
|
))}
|
||||||
|
</RadioGroup>
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
{selectedRole === "OPT-ID" && (
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="sns"
|
||||||
|
render={() => (
|
||||||
|
<FormItem>
|
||||||
|
<div className="mb-4">
|
||||||
|
<FormLabel>Social Media Yang Ditangani</FormLabel>
|
||||||
|
</div>
|
||||||
|
<div className="grid grid-cols-5 gap-2 w-1/2">
|
||||||
|
{sns.map((item) => (
|
||||||
|
<FormField
|
||||||
|
key={item.id}
|
||||||
|
control={form.control}
|
||||||
|
name="sns"
|
||||||
|
render={({ field }) => {
|
||||||
|
return (
|
||||||
|
<FormItem
|
||||||
|
key={item.typeId}
|
||||||
|
className="flex flex-row items-start space-x-3 space-y-0"
|
||||||
|
>
|
||||||
|
<FormControl>
|
||||||
|
<Checkbox
|
||||||
|
checked={field.value?.includes(
|
||||||
|
String(item.typeId)
|
||||||
|
)}
|
||||||
|
onCheckedChange={(checked) => {
|
||||||
|
return checked
|
||||||
|
? field.onChange([
|
||||||
|
...(field.value || []),
|
||||||
|
String(item.typeId),
|
||||||
|
])
|
||||||
|
: field.onChange(
|
||||||
|
(field.value || []).filter(
|
||||||
|
(value) =>
|
||||||
|
value !== String(item.typeId)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
<FormLabel className="font-normal">
|
||||||
|
{item.name}
|
||||||
|
</FormLabel>
|
||||||
|
</FormItem>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{selectedRole === "KUR-ID" && (
|
||||||
|
<>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="education"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Pendidikan Terakhir</FormLabel>
|
||||||
|
<Select onValueChange={field.onChange} value={field.value}>
|
||||||
|
<FormControl>
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue />
|
||||||
|
</SelectTrigger>
|
||||||
|
</FormControl>
|
||||||
|
<SelectContent>
|
||||||
|
{userEducations?.map((edu: any) => (
|
||||||
|
<SelectItem key={edu.id} value={String(edu.id)}>
|
||||||
|
{edu.name}
|
||||||
|
</SelectItem>
|
||||||
|
))}
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="school"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Universitas / Perguruan Tinggi</FormLabel>
|
||||||
|
<Select onValueChange={field.onChange} value={field.value}>
|
||||||
|
<FormControl>
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue />
|
||||||
|
</SelectTrigger>
|
||||||
|
</FormControl>
|
||||||
|
<SelectContent>
|
||||||
|
{userSchools?.map((edu: any) => (
|
||||||
|
<SelectItem key={edu.id} value={String(edu.id)}>
|
||||||
|
{edu.name}
|
||||||
|
</SelectItem>
|
||||||
|
))}
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="competency"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Kompetensi</FormLabel>
|
||||||
|
<Select onValueChange={field.onChange} value={field.value}>
|
||||||
|
<FormControl>
|
||||||
|
<SelectTrigger>
|
||||||
|
<SelectValue />
|
||||||
|
</SelectTrigger>
|
||||||
|
</FormControl>
|
||||||
|
<SelectContent>
|
||||||
|
{userCompetencies?.map((edu: any) => (
|
||||||
|
<SelectItem key={edu.id} value={String(edu.id)}>
|
||||||
|
{edu.name}
|
||||||
|
</SelectItem>
|
||||||
|
))}
|
||||||
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="nrp"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Nomor Regitrasi Polri {`(NRP)`}</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
type="number"
|
||||||
|
placeholder="Masukkan NRP"
|
||||||
|
{...field}
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="address"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Alamat</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Textarea
|
||||||
|
placeholder="Masukkan alamat"
|
||||||
|
className="resize-none w-1/2"
|
||||||
|
{...field}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="email"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Email</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
type="email"
|
||||||
|
placeholder="Masukkan email"
|
||||||
|
{...field}
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="phoneNumber"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>No. Handphone</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
type="number"
|
||||||
|
placeholder="Masukkan nomor handphone"
|
||||||
|
{...field}
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="password"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Password</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
type="password"
|
||||||
|
placeholder="Masukkan kata sandi"
|
||||||
|
{...field}
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<FormField
|
||||||
|
control={form.control}
|
||||||
|
name="confirmPassword"
|
||||||
|
render={({ field }) => (
|
||||||
|
<FormItem>
|
||||||
|
<FormLabel>Konfirmasi Kata Sandi</FormLabel>
|
||||||
|
<FormControl>
|
||||||
|
<Input
|
||||||
|
type="password"
|
||||||
|
placeholder="Masukkan kata sandi"
|
||||||
|
{...field}
|
||||||
|
className="w-1/2"
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<PasswordChecklist
|
||||||
|
rules={["minLength", "specialChar", "number", "capital", "match"]}
|
||||||
|
minLength={8}
|
||||||
|
value={passwordVal}
|
||||||
|
valueAgain={confPasswordVal}
|
||||||
|
onChange={(isValid) => {
|
||||||
|
form.setValue("isValidPassword", isValid);
|
||||||
|
}}
|
||||||
|
className="text-sm"
|
||||||
|
messages={{
|
||||||
|
minLength: "Password harus lebih dari 8 karakter",
|
||||||
|
specialChar: "Password harus memiliki spesial karakter",
|
||||||
|
number: "Password harus memiliki angka",
|
||||||
|
capital: "Password harus memiliki huruf kapital",
|
||||||
|
match: "Password sama",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
<Link href="/admin/management-user">
|
||||||
|
<Button type="button" color="primary" variant="outline">
|
||||||
|
Back
|
||||||
|
</Button>
|
||||||
|
</Link>
|
||||||
|
<Button type="submit" color="primary" className="mx-3">
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</form>
|
||||||
|
</Form>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -1,10 +1,55 @@
|
||||||
|
"use client";
|
||||||
import SiteBreadcrumb from "@/components/site-breadcrumb";
|
import SiteBreadcrumb from "@/components/site-breadcrumb";
|
||||||
|
import UserExternalTable from "@/components/table/management-user/management-user-external-table";
|
||||||
|
import UserInternalTable from "@/components/table/management-user/management-user-internal-table";
|
||||||
|
import InternalTable from "@/components/table/management-user/management-user-internal-table";
|
||||||
|
import { Button } from "@/components/ui/button";
|
||||||
|
import DashboardVisualization from "@/components/visualization/dashboard-viz";
|
||||||
|
import ManagementUserVisualization from "@/components/visualization/management-user-viz";
|
||||||
|
import { useRouter } from "@/i18n/routing";
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
|
|
||||||
export default function ManagementUser() {
|
export default function ManagementUser() {
|
||||||
|
const [isInternal, setIsInternal] = useState(true);
|
||||||
|
const router = useRouter();
|
||||||
|
useEffect(() => {
|
||||||
|
router.push("?page=1");
|
||||||
|
}, [isInternal]);
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<SiteBreadcrumb />
|
<SiteBreadcrumb />
|
||||||
<p className="font-semibold">STATISTIK JUMLAH PENGGUNA</p>
|
{isInternal && (
|
||||||
|
<section id="viz">
|
||||||
|
<ManagementUserVisualization />
|
||||||
|
</section>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<section
|
||||||
|
id="table"
|
||||||
|
className="flex flex-col gap-2 bg-white rounded-lg p-3 mt-5"
|
||||||
|
>
|
||||||
|
<div className="flex flex-row gap-1 border-2 w-fit mb-5">
|
||||||
|
<Button
|
||||||
|
onClick={() => setIsInternal(true)}
|
||||||
|
className={` hover:text-white rounded-none
|
||||||
|
${
|
||||||
|
!isInternal ? "bg-white text-black " : "bg-black text-white "
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
User Internal
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
onClick={() => setIsInternal(false)}
|
||||||
|
className={`hover:text-white rounded-none ${
|
||||||
|
!isInternal ? "bg-black text-white " : "bg-white text-black "
|
||||||
|
}
|
||||||
|
`}
|
||||||
|
>
|
||||||
|
User Eksternal
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
{isInternal ? <UserInternalTable /> : <UserExternalTable />}
|
||||||
|
</section>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -103,8 +103,15 @@ const columns: ColumnDef<any>[] = [
|
||||||
</Button>
|
</Button>
|
||||||
</MenubarTrigger>
|
</MenubarTrigger>
|
||||||
<MenubarContent className="flex flex-col gap-2 justify-center items-start p-4">
|
<MenubarContent className="flex flex-col gap-2 justify-center items-start p-4">
|
||||||
<EditCategoryModal id={row.original.id} isDetail={true} />
|
<EditCategoryModal
|
||||||
<EditCategoryModal id={row.original.id} />
|
id={row.original.id}
|
||||||
|
isDetail={true}
|
||||||
|
thumbnailLink={row.original.thumbnailLink}
|
||||||
|
/>
|
||||||
|
<EditCategoryModal
|
||||||
|
id={row.original.id}
|
||||||
|
thumbnailLink={row.original.thumbnailLink}
|
||||||
|
/>
|
||||||
<a
|
<a
|
||||||
onClick={() => categoryDelete(row.original.id)}
|
onClick={() => categoryDelete(row.original.id)}
|
||||||
className="hover:underline cursor-pointer hover:text-destructive"
|
className="hover:underline cursor-pointer hover:text-destructive"
|
||||||
|
|
|
||||||
|
|
@ -105,15 +105,15 @@ const publishToList = [
|
||||||
|
|
||||||
export default function EditCategoryModal(props: {
|
export default function EditCategoryModal(props: {
|
||||||
id: string;
|
id: string;
|
||||||
|
thumbnailLink: string;
|
||||||
isDetail?: boolean;
|
isDetail?: boolean;
|
||||||
}) {
|
}) {
|
||||||
const { id, isDetail } = props;
|
const { id, isDetail, thumbnailLink } = props;
|
||||||
const [files, setFiles] = useState<File[]>([]);
|
const [files, setFiles] = useState<File[]>([]);
|
||||||
const [isOpen, setIsOpen] = useState(false);
|
const [isOpen, setIsOpen] = useState(false);
|
||||||
const { toast } = useToast();
|
const { toast } = useToast();
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const [initDataUnit, setInitDataUnit] = useState<string[]>([]);
|
|
||||||
const [satkerData, setSatkerData] = useState<string[]>([]);
|
const [satkerData, setSatkerData] = useState<string[]>([]);
|
||||||
const [unitData, setUnitData] = useState<string[]>([]);
|
const [unitData, setUnitData] = useState<string[]>([]);
|
||||||
const [userList, setUserList] = useState<
|
const [userList, setUserList] = useState<
|
||||||
|
|
@ -146,6 +146,7 @@ export default function EditCategoryModal(props: {
|
||||||
removeAndReturn(data?.publishedFor, [2, 3, 4])
|
removeAndReturn(data?.publishedFor, [2, 3, 4])
|
||||||
);
|
);
|
||||||
form.setValue("publishTo", data?.publishedLocation?.split(","));
|
form.setValue("publishTo", data?.publishedLocation?.split(","));
|
||||||
|
form.setValue("file", thumbnailLink);
|
||||||
|
|
||||||
setUnitData(filterString(data?.publishedLocationLevel, "under"));
|
setUnitData(filterString(data?.publishedLocationLevel, "under"));
|
||||||
setSatkerData(filterString(data?.publishedLocationLevel, "above"));
|
setSatkerData(filterString(data?.publishedLocationLevel, "above"));
|
||||||
|
|
@ -163,15 +164,15 @@ export default function EditCategoryModal(props: {
|
||||||
}
|
}
|
||||||
|
|
||||||
function filterString(inputString: string, type: string) {
|
function filterString(inputString: string, type: string) {
|
||||||
const numbers = inputString.split(",").map(Number);
|
const numbers = inputString?.split(",").map(Number);
|
||||||
if (type === "above") {
|
if (type === "above") {
|
||||||
const above700 = numbers.filter((num) => num > 700);
|
const above700 = numbers?.filter((num) => num > 700);
|
||||||
|
|
||||||
return above700.map(String);
|
return above700?.map(String);
|
||||||
} else {
|
} else {
|
||||||
const under700 = numbers.filter((num) => num < 700);
|
const under700 = numbers?.filter((num) => num < 700);
|
||||||
|
|
||||||
return under700.map(String);
|
return under700?.map(String);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -226,9 +227,11 @@ export default function EditCategoryModal(props: {
|
||||||
formMedia.append("description", data.description);
|
formMedia.append("description", data.description);
|
||||||
formMedia.append("mediaTypes", data.contentType.join(","));
|
formMedia.append("mediaTypes", data.contentType.join(","));
|
||||||
formMedia.append("publishedFor", data.selectedUser.join(","));
|
formMedia.append("publishedFor", data.selectedUser.join(","));
|
||||||
formMedia.append("file", files[0]);
|
|
||||||
formMedia.append("publishedLocation", data.publishTo.sort().join(","));
|
formMedia.append("publishedLocation", data.publishTo.sort().join(","));
|
||||||
formMedia.append("publishedLocationLevel", removeDuplicates(join));
|
formMedia.append("publishedLocationLevel", removeDuplicates(join));
|
||||||
|
if (files?.length > 0) {
|
||||||
|
formMedia.append("file", files[0]);
|
||||||
|
}
|
||||||
|
|
||||||
const response = await postCategory(formMedia);
|
const response = await postCategory(formMedia);
|
||||||
close();
|
close();
|
||||||
|
|
@ -520,50 +523,71 @@ export default function EditCategoryModal(props: {
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
{/* <FormField
|
{isDetail ? (
|
||||||
control={form.control}
|
<div className="flex flex-row gap-2">
|
||||||
name="file"
|
<img src={thumbnailLink} className="w-[30%]" alt="thumbnail" />
|
||||||
render={({ field }) => (
|
</div>
|
||||||
<FormItem>
|
) : (
|
||||||
<FormLabel>Thumbnail Category</FormLabel>
|
<FormField
|
||||||
{files.length < 1 && (
|
control={form.control}
|
||||||
<Fragment>
|
name="file"
|
||||||
<div {...getRootProps({ className: "dropzone" })}>
|
render={({ field }) => (
|
||||||
<input {...getInputProps()} />
|
<FormItem>
|
||||||
<div className=" w-full text-center border-dashed border border-default-200 dark:border-default-300 rounded-md py-[52px] flex items-center flex-col">
|
<FormLabel>Thumbnail Category</FormLabel>
|
||||||
<CloudUpload className="text-default-300 w-10 h-10" />
|
{files.length < 1 && field.value === "" && (
|
||||||
<h4 className=" text-2xl font-medium mb-1 mt-3 text-card-foreground/80">
|
<Fragment>
|
||||||
Tarik file disini atau klik untuk upload.
|
<div {...getRootProps({ className: "dropzone" })}>
|
||||||
</h4>
|
<input {...getInputProps()} />
|
||||||
<div className=" text-xs text-muted-foreground">
|
<div className=" w-full text-center border-dashed border border-default-200 dark:border-default-300 rounded-md py-[52px] flex items-center flex-col">
|
||||||
( Upload file dengan format .jpg, .jpeg, atau .png.
|
<CloudUpload className="text-default-300 w-10 h-10" />
|
||||||
Ukuran maksimal 100mb.)
|
<h4 className=" text-2xl font-medium mb-1 mt-3 text-card-foreground/80">
|
||||||
|
Tarik file disini atau klik untuk upload.
|
||||||
|
</h4>
|
||||||
|
<div className=" text-xs text-muted-foreground">
|
||||||
|
( Upload file dengan format .jpg, .jpeg, atau
|
||||||
|
.png. Ukuran maksimal 100mb.)
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</Fragment>
|
||||||
|
)}
|
||||||
|
{field.value !== "" && (
|
||||||
|
<div className="flex flex-row gap-2">
|
||||||
|
<img
|
||||||
|
src={field.value}
|
||||||
|
className="w-[30%]"
|
||||||
|
alt="thumbnail"
|
||||||
|
/>
|
||||||
|
<a
|
||||||
|
onClick={() => form.setValue("file", "")}
|
||||||
|
className="cursor-pointer"
|
||||||
|
>
|
||||||
|
<Icon icon="fa-solid:times" color="red" />
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</Fragment>
|
)}
|
||||||
)}
|
|
||||||
|
|
||||||
{files.length > 0 && (
|
{files.length > 0 && (
|
||||||
<div className="flex flex-row gap-2">
|
<div className="flex flex-row gap-2">
|
||||||
<img
|
<img
|
||||||
src={URL.createObjectURL(files[0])}
|
src={URL.createObjectURL(files[0])}
|
||||||
className="w-[30%]"
|
className="w-[30%]"
|
||||||
alt="thumbnail"
|
alt="thumbnail"
|
||||||
/>
|
/>
|
||||||
<a
|
<a
|
||||||
onClick={() => handleRemoveFile(files[0])}
|
onClick={() => handleRemoveFile(files[0])}
|
||||||
className="cursor-pointer"
|
className="cursor-pointer"
|
||||||
>
|
>
|
||||||
<Icon icon="fa-solid:times" color="red" />
|
<Icon icon="fa-solid:times" color="red" />
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
/> */}
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
<FormField
|
<FormField
|
||||||
control={form.control}
|
control={form.control}
|
||||||
|
|
@ -584,16 +608,18 @@ export default function EditCategoryModal(props: {
|
||||||
</FormItem>
|
</FormItem>
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
<DialogFooter>
|
{!isDetail && (
|
||||||
<Button
|
<DialogFooter>
|
||||||
type="submit"
|
<Button
|
||||||
color="primary"
|
type="submit"
|
||||||
size="md"
|
color="primary"
|
||||||
className="text-xs"
|
size="md"
|
||||||
>
|
className="text-xs"
|
||||||
Edit Kategori
|
>
|
||||||
</Button>
|
Edit Kategori
|
||||||
</DialogFooter>
|
</Button>
|
||||||
|
</DialogFooter>
|
||||||
|
)}
|
||||||
</form>
|
</form>
|
||||||
</Form>
|
</Form>
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,14 @@ import { useEffect, useRef } from "react";
|
||||||
import { getPrivacy, savePrivacy } from "@/service/settings/settings";
|
import { getPrivacy, savePrivacy } from "@/service/settings/settings";
|
||||||
import { useToast } from "@/components/ui/use-toast";
|
import { useToast } from "@/components/ui/use-toast";
|
||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
|
import dynamic from "next/dynamic";
|
||||||
|
|
||||||
|
const CustomEditor = dynamic(
|
||||||
|
() => {
|
||||||
|
return import("@/components/editor/custom-editor");
|
||||||
|
},
|
||||||
|
{ ssr: false }
|
||||||
|
);
|
||||||
|
|
||||||
const FormSchema = z.object({
|
const FormSchema = z.object({
|
||||||
title: z.string({
|
title: z.string({
|
||||||
|
|
@ -96,7 +104,7 @@ export default function AdminPrivacyPolicy() {
|
||||||
<FormItem>
|
<FormItem>
|
||||||
<FormLabel>Konten</FormLabel>
|
<FormLabel>Konten</FormLabel>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<JoditEditor
|
{/* <JoditEditor
|
||||||
ref={editor}
|
ref={editor}
|
||||||
value={field.value}
|
value={field.value}
|
||||||
config={{
|
config={{
|
||||||
|
|
@ -104,6 +112,11 @@ export default function AdminPrivacyPolicy() {
|
||||||
}}
|
}}
|
||||||
className="dark:text-black"
|
className="dark:text-black"
|
||||||
onChange={field.onChange}
|
onChange={field.onChange}
|
||||||
|
|
||||||
|
/> */}
|
||||||
|
<CustomEditor
|
||||||
|
onChange={field.onChange}
|
||||||
|
initialData={field.value}
|
||||||
/>
|
/>
|
||||||
</FormControl>
|
</FormControl>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,140 @@
|
||||||
|
import * as React from "react";
|
||||||
|
import { ColumnDef } from "@tanstack/react-table";
|
||||||
|
|
||||||
|
import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react";
|
||||||
|
import { cn } from "@/lib/utils";
|
||||||
|
import {
|
||||||
|
DropdownMenu,
|
||||||
|
DropdownMenuContent,
|
||||||
|
DropdownMenuTrigger,
|
||||||
|
DropdownMenuItem,
|
||||||
|
} from "@/components/ui/dropdown-menu";
|
||||||
|
import { Button } from "@/components/ui/button";
|
||||||
|
import { Badge } from "@/components/ui/badge";
|
||||||
|
import { formatDateToIndonesian } from "@/utils/globals";
|
||||||
|
import { Link, useRouter } from "@/i18n/routing";
|
||||||
|
|
||||||
|
import { setBanner } from "@/service/settings/settings";
|
||||||
|
import { error } from "@/config/swal";
|
||||||
|
import { useToast } from "@/components/ui/use-toast";
|
||||||
|
|
||||||
|
const columns: ColumnDef<any>[] = [
|
||||||
|
{
|
||||||
|
accessorKey: "no",
|
||||||
|
header: "No",
|
||||||
|
cell: ({ row }) => <span>{row.getValue("no")}</span>,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
accessorKey: "fullname",
|
||||||
|
header: "Nama",
|
||||||
|
cell: ({ row }) => (
|
||||||
|
<span className="normal-case">{row.getValue("fullname")}</span>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: "username",
|
||||||
|
header: "Username",
|
||||||
|
cell: ({ row }) => (
|
||||||
|
<span className="normal-case">
|
||||||
|
{row.original?.userKeycloak?.username || ""}
|
||||||
|
</span>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: "phoneNumber",
|
||||||
|
header: "No. HP",
|
||||||
|
cell: ({ row }) => <span>{row.getValue("phoneNumber")}</span>,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: "email",
|
||||||
|
header: "Email",
|
||||||
|
cell: ({ row }) => (
|
||||||
|
<span className="normal-case">{row.getValue("email")}</span>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: "level",
|
||||||
|
header: "Level Pengguna",
|
||||||
|
cell: ({ row }) => (
|
||||||
|
<span className="normal-case">{row.original?.role?.name || ""}</span>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: "createdAt",
|
||||||
|
header: "Tanggal Unggah",
|
||||||
|
cell: ({ row }) => (
|
||||||
|
<span>{formatDateToIndonesian(row.getValue("createdAt"))}</span>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
accessorKey: "isActive",
|
||||||
|
header: "Status",
|
||||||
|
cell: ({ row }) => (
|
||||||
|
<span
|
||||||
|
className={
|
||||||
|
row.getValue("isActive") ? "text-success" : "text-destructive"
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{row.getValue("isActive") ? "Aktif" : "Belum Aktif"}
|
||||||
|
</span>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
id: "actions",
|
||||||
|
accessorKey: "action",
|
||||||
|
header: "Actions",
|
||||||
|
enableHiding: false,
|
||||||
|
cell: ({ row }) => {
|
||||||
|
const { toast } = useToast();
|
||||||
|
|
||||||
|
const handleBanner = async (id: number) => {
|
||||||
|
const response = setBanner(id, true);
|
||||||
|
toast({
|
||||||
|
title: "Success",
|
||||||
|
});
|
||||||
|
};
|
||||||
|
return (
|
||||||
|
<DropdownMenu>
|
||||||
|
<DropdownMenuTrigger asChild>
|
||||||
|
<Button
|
||||||
|
size="icon"
|
||||||
|
className="bg-transparent ring-offset-transparent hover:bg-transparent hover:ring-0 hover:ring-transparent"
|
||||||
|
>
|
||||||
|
<MoreVertical className="h-4 w-4 text-default-800" />
|
||||||
|
</Button>
|
||||||
|
</DropdownMenuTrigger>
|
||||||
|
<DropdownMenuContent className="p-0" align="end">
|
||||||
|
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none">
|
||||||
|
<a>Aktivasi</a>
|
||||||
|
</DropdownMenuItem>
|
||||||
|
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none">
|
||||||
|
<Link
|
||||||
|
href={`/admin/management-user/external/detail/${row.original.id}`}
|
||||||
|
>
|
||||||
|
Detail
|
||||||
|
</Link>
|
||||||
|
</DropdownMenuItem>
|
||||||
|
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none">
|
||||||
|
<Link
|
||||||
|
href={`/admin/management-user/external/detail/${row.original.id}`}
|
||||||
|
>
|
||||||
|
Edit
|
||||||
|
</Link>
|
||||||
|
</DropdownMenuItem>
|
||||||
|
<DropdownMenuItem
|
||||||
|
color="red"
|
||||||
|
className="p-2 border-b text-red-500 group focus:bg-red-500 focus:text-white rounded-none"
|
||||||
|
>
|
||||||
|
<a onClick={() => {}}>Hapus</a>
|
||||||
|
</DropdownMenuItem>
|
||||||
|
</DropdownMenuContent>
|
||||||
|
</DropdownMenu>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export default columns;
|
||||||
|
|
@ -0,0 +1,389 @@
|
||||||
|
"use client";
|
||||||
|
|
||||||
|
import * as React from "react";
|
||||||
|
import {
|
||||||
|
ColumnDef,
|
||||||
|
ColumnFiltersState,
|
||||||
|
PaginationState,
|
||||||
|
SortingState,
|
||||||
|
VisibilityState,
|
||||||
|
flexRender,
|
||||||
|
getCoreRowModel,
|
||||||
|
getFilteredRowModel,
|
||||||
|
getPaginationRowModel,
|
||||||
|
getSortedRowModel,
|
||||||
|
useReactTable,
|
||||||
|
} from "@tanstack/react-table";
|
||||||
|
import { Button } from "@/components/ui/button";
|
||||||
|
|
||||||
|
import {
|
||||||
|
Table,
|
||||||
|
TableBody,
|
||||||
|
TableCell,
|
||||||
|
TableHead,
|
||||||
|
TableHeader,
|
||||||
|
TableRow,
|
||||||
|
} from "@/components/ui/table";
|
||||||
|
import { PlusIcon } from "lucide-react";
|
||||||
|
import { cn, getCookiesDecrypt } from "@/lib/utils";
|
||||||
|
import {
|
||||||
|
DropdownMenu,
|
||||||
|
DropdownMenuContent,
|
||||||
|
DropdownMenuItem,
|
||||||
|
DropdownMenuRadioGroup,
|
||||||
|
DropdownMenuRadioItem,
|
||||||
|
DropdownMenuTrigger,
|
||||||
|
} from "@/components/ui/dropdown-menu";
|
||||||
|
import { Input } from "@/components/ui/input";
|
||||||
|
|
||||||
|
import { useRouter, useSearchParams } from "next/navigation";
|
||||||
|
import TablePagination from "@/components/table/table-pagination";
|
||||||
|
import columns from "./management-user-external-column-table";
|
||||||
|
import {
|
||||||
|
Popover,
|
||||||
|
PopoverContent,
|
||||||
|
PopoverTrigger,
|
||||||
|
} from "@/components/ui/popover";
|
||||||
|
|
||||||
|
import { Checkbox } from "@/components/ui/checkbox";
|
||||||
|
import { close, loading } from "@/config/swal";
|
||||||
|
import { Link } from "@/i18n/routing";
|
||||||
|
import { AdministrationUserList } from "@/service/management-user/management-user";
|
||||||
|
|
||||||
|
const UserExternalTable = () => {
|
||||||
|
const router = useRouter();
|
||||||
|
const levelId = getCookiesDecrypt("ulie");
|
||||||
|
|
||||||
|
const searchParams = useSearchParams();
|
||||||
|
const [showData, setShowData] = React.useState("10");
|
||||||
|
const [categories, setCategories] = React.useState<any>();
|
||||||
|
const [dataTable, setDataTable] = React.useState<any[]>([]);
|
||||||
|
const [totalData, setTotalData] = React.useState<number>(1);
|
||||||
|
const [sorting, setSorting] = React.useState<SortingState>([]);
|
||||||
|
const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>(
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
const [columnVisibility, setColumnVisibility] =
|
||||||
|
React.useState<VisibilityState>({});
|
||||||
|
const [rowSelection, setRowSelection] = React.useState({});
|
||||||
|
const [pagination, setPagination] = React.useState<PaginationState>({
|
||||||
|
pageIndex: 0,
|
||||||
|
pageSize: Number(showData),
|
||||||
|
});
|
||||||
|
const [search, setSearch] = React.useState("");
|
||||||
|
const [categoryFilter, setCategoryFilter] = React.useState<number[]>([]);
|
||||||
|
const [statusFilter, setStatusFilter] = React.useState<number[]>([]);
|
||||||
|
const [page, setPage] = React.useState(1);
|
||||||
|
const [totalPage, setTotalPage] = React.useState(1);
|
||||||
|
const table = useReactTable({
|
||||||
|
data: dataTable,
|
||||||
|
columns,
|
||||||
|
onSortingChange: setSorting,
|
||||||
|
onColumnFiltersChange: setColumnFilters,
|
||||||
|
getCoreRowModel: getCoreRowModel(),
|
||||||
|
getPaginationRowModel: getPaginationRowModel(),
|
||||||
|
getSortedRowModel: getSortedRowModel(),
|
||||||
|
getFilteredRowModel: getFilteredRowModel(),
|
||||||
|
onColumnVisibilityChange: setColumnVisibility,
|
||||||
|
onRowSelectionChange: setRowSelection,
|
||||||
|
onPaginationChange: setPagination,
|
||||||
|
state: {
|
||||||
|
sorting,
|
||||||
|
columnFilters,
|
||||||
|
columnVisibility,
|
||||||
|
rowSelection,
|
||||||
|
pagination,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
let typingTimer: any;
|
||||||
|
const doneTypingInterval = 1500;
|
||||||
|
|
||||||
|
const handleKeyUp = () => {
|
||||||
|
clearTimeout(typingTimer);
|
||||||
|
typingTimer = setTimeout(doneTyping, doneTypingInterval);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleKeyDown = () => {
|
||||||
|
clearTimeout(typingTimer);
|
||||||
|
typingTimer = setTimeout(doneTyping, doneTypingInterval);
|
||||||
|
};
|
||||||
|
|
||||||
|
async function doneTyping() {
|
||||||
|
fetchData();
|
||||||
|
}
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
const pageFromUrl = searchParams?.get("page");
|
||||||
|
if (pageFromUrl) {
|
||||||
|
setPage(Number(pageFromUrl));
|
||||||
|
}
|
||||||
|
}, [searchParams]);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
fetchData();
|
||||||
|
setPagination({
|
||||||
|
pageIndex: 0,
|
||||||
|
pageSize: Number(showData),
|
||||||
|
});
|
||||||
|
}, [page, showData]);
|
||||||
|
|
||||||
|
async function fetchData() {
|
||||||
|
try {
|
||||||
|
loading();
|
||||||
|
const res = await AdministrationUserList(
|
||||||
|
String(levelId),
|
||||||
|
page - 1,
|
||||||
|
search,
|
||||||
|
showData,
|
||||||
|
"2",
|
||||||
|
statusFilter?.sort().join(",")
|
||||||
|
);
|
||||||
|
const data = res?.data?.data;
|
||||||
|
const contentData = data?.content;
|
||||||
|
contentData.forEach((item: any, index: number) => {
|
||||||
|
item.no = (page - 1) * Number(showData) + index + 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("contentData : ", contentData);
|
||||||
|
|
||||||
|
setDataTable(contentData);
|
||||||
|
setTotalData(data?.totalElements);
|
||||||
|
setTotalPage(data?.totalPages);
|
||||||
|
close();
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error fetching tasks:", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleChange = (type: string, id: number, checked: boolean) => {
|
||||||
|
if (type === "category") {
|
||||||
|
if (checked) {
|
||||||
|
const temp: number[] = [...categoryFilter];
|
||||||
|
temp.push(id);
|
||||||
|
setCategoryFilter(temp);
|
||||||
|
} else {
|
||||||
|
const temp = categoryFilter.filter((a) => a !== id);
|
||||||
|
setCategoryFilter(temp);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (checked) {
|
||||||
|
const temp: number[] = [...statusFilter];
|
||||||
|
temp.push(id);
|
||||||
|
setStatusFilter(temp);
|
||||||
|
} else {
|
||||||
|
const temp = statusFilter.filter((a) => a !== id);
|
||||||
|
setStatusFilter(temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="flex justify-between py-3">
|
||||||
|
<p className="text-lg">Data User Eksternal</p>
|
||||||
|
</div>
|
||||||
|
<div className="flex justify-between py-3">
|
||||||
|
<Input
|
||||||
|
type="text"
|
||||||
|
placeholder="Search"
|
||||||
|
onKeyUp={handleKeyUp}
|
||||||
|
onKeyDown={handleKeyDown}
|
||||||
|
onChange={(e) => setSearch(e.target.value)}
|
||||||
|
className="max-w-[300px]"
|
||||||
|
/>
|
||||||
|
<div className="flex flex-row gap-2">
|
||||||
|
<DropdownMenu>
|
||||||
|
<DropdownMenuTrigger asChild>
|
||||||
|
<Button size="md" variant="outline">
|
||||||
|
1 - {showData} Data
|
||||||
|
</Button>
|
||||||
|
</DropdownMenuTrigger>
|
||||||
|
<DropdownMenuContent className="w-56 text-sm">
|
||||||
|
<DropdownMenuRadioGroup
|
||||||
|
value={showData}
|
||||||
|
onValueChange={setShowData}
|
||||||
|
>
|
||||||
|
<DropdownMenuRadioItem value="10">
|
||||||
|
1 - 10 Data
|
||||||
|
</DropdownMenuRadioItem>
|
||||||
|
<DropdownMenuRadioItem value="20">
|
||||||
|
1 - 20 Data
|
||||||
|
</DropdownMenuRadioItem>
|
||||||
|
<DropdownMenuRadioItem value="25">
|
||||||
|
1 - 25 Data
|
||||||
|
</DropdownMenuRadioItem>
|
||||||
|
<DropdownMenuRadioItem value="50">
|
||||||
|
1 - 50 Data
|
||||||
|
</DropdownMenuRadioItem>
|
||||||
|
</DropdownMenuRadioGroup>
|
||||||
|
</DropdownMenuContent>
|
||||||
|
</DropdownMenu>
|
||||||
|
<Popover>
|
||||||
|
<PopoverTrigger asChild>
|
||||||
|
<Button size="md" variant="outline">
|
||||||
|
Filter
|
||||||
|
</Button>
|
||||||
|
</PopoverTrigger>
|
||||||
|
<PopoverContent className="w-80 ">
|
||||||
|
<div className="flex flex-col gap-2 px-2">
|
||||||
|
<div className="flex justify-between text-sm">
|
||||||
|
<p>Filter</p>
|
||||||
|
<a
|
||||||
|
onClick={() => fetchData()}
|
||||||
|
className="cursor-pointer text-primary"
|
||||||
|
>
|
||||||
|
Simpan
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-col gap-1 overflow-auto max-h-[300px] text-xs custom-scrollbar-table">
|
||||||
|
<p>Admin</p>
|
||||||
|
<div className="flex items-center space-x-2">
|
||||||
|
<Checkbox
|
||||||
|
id="accepted"
|
||||||
|
checked={statusFilter.includes(3)}
|
||||||
|
onCheckedChange={(e) =>
|
||||||
|
handleChange("status", 3, Boolean(e))
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<label
|
||||||
|
htmlFor="accepted"
|
||||||
|
className="text-xs font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
||||||
|
>
|
||||||
|
Approver
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center space-x-2">
|
||||||
|
<Checkbox
|
||||||
|
id="accepted"
|
||||||
|
checked={statusFilter.includes(4)}
|
||||||
|
onCheckedChange={(e) =>
|
||||||
|
handleChange("status", 4, Boolean(e))
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<label
|
||||||
|
htmlFor="accepted"
|
||||||
|
className="text-xs font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
||||||
|
>
|
||||||
|
Kontributor
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<p className="mt-3">Kurator</p>
|
||||||
|
<div className="flex items-center space-x-2">
|
||||||
|
<Checkbox
|
||||||
|
id="accepted"
|
||||||
|
checked={statusFilter.includes(11)}
|
||||||
|
onCheckedChange={(e) =>
|
||||||
|
handleChange("status", 11, Boolean(e))
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<label
|
||||||
|
htmlFor="accepted"
|
||||||
|
className="text-xs font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
||||||
|
>
|
||||||
|
Koordinator
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center space-x-2">
|
||||||
|
<Checkbox
|
||||||
|
id="accepted"
|
||||||
|
checked={statusFilter.includes(12)}
|
||||||
|
onCheckedChange={(e) =>
|
||||||
|
handleChange("status", 12, Boolean(e))
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<label
|
||||||
|
htmlFor="accepted"
|
||||||
|
className="text-xs font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
||||||
|
>
|
||||||
|
Kurator
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<p className="mt-3">Feedback Center</p>
|
||||||
|
<div className="flex items-center space-x-2">
|
||||||
|
<Checkbox
|
||||||
|
id="accepted"
|
||||||
|
checked={statusFilter.includes(9)}
|
||||||
|
onCheckedChange={(e) =>
|
||||||
|
handleChange("status", 9, Boolean(e))
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<label
|
||||||
|
htmlFor="accepted"
|
||||||
|
className="text-xs font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
||||||
|
>
|
||||||
|
Supervisor
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center space-x-2">
|
||||||
|
<Checkbox
|
||||||
|
id="accepted"
|
||||||
|
checked={statusFilter.includes(10)}
|
||||||
|
onCheckedChange={(e) =>
|
||||||
|
handleChange("status", 10, Boolean(e))
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<label
|
||||||
|
htmlFor="accepted"
|
||||||
|
className="text-xs font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
||||||
|
>
|
||||||
|
Operator
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</PopoverContent>
|
||||||
|
</Popover>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Table className="overflow-hidden">
|
||||||
|
<TableHeader>
|
||||||
|
{table.getHeaderGroups().map((headerGroup) => (
|
||||||
|
<TableRow key={headerGroup.id} className="bg-default-200">
|
||||||
|
{headerGroup.headers.map((header) => (
|
||||||
|
<TableHead key={header.id}>
|
||||||
|
{header.isPlaceholder
|
||||||
|
? null
|
||||||
|
: flexRender(
|
||||||
|
header.column.columnDef.header,
|
||||||
|
header.getContext()
|
||||||
|
)}
|
||||||
|
</TableHead>
|
||||||
|
))}
|
||||||
|
</TableRow>
|
||||||
|
))}
|
||||||
|
</TableHeader>
|
||||||
|
<TableBody>
|
||||||
|
{table.getRowModel().rows?.length ? (
|
||||||
|
table.getRowModel().rows.map((row) => (
|
||||||
|
<TableRow
|
||||||
|
key={row.id}
|
||||||
|
data-state={row.getIsSelected() && "selected"}
|
||||||
|
className="h-[75px]"
|
||||||
|
>
|
||||||
|
{row.getVisibleCells().map((cell) => (
|
||||||
|
<TableCell key={cell.id}>
|
||||||
|
{flexRender(cell.column.columnDef.cell, cell.getContext())}
|
||||||
|
</TableCell>
|
||||||
|
))}
|
||||||
|
</TableRow>
|
||||||
|
))
|
||||||
|
) : (
|
||||||
|
<TableRow>
|
||||||
|
<TableCell colSpan={columns.length} className="h-24 text-center">
|
||||||
|
No results.
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
)}
|
||||||
|
</TableBody>
|
||||||
|
</Table>
|
||||||
|
<TablePagination
|
||||||
|
table={table}
|
||||||
|
totalData={totalData}
|
||||||
|
totalPage={totalPage}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default UserExternalTable;
|
||||||
|
|
@ -0,0 +1,154 @@
|
||||||
|
import * as React from "react";
|
||||||
|
import { ColumnDef } from "@tanstack/react-table";
|
||||||
|
|
||||||
|
import { Eye, MoreVertical, SquarePen, Trash2 } from "lucide-react";
|
||||||
|
import { cn } from "@/lib/utils";
|
||||||
|
import {
|
||||||
|
DropdownMenu,
|
||||||
|
DropdownMenuContent,
|
||||||
|
DropdownMenuTrigger,
|
||||||
|
DropdownMenuItem,
|
||||||
|
} from "@/components/ui/dropdown-menu";
|
||||||
|
import { Button } from "@/components/ui/button";
|
||||||
|
import { Badge } from "@/components/ui/badge";
|
||||||
|
import {
|
||||||
|
formatDateToIndonesian,
|
||||||
|
getOnlyDate,
|
||||||
|
htmlToString,
|
||||||
|
} from "@/utils/globals";
|
||||||
|
import { Link, useRouter } from "@/i18n/routing";
|
||||||
|
import {
|
||||||
|
Accordion,
|
||||||
|
AccordionContent,
|
||||||
|
AccordionItem,
|
||||||
|
AccordionTrigger,
|
||||||
|
} from "@/components/ui/accordion";
|
||||||
|
import {
|
||||||
|
Dialog,
|
||||||
|
DialogContent,
|
||||||
|
DialogHeader,
|
||||||
|
DialogTitle,
|
||||||
|
DialogTrigger,
|
||||||
|
} from "@/components/ui/dialog";
|
||||||
|
import { Collapsible, CollapsibleContent } from "@/components/ui/collapsible";
|
||||||
|
import { setBanner } from "@/service/settings/settings";
|
||||||
|
import { error } from "@/config/swal";
|
||||||
|
import { useToast } from "@/components/ui/use-toast";
|
||||||
|
|
||||||
|
const columns: ColumnDef<any>[] = [
|
||||||
|
{
|
||||||
|
accessorKey: "no",
|
||||||
|
header: "No",
|
||||||
|
cell: ({ row }) => <span>{row.getValue("no")}</span>,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
accessorKey: "fullname",
|
||||||
|
header: "Nama",
|
||||||
|
cell: ({ row }) => (
|
||||||
|
<span className="normal-case">{row.getValue("fullname")}</span>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: "username",
|
||||||
|
header: "Username",
|
||||||
|
cell: ({ row }) => (
|
||||||
|
<span className="normal-case">
|
||||||
|
{row.original?.userKeycloak?.username || ""}
|
||||||
|
</span>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: "phoneNumber",
|
||||||
|
header: "No. HP",
|
||||||
|
cell: ({ row }) => <span>{row.getValue("phoneNumber")}</span>,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: "email",
|
||||||
|
header: "Email",
|
||||||
|
cell: ({ row }) => (
|
||||||
|
<span className="normal-case">{row.getValue("email")}</span>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: "level",
|
||||||
|
header: "Level Pengguna",
|
||||||
|
cell: ({ row }) => (
|
||||||
|
<span className="normal-case">{row.original.userLevel.name}</span>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
accessorKey: "createdAt",
|
||||||
|
header: "Tanggal Unggah",
|
||||||
|
cell: ({ row }) => (
|
||||||
|
<span>{formatDateToIndonesian(row.getValue("createdAt"))}</span>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
accessorKey: "isActive",
|
||||||
|
header: "Status",
|
||||||
|
cell: ({ row }) => (
|
||||||
|
<span
|
||||||
|
className={
|
||||||
|
row.getValue("isActive") ? "text-success" : "text-destructive"
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{row.getValue("isActive") ? "Aktif" : "Belum Aktif"}
|
||||||
|
</span>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
id: "actions",
|
||||||
|
accessorKey: "action",
|
||||||
|
header: "Actions",
|
||||||
|
enableHiding: false,
|
||||||
|
cell: ({ row }) => {
|
||||||
|
const { toast } = useToast();
|
||||||
|
|
||||||
|
const handleBanner = async (id: number) => {
|
||||||
|
const response = setBanner(id, true);
|
||||||
|
toast({
|
||||||
|
title: "Success",
|
||||||
|
});
|
||||||
|
};
|
||||||
|
return (
|
||||||
|
<DropdownMenu>
|
||||||
|
<DropdownMenuTrigger asChild>
|
||||||
|
<Button
|
||||||
|
size="icon"
|
||||||
|
className="bg-transparent ring-offset-transparent hover:bg-transparent hover:ring-0 hover:ring-transparent"
|
||||||
|
>
|
||||||
|
<MoreVertical className="h-4 w-4 text-default-800" />
|
||||||
|
</Button>
|
||||||
|
</DropdownMenuTrigger>
|
||||||
|
<DropdownMenuContent className="p-0" align="end">
|
||||||
|
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none">
|
||||||
|
<Link
|
||||||
|
href={`/admin/management-user/internal/detail/${row.original.id}`}
|
||||||
|
>
|
||||||
|
Detail
|
||||||
|
</Link>
|
||||||
|
</DropdownMenuItem>
|
||||||
|
<DropdownMenuItem className="p-2 border-b text-default-700 group focus:bg-default focus:text-primary-foreground rounded-none">
|
||||||
|
<Link
|
||||||
|
href={`/admin/management-user/internal/edit/${row.original.id}`}
|
||||||
|
>
|
||||||
|
Edit
|
||||||
|
</Link>
|
||||||
|
</DropdownMenuItem>
|
||||||
|
<DropdownMenuItem
|
||||||
|
color="red"
|
||||||
|
className="p-2 border-b text-red-500 group focus:bg-red-500 focus:text-white rounded-none"
|
||||||
|
>
|
||||||
|
<a onClick={() => {}}>Hapus</a>
|
||||||
|
</DropdownMenuItem>
|
||||||
|
</DropdownMenuContent>
|
||||||
|
</DropdownMenu>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
export default columns;
|
||||||
|
|
@ -0,0 +1,415 @@
|
||||||
|
"use client";
|
||||||
|
|
||||||
|
import * as React from "react";
|
||||||
|
import {
|
||||||
|
ColumnDef,
|
||||||
|
ColumnFiltersState,
|
||||||
|
PaginationState,
|
||||||
|
SortingState,
|
||||||
|
VisibilityState,
|
||||||
|
flexRender,
|
||||||
|
getCoreRowModel,
|
||||||
|
getFilteredRowModel,
|
||||||
|
getPaginationRowModel,
|
||||||
|
getSortedRowModel,
|
||||||
|
useReactTable,
|
||||||
|
} from "@tanstack/react-table";
|
||||||
|
import { Button } from "@/components/ui/button";
|
||||||
|
|
||||||
|
import {
|
||||||
|
Table,
|
||||||
|
TableBody,
|
||||||
|
TableCell,
|
||||||
|
TableHead,
|
||||||
|
TableHeader,
|
||||||
|
TableRow,
|
||||||
|
} from "@/components/ui/table";
|
||||||
|
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
|
||||||
|
import {
|
||||||
|
ChevronLeft,
|
||||||
|
ChevronRight,
|
||||||
|
Eye,
|
||||||
|
MoreVertical,
|
||||||
|
PlusIcon,
|
||||||
|
Search,
|
||||||
|
SquarePen,
|
||||||
|
Trash2,
|
||||||
|
TrendingDown,
|
||||||
|
TrendingUp,
|
||||||
|
UserIcon,
|
||||||
|
} from "lucide-react";
|
||||||
|
import { cn, getCookiesDecrypt } from "@/lib/utils";
|
||||||
|
import {
|
||||||
|
DropdownMenu,
|
||||||
|
DropdownMenuContent,
|
||||||
|
DropdownMenuItem,
|
||||||
|
DropdownMenuRadioGroup,
|
||||||
|
DropdownMenuRadioItem,
|
||||||
|
DropdownMenuTrigger,
|
||||||
|
} from "@/components/ui/dropdown-menu";
|
||||||
|
import { Input } from "@/components/ui/input";
|
||||||
|
import { InputGroup, InputGroupText } from "@/components/ui/input-group";
|
||||||
|
import { paginationBlog } from "@/service/blog/blog";
|
||||||
|
import { ticketingPagination } from "@/service/ticketing/ticketing";
|
||||||
|
import { Badge } from "@/components/ui/badge";
|
||||||
|
import { useRouter, useSearchParams } from "next/navigation";
|
||||||
|
import TablePagination from "@/components/table/table-pagination";
|
||||||
|
import columns from "./management-user-internal-column-table";
|
||||||
|
import { getPlanningPagination } from "@/service/agenda-setting/agenda-setting";
|
||||||
|
import {
|
||||||
|
Popover,
|
||||||
|
PopoverContent,
|
||||||
|
PopoverTrigger,
|
||||||
|
} from "@/components/ui/popover";
|
||||||
|
import { listDataMedia } from "@/service/broadcast/broadcast";
|
||||||
|
import { listEnableCategory } from "@/service/content/content";
|
||||||
|
import { Checkbox } from "@/components/ui/checkbox";
|
||||||
|
import { close, loading } from "@/config/swal";
|
||||||
|
import { Link } from "@/i18n/routing";
|
||||||
|
import { AdministrationUserList } from "@/service/management-user/management-user";
|
||||||
|
|
||||||
|
const UserInternalTable = () => {
|
||||||
|
const router = useRouter();
|
||||||
|
const levelId = getCookiesDecrypt("ulie");
|
||||||
|
|
||||||
|
const searchParams = useSearchParams();
|
||||||
|
const [showData, setShowData] = React.useState("10");
|
||||||
|
const [categories, setCategories] = React.useState<any>();
|
||||||
|
const [dataTable, setDataTable] = React.useState<any[]>([]);
|
||||||
|
const [totalData, setTotalData] = React.useState<number>(1);
|
||||||
|
const [sorting, setSorting] = React.useState<SortingState>([]);
|
||||||
|
const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>(
|
||||||
|
[]
|
||||||
|
);
|
||||||
|
const [columnVisibility, setColumnVisibility] =
|
||||||
|
React.useState<VisibilityState>({});
|
||||||
|
const [rowSelection, setRowSelection] = React.useState({});
|
||||||
|
const [pagination, setPagination] = React.useState<PaginationState>({
|
||||||
|
pageIndex: 0,
|
||||||
|
pageSize: Number(showData),
|
||||||
|
});
|
||||||
|
const [search, setSearch] = React.useState("");
|
||||||
|
|
||||||
|
const [categoryFilter, setCategoryFilter] = React.useState<number[]>([]);
|
||||||
|
const [statusFilter, setStatusFilter] = React.useState<number[]>([]);
|
||||||
|
const [page, setPage] = React.useState(1);
|
||||||
|
const [totalPage, setTotalPage] = React.useState(1);
|
||||||
|
const table = useReactTable({
|
||||||
|
data: dataTable,
|
||||||
|
columns,
|
||||||
|
onSortingChange: setSorting,
|
||||||
|
onColumnFiltersChange: setColumnFilters,
|
||||||
|
getCoreRowModel: getCoreRowModel(),
|
||||||
|
getPaginationRowModel: getPaginationRowModel(),
|
||||||
|
getSortedRowModel: getSortedRowModel(),
|
||||||
|
getFilteredRowModel: getFilteredRowModel(),
|
||||||
|
onColumnVisibilityChange: setColumnVisibility,
|
||||||
|
onRowSelectionChange: setRowSelection,
|
||||||
|
onPaginationChange: setPagination,
|
||||||
|
state: {
|
||||||
|
sorting,
|
||||||
|
columnFilters,
|
||||||
|
columnVisibility,
|
||||||
|
rowSelection,
|
||||||
|
pagination,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
let typingTimer: any;
|
||||||
|
const doneTypingInterval = 1500;
|
||||||
|
|
||||||
|
const handleKeyUp = () => {
|
||||||
|
clearTimeout(typingTimer);
|
||||||
|
typingTimer = setTimeout(doneTyping, doneTypingInterval);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleKeyDown = () => {
|
||||||
|
clearTimeout(typingTimer);
|
||||||
|
typingTimer = setTimeout(doneTyping, doneTypingInterval);
|
||||||
|
};
|
||||||
|
|
||||||
|
async function doneTyping() {
|
||||||
|
fetchData();
|
||||||
|
}
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
const pageFromUrl = searchParams?.get("page");
|
||||||
|
if (pageFromUrl) {
|
||||||
|
setPage(Number(pageFromUrl));
|
||||||
|
}
|
||||||
|
}, [searchParams]);
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
fetchData();
|
||||||
|
setPagination({
|
||||||
|
pageIndex: 0,
|
||||||
|
pageSize: Number(showData),
|
||||||
|
});
|
||||||
|
}, [page, showData]);
|
||||||
|
|
||||||
|
async function fetchData() {
|
||||||
|
try {
|
||||||
|
loading();
|
||||||
|
const res = await AdministrationUserList(
|
||||||
|
String(levelId),
|
||||||
|
page - 1,
|
||||||
|
search,
|
||||||
|
showData,
|
||||||
|
"1",
|
||||||
|
statusFilter?.sort().join(",")
|
||||||
|
);
|
||||||
|
const data = res?.data?.data;
|
||||||
|
const contentData = data?.content;
|
||||||
|
contentData.forEach((item: any, index: number) => {
|
||||||
|
item.no = (page - 1) * Number(showData) + index + 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("contentData : ", contentData);
|
||||||
|
|
||||||
|
setDataTable(contentData);
|
||||||
|
setTotalData(data?.totalElements);
|
||||||
|
setTotalPage(data?.totalPages);
|
||||||
|
close();
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error fetching tasks:", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleChange = (type: string, id: number, checked: boolean) => {
|
||||||
|
if (type === "category") {
|
||||||
|
if (checked) {
|
||||||
|
const temp: number[] = [...categoryFilter];
|
||||||
|
temp.push(id);
|
||||||
|
setCategoryFilter(temp);
|
||||||
|
} else {
|
||||||
|
const temp = categoryFilter.filter((a) => a !== id);
|
||||||
|
setCategoryFilter(temp);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (checked) {
|
||||||
|
const temp: number[] = [...statusFilter];
|
||||||
|
temp.push(id);
|
||||||
|
setStatusFilter(temp);
|
||||||
|
} else {
|
||||||
|
const temp = statusFilter.filter((a) => a !== id);
|
||||||
|
setStatusFilter(temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="flex justify-between py-3">
|
||||||
|
<p className="text-lg">Data User Internal</p>
|
||||||
|
<Link href="/admin/management-user/internal/create">
|
||||||
|
{" "}
|
||||||
|
<Button color="primary" size="md">
|
||||||
|
<PlusIcon />
|
||||||
|
Add User
|
||||||
|
</Button>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
<div className="flex justify-between py-3">
|
||||||
|
<Input
|
||||||
|
type="text"
|
||||||
|
placeholder="Search"
|
||||||
|
onKeyUp={handleKeyUp}
|
||||||
|
onKeyDown={handleKeyDown}
|
||||||
|
onChange={(e) => setSearch(e.target.value)}
|
||||||
|
className="max-w-[300px]"
|
||||||
|
/>
|
||||||
|
<div className="flex flex-row gap-2">
|
||||||
|
<DropdownMenu>
|
||||||
|
<DropdownMenuTrigger asChild>
|
||||||
|
<Button size="md" variant="outline">
|
||||||
|
1 - {showData} Data
|
||||||
|
</Button>
|
||||||
|
</DropdownMenuTrigger>
|
||||||
|
<DropdownMenuContent className="w-56 text-sm">
|
||||||
|
<DropdownMenuRadioGroup
|
||||||
|
value={showData}
|
||||||
|
onValueChange={setShowData}
|
||||||
|
>
|
||||||
|
<DropdownMenuRadioItem value="10">
|
||||||
|
1 - 10 Data
|
||||||
|
</DropdownMenuRadioItem>
|
||||||
|
<DropdownMenuRadioItem value="20">
|
||||||
|
1 - 20 Data
|
||||||
|
</DropdownMenuRadioItem>
|
||||||
|
<DropdownMenuRadioItem value="25">
|
||||||
|
1 - 25 Data
|
||||||
|
</DropdownMenuRadioItem>
|
||||||
|
<DropdownMenuRadioItem value="50">
|
||||||
|
1 - 50 Data
|
||||||
|
</DropdownMenuRadioItem>
|
||||||
|
</DropdownMenuRadioGroup>
|
||||||
|
</DropdownMenuContent>
|
||||||
|
</DropdownMenu>
|
||||||
|
<Popover>
|
||||||
|
<PopoverTrigger asChild>
|
||||||
|
<Button size="md" variant="outline">
|
||||||
|
Filter
|
||||||
|
</Button>
|
||||||
|
</PopoverTrigger>
|
||||||
|
<PopoverContent className="w-80 ">
|
||||||
|
<div className="flex flex-col gap-2 px-2">
|
||||||
|
<div className="flex justify-between text-sm">
|
||||||
|
<p>Filter</p>
|
||||||
|
<a
|
||||||
|
onClick={() => fetchData()}
|
||||||
|
className="cursor-pointer text-primary"
|
||||||
|
>
|
||||||
|
Simpan
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-col gap-1 overflow-auto max-h-[300px] text-xs custom-scrollbar-table">
|
||||||
|
<p>Admin</p>
|
||||||
|
<div className="flex items-center space-x-2">
|
||||||
|
<Checkbox
|
||||||
|
id="accepted"
|
||||||
|
checked={statusFilter.includes(3)}
|
||||||
|
onCheckedChange={(e) =>
|
||||||
|
handleChange("status", 3, Boolean(e))
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<label
|
||||||
|
htmlFor="accepted"
|
||||||
|
className="text-xs font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
||||||
|
>
|
||||||
|
Approver
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center space-x-2">
|
||||||
|
<Checkbox
|
||||||
|
id="accepted"
|
||||||
|
checked={statusFilter.includes(4)}
|
||||||
|
onCheckedChange={(e) =>
|
||||||
|
handleChange("status", 4, Boolean(e))
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<label
|
||||||
|
htmlFor="accepted"
|
||||||
|
className="text-xs font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
||||||
|
>
|
||||||
|
Kontributor
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<p className="mt-3">Kurator</p>
|
||||||
|
<div className="flex items-center space-x-2">
|
||||||
|
<Checkbox
|
||||||
|
id="accepted"
|
||||||
|
checked={statusFilter.includes(11)}
|
||||||
|
onCheckedChange={(e) =>
|
||||||
|
handleChange("status", 11, Boolean(e))
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<label
|
||||||
|
htmlFor="accepted"
|
||||||
|
className="text-xs font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
||||||
|
>
|
||||||
|
Koordinator
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center space-x-2">
|
||||||
|
<Checkbox
|
||||||
|
id="accepted"
|
||||||
|
checked={statusFilter.includes(12)}
|
||||||
|
onCheckedChange={(e) =>
|
||||||
|
handleChange("status", 12, Boolean(e))
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<label
|
||||||
|
htmlFor="accepted"
|
||||||
|
className="text-xs font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
||||||
|
>
|
||||||
|
Kurator
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<p className="mt-3">Feedback Center</p>
|
||||||
|
<div className="flex items-center space-x-2">
|
||||||
|
<Checkbox
|
||||||
|
id="accepted"
|
||||||
|
checked={statusFilter.includes(9)}
|
||||||
|
onCheckedChange={(e) =>
|
||||||
|
handleChange("status", 9, Boolean(e))
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<label
|
||||||
|
htmlFor="accepted"
|
||||||
|
className="text-xs font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
||||||
|
>
|
||||||
|
Supervisor
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center space-x-2">
|
||||||
|
<Checkbox
|
||||||
|
id="accepted"
|
||||||
|
checked={statusFilter.includes(10)}
|
||||||
|
onCheckedChange={(e) =>
|
||||||
|
handleChange("status", 10, Boolean(e))
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<label
|
||||||
|
htmlFor="accepted"
|
||||||
|
className="text-xs font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
||||||
|
>
|
||||||
|
Operator
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</PopoverContent>
|
||||||
|
</Popover>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Table className="overflow-hidden">
|
||||||
|
<TableHeader>
|
||||||
|
{table.getHeaderGroups().map((headerGroup) => (
|
||||||
|
<TableRow key={headerGroup.id} className="bg-default-200">
|
||||||
|
{headerGroup.headers.map((header) => (
|
||||||
|
<TableHead key={header.id}>
|
||||||
|
{header.isPlaceholder
|
||||||
|
? null
|
||||||
|
: flexRender(
|
||||||
|
header.column.columnDef.header,
|
||||||
|
header.getContext()
|
||||||
|
)}
|
||||||
|
</TableHead>
|
||||||
|
))}
|
||||||
|
</TableRow>
|
||||||
|
))}
|
||||||
|
</TableHeader>
|
||||||
|
<TableBody>
|
||||||
|
{table.getRowModel().rows?.length ? (
|
||||||
|
table.getRowModel().rows.map((row) => (
|
||||||
|
<TableRow
|
||||||
|
key={row.id}
|
||||||
|
data-state={row.getIsSelected() && "selected"}
|
||||||
|
className="h-[75px]"
|
||||||
|
>
|
||||||
|
{row.getVisibleCells().map((cell) => (
|
||||||
|
<TableCell key={cell.id}>
|
||||||
|
{flexRender(cell.column.columnDef.cell, cell.getContext())}
|
||||||
|
</TableCell>
|
||||||
|
))}
|
||||||
|
</TableRow>
|
||||||
|
))
|
||||||
|
) : (
|
||||||
|
<TableRow>
|
||||||
|
<TableCell colSpan={columns.length} className="h-24 text-center">
|
||||||
|
No results.
|
||||||
|
</TableCell>
|
||||||
|
</TableRow>
|
||||||
|
)}
|
||||||
|
</TableBody>
|
||||||
|
</Table>
|
||||||
|
<TablePagination
|
||||||
|
table={table}
|
||||||
|
totalData={totalData}
|
||||||
|
totalPage={totalPage}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default UserInternalTable;
|
||||||
|
|
@ -0,0 +1,80 @@
|
||||||
|
"use client";
|
||||||
|
import Cookies from "js-cookie";
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
|
import { getCookiesDecrypt } from "@/lib/utils";
|
||||||
|
import { generateTicket } from "@/service/tableau/tableau-service";
|
||||||
|
import { Button } from "../ui/button";
|
||||||
|
import { useTranslations } from "next-intl";
|
||||||
|
|
||||||
|
export default function ManagementUserVisualization() {
|
||||||
|
const [ticket, setTicket] = useState("");
|
||||||
|
const baseUrl = "https://db-mediahub.polri.go.id/";
|
||||||
|
const url = "https://db-mediahub.polri.go.id/trusted/";
|
||||||
|
const view = "views/2022_05_MediaHUB-Viz_Rev110/db-user-count?:iid=5&";
|
||||||
|
const param = ":embed=yes&:toolbar=yes&:iframeSizedToWindow=true";
|
||||||
|
const [isInternational, setIsInternational] = useState(false);
|
||||||
|
const t = useTranslations("AnalyticsDashboard");
|
||||||
|
|
||||||
|
const userId = getCookiesDecrypt("uie");
|
||||||
|
useEffect(() => {
|
||||||
|
const initState = async () => {
|
||||||
|
const response = await generateTicket();
|
||||||
|
console.log("Data :", response?.data?.data);
|
||||||
|
setTicket(response?.data?.data);
|
||||||
|
console.log(userId);
|
||||||
|
};
|
||||||
|
|
||||||
|
initState();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="flex flex-col gap-2 bg-white rounded-lg p-3">
|
||||||
|
{isInternational ? (
|
||||||
|
<p className="font-semibold">STATISTICS TO THE NUMBER OF USERS</p>
|
||||||
|
) : (
|
||||||
|
<p className="font-semibold">STATISTIK JUMLAH PENGGUNA</p>
|
||||||
|
)}
|
||||||
|
<div className="flex flex-col gap-1">
|
||||||
|
<p>{t("choose_category")}</p>
|
||||||
|
<div className="flex flex-row gap-1 border-2 w-fit">
|
||||||
|
<Button
|
||||||
|
onClick={() => setIsInternational(false)}
|
||||||
|
className={` hover:text-white rounded-none
|
||||||
|
${
|
||||||
|
isInternational
|
||||||
|
? "bg-white text-black "
|
||||||
|
: "bg-black text-white "
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
Indonesia
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
onClick={() => setIsInternational(true)}
|
||||||
|
className={`hover:text-white rounded-none ${
|
||||||
|
isInternational ? "bg-black text-white " : "bg-white text-black "
|
||||||
|
}
|
||||||
|
`}
|
||||||
|
>
|
||||||
|
{t("international")}
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{ticket == undefined ? (
|
||||||
|
<iframe
|
||||||
|
src={`${baseUrl + view + param}`}
|
||||||
|
width="100%"
|
||||||
|
height="750"
|
||||||
|
frameBorder="0"
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<iframe
|
||||||
|
src={`${`${url + ticket}/${view}${param}`}`}
|
||||||
|
width="100%"
|
||||||
|
height="750"
|
||||||
|
frameBorder="0"
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -9,6 +9,7 @@
|
||||||
"lint": "next lint"
|
"lint": "next lint"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@ckeditor/ckeditor5-react": "^6.2.0",
|
||||||
"@dnd-kit/core": "^6.1.0",
|
"@dnd-kit/core": "^6.1.0",
|
||||||
"@dnd-kit/modifiers": "^7.0.0",
|
"@dnd-kit/modifiers": "^7.0.0",
|
||||||
"@dnd-kit/sortable": "^8.0.0",
|
"@dnd-kit/sortable": "^8.0.0",
|
||||||
|
|
@ -67,6 +68,7 @@
|
||||||
"apexcharts": "^3.49.2",
|
"apexcharts": "^3.49.2",
|
||||||
"axios": "^1.7.8",
|
"axios": "^1.7.8",
|
||||||
"chart.js": "^4.4.3",
|
"chart.js": "^4.4.3",
|
||||||
|
"ckeditor5-custom-build": "file:vendor/ckeditor5",
|
||||||
"class-variance-authority": "^0.7.0",
|
"class-variance-authority": "^0.7.0",
|
||||||
"cleave.js": "^1.6.0",
|
"cleave.js": "^1.6.0",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
|
|
@ -113,6 +115,7 @@
|
||||||
"react-icons": "^5.3.0",
|
"react-icons": "^5.3.0",
|
||||||
"react-leaflet": "^4.2.1",
|
"react-leaflet": "^4.2.1",
|
||||||
"react-loading-skeleton": "^3.5.0",
|
"react-loading-skeleton": "^3.5.0",
|
||||||
|
"react-password-checklist": "^1.8.1",
|
||||||
"react-player": "^2.16.0",
|
"react-player": "^2.16.0",
|
||||||
"react-quill": "^0.0.2",
|
"react-quill": "^0.0.2",
|
||||||
"react-resizable-panels": "^2.0.19",
|
"react-resizable-panels": "^2.0.19",
|
||||||
|
|
@ -132,8 +135,6 @@
|
||||||
"tailwind-merge": "^2.5.5",
|
"tailwind-merge": "^2.5.5",
|
||||||
"tailwindcss-animate": "^1.0.7",
|
"tailwindcss-animate": "^1.0.7",
|
||||||
"tus-js-client": "^4.2.3",
|
"tus-js-client": "^4.2.3",
|
||||||
"@ckeditor/ckeditor5-react": "^6.2.0",
|
|
||||||
"ckeditor5-custom-build": "file:vendor/ckeditor5",
|
|
||||||
"use-places-autocomplete": "^4.0.1",
|
"use-places-autocomplete": "^4.0.1",
|
||||||
"vaul": "^0.9.1",
|
"vaul": "^0.9.1",
|
||||||
"yup": "^1.6.1",
|
"yup": "^1.6.1",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
import {
|
||||||
|
httpDeleteInterceptor,
|
||||||
|
httpGetInterceptor,
|
||||||
|
httpPostInterceptor,
|
||||||
|
} from "../http-config/http-interceptor-service";
|
||||||
|
|
||||||
|
export async function AdministrationUserList(
|
||||||
|
id: string,
|
||||||
|
page: number,
|
||||||
|
name = "",
|
||||||
|
size: string,
|
||||||
|
featureId: string,
|
||||||
|
role = ""
|
||||||
|
) {
|
||||||
|
const url = `users/pagination/internal?enablePage=1&size=${size}&page=${page}&levelId=${id}&name=${name}&featureId=${featureId}&roleFilter=${role}`;
|
||||||
|
return httpGetInterceptor(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function AdministrationLevelList() {
|
||||||
|
const url = "users/user-levels/list";
|
||||||
|
return httpGetInterceptor(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getListEducation() {
|
||||||
|
const url = "users/user-educations/list";
|
||||||
|
return httpGetInterceptor(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getListSchools() {
|
||||||
|
const url = "users/user-schools/list";
|
||||||
|
return httpGetInterceptor(url);
|
||||||
|
}
|
||||||
|
export async function getListCompetencies() {
|
||||||
|
const url = "users/user-competencies/list";
|
||||||
|
return httpGetInterceptor(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function saveUserInternal(data: any) {
|
||||||
|
const url = "users/save";
|
||||||
|
return httpPostInterceptor(url, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getUserById(id: string) {
|
||||||
|
const url = `users?id=${id}`;
|
||||||
|
return httpGetInterceptor(url);
|
||||||
|
}
|
||||||
|
|
@ -1,162 +0,0 @@
|
||||||
Changelog
|
|
||||||
=========
|
|
||||||
|
|
||||||
All changes in the package are documented in the main repository. See: https://github.com/ckeditor/ckeditor5/blob/master/CHANGELOG.md.
|
|
||||||
|
|
||||||
Changes for the past releases are available below.
|
|
||||||
|
|
||||||
## [19.0.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v18.0.0...v19.0.0) (April 29, 2020)
|
|
||||||
|
|
||||||
Internal changes only (updated dependencies, documentation, etc.).
|
|
||||||
|
|
||||||
|
|
||||||
## [18.0.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v17.0.0...v18.0.0) (March 19, 2020)
|
|
||||||
|
|
||||||
### Other changes
|
|
||||||
|
|
||||||
* Updated translations. ([f1beaaa](https://github.com/ckeditor/ckeditor5-alignment/commit/f1beaaa))
|
|
||||||
|
|
||||||
|
|
||||||
## [17.0.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v16.0.0...v17.0.0) (February 18, 2020)
|
|
||||||
|
|
||||||
### MAJOR BREAKING CHANGES
|
|
||||||
|
|
||||||
* The `align-left`, `align-right`, `align-center`, and `align-justify` icons have been moved to `@ckeditor/ckeditor5-core`.
|
|
||||||
|
|
||||||
### Other changes
|
|
||||||
|
|
||||||
* Moved alignment icons to `@ckeditor/ckeditor5-core` (see [ckeditor/ckeditor5-table#227](https://github.com/ckeditor/ckeditor5-table/issues/227)). ([410e279](https://github.com/ckeditor/ckeditor5-alignment/commit/410e279))
|
|
||||||
* Updated translations. ([288672f](https://github.com/ckeditor/ckeditor5-alignment/commit/288672f))
|
|
||||||
|
|
||||||
|
|
||||||
## [16.0.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v15.0.0...v16.0.0) (December 4, 2019)
|
|
||||||
|
|
||||||
### Other changes
|
|
||||||
|
|
||||||
* Updated translations. ([9085f7b](https://github.com/ckeditor/ckeditor5-alignment/commit/9085f7b))
|
|
||||||
|
|
||||||
|
|
||||||
## [15.0.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v11.2.0...v15.0.0) (October 23, 2019)
|
|
||||||
|
|
||||||
### Other changes
|
|
||||||
|
|
||||||
* Updated translations. ([a719974](https://github.com/ckeditor/ckeditor5-alignment/commit/a719974)) ([2fed077](https://github.com/ckeditor/ckeditor5-alignment/commit/2fed077))
|
|
||||||
* Added `pluginName` to the editor plugin part of the feature. ([3b42798](https://github.com/ckeditor/ckeditor5-alignment/commit/3b42798))
|
|
||||||
|
|
||||||
|
|
||||||
## [11.2.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v11.1.3...v11.2.0) (August 26, 2019)
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* Integrated the text alignment feature with different editor content directions (LTR and RTL). See [ckeditor/ckeditor5#1151](https://github.com/ckeditor/ckeditor5/issues/1151). ([edc7d8b](https://github.com/ckeditor/ckeditor5-alignment/commit/edc7d8b))
|
|
||||||
|
|
||||||
### Bug fixes
|
|
||||||
|
|
||||||
* The UI buttons should be marked as toggleable for better assistive technologies support (see [ckeditor/ckeditor5#1403](https://github.com/ckeditor/ckeditor5/issues/1403)). ([599ea01](https://github.com/ckeditor/ckeditor5-alignment/commit/599ea01))
|
|
||||||
|
|
||||||
### Other changes
|
|
||||||
|
|
||||||
* The issue tracker for this package was moved to https://github.com/ckeditor/ckeditor5/issues. See [ckeditor/ckeditor5#1988](https://github.com/ckeditor/ckeditor5/issues/1988). ([54f81b3](https://github.com/ckeditor/ckeditor5-alignment/commit/54f81b3))
|
|
||||||
* The text alignment toolbar should have a proper `aria-label` attribute (see [ckeditor/ckeditor5#1404](https://github.com/ckeditor/ckeditor5/issues/1404)). ([3ed81de](https://github.com/ckeditor/ckeditor5-alignment/commit/3ed81de))
|
|
||||||
* Updated translations. ([feb4ab3](https://github.com/ckeditor/ckeditor5-alignment/commit/feb4ab3))
|
|
||||||
|
|
||||||
|
|
||||||
## [11.1.3](https://github.com/ckeditor/ckeditor5-alignment/compare/v11.1.2...v11.1.3) (July 10, 2019)
|
|
||||||
|
|
||||||
Internal changes only (updated dependencies, documentation, etc.).
|
|
||||||
|
|
||||||
|
|
||||||
## [11.1.2](https://github.com/ckeditor/ckeditor5-alignment/compare/v11.1.1...v11.1.2) (July 4, 2019)
|
|
||||||
|
|
||||||
### Other changes
|
|
||||||
|
|
||||||
* Updated translations. ([bb7f494](https://github.com/ckeditor/ckeditor5-alignment/commit/bb7f494))
|
|
||||||
|
|
||||||
|
|
||||||
## [11.1.1](https://github.com/ckeditor/ckeditor5-alignment/compare/v11.1.0...v11.1.1) (June 6, 2019)
|
|
||||||
|
|
||||||
### Other changes
|
|
||||||
|
|
||||||
* Updated translations. ([32c32c1](https://github.com/ckeditor/ckeditor5-alignment/commit/32c32c1))
|
|
||||||
|
|
||||||
|
|
||||||
## [11.1.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v11.0.0...v11.1.0) (April 4, 2019)
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* Marked alignment as a formatting attribute using the `AttributeProperties#isFormatting` property. Closes [ckeditor/ckeditor5#1664](https://github.com/ckeditor/ckeditor5/issues/1664). ([6358e08](https://github.com/ckeditor/ckeditor5-alignment/commit/6358e08))
|
|
||||||
|
|
||||||
### Other changes
|
|
||||||
|
|
||||||
* Updated translations. ([78bfc40](https://github.com/ckeditor/ckeditor5-alignment/commit/78bfc40))
|
|
||||||
|
|
||||||
|
|
||||||
## [11.0.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v10.0.4...v11.0.0) (February 28, 2019)
|
|
||||||
|
|
||||||
### Other changes
|
|
||||||
|
|
||||||
* Updated translations. ([45e8dd5](https://github.com/ckeditor/ckeditor5-alignment/commit/45e8dd5)) ([a92c37b](https://github.com/ckeditor/ckeditor5-alignment/commit/a92c37b)) ([ef68e54](https://github.com/ckeditor/ckeditor5-alignment/commit/ef68e54))
|
|
||||||
|
|
||||||
### BREAKING CHANGES
|
|
||||||
|
|
||||||
* Upgraded minimal versions of Node to `8.0.0` and npm to `5.7.1`. See: [ckeditor/ckeditor5#1507](https://github.com/ckeditor/ckeditor5/issues/1507). ([612ea3c](https://github.com/ckeditor/ckeditor5-cloud-services/commit/612ea3c))
|
|
||||||
|
|
||||||
|
|
||||||
## [10.0.4](https://github.com/ckeditor/ckeditor5-alignment/compare/v10.0.3...v10.0.4) (December 5, 2018)
|
|
||||||
|
|
||||||
### Other changes
|
|
||||||
|
|
||||||
* Improved SVG icons size. See [ckeditor/ckeditor5-theme-lark#206](https://github.com/ckeditor/ckeditor5-theme-lark/issues/206). ([1d71d33](https://github.com/ckeditor/ckeditor5-alignment/commit/1d71d33))
|
|
||||||
* Updated translations. ([547f8d8](https://github.com/ckeditor/ckeditor5-alignment/commit/547f8d8)) ([43d8225](https://github.com/ckeditor/ckeditor5-alignment/commit/43d8225))
|
|
||||||
|
|
||||||
|
|
||||||
## [10.0.3](https://github.com/ckeditor/ckeditor5-alignment/compare/v10.0.2...v10.0.3) (October 8, 2018)
|
|
||||||
|
|
||||||
### Other changes
|
|
||||||
|
|
||||||
* Updated translations. ([5b30202](https://github.com/ckeditor/ckeditor5-alignment/commit/5b30202))
|
|
||||||
|
|
||||||
|
|
||||||
## [10.0.2](https://github.com/ckeditor/ckeditor5-alignment/compare/v10.0.1...v10.0.2) (July 18, 2018)
|
|
||||||
|
|
||||||
### Other changes
|
|
||||||
|
|
||||||
* Updated translations. ([33c281c](https://github.com/ckeditor/ckeditor5-alignment/commit/33c281c))
|
|
||||||
|
|
||||||
|
|
||||||
## [10.0.1](https://github.com/ckeditor/ckeditor5-alignment/compare/v10.0.0...v10.0.1) (June 21, 2018)
|
|
||||||
|
|
||||||
### Other changes
|
|
||||||
|
|
||||||
* Updated translations.
|
|
||||||
|
|
||||||
|
|
||||||
## [10.0.0](https://github.com/ckeditor/ckeditor5-alignment/compare/v1.0.0-beta.4...v10.0.0) (April 25, 2018)
|
|
||||||
|
|
||||||
### Other changes
|
|
||||||
|
|
||||||
* Changed the license to GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991). ([eed1029](https://github.com/ckeditor/ckeditor5-alignment/commit/eed1029))
|
|
||||||
* Updated translations. ([baa1fbe](https://github.com/ckeditor/ckeditor5-alignment/commit/baa1fbe))
|
|
||||||
|
|
||||||
### BREAKING CHANGES
|
|
||||||
|
|
||||||
* The license under which CKEditor 5 is released has been changed from a triple GPL, LGPL and MPL license to a GPL2+ only. See [ckeditor/ckeditor5#991](https://github.com/ckeditor/ckeditor5/issues/991) for more information.
|
|
||||||
|
|
||||||
|
|
||||||
## [1.0.0-beta.4](https://github.com/ckeditor/ckeditor5-alignment/compare/v1.0.0-beta.2...v1.0.0-beta.4) (April 19, 2018)
|
|
||||||
|
|
||||||
### Other changes
|
|
||||||
|
|
||||||
* Updated translations. ([586ae62](https://github.com/ckeditor/ckeditor5-alignment/commit/586ae62))
|
|
||||||
|
|
||||||
|
|
||||||
## [1.0.0-beta.2](https://github.com/ckeditor/ckeditor5-alignment/compare/v1.0.0-beta.1...v1.0.0-beta.2) (April 10, 2018)
|
|
||||||
|
|
||||||
Internal changes only (updated dependencies, documentation, etc.).
|
|
||||||
|
|
||||||
|
|
||||||
## [1.0.0-beta.1](https://github.com/ckeditor/ckeditor5-alignment/compare/v0.0.1...v1.0.0-beta.1) (March 15, 2018)
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* Initial implementation. Closes [#2](https://github.com/ckeditor/ckeditor5-alignment/issues/2).
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
Software License Agreement
|
|
||||||
==========================
|
|
||||||
|
|
||||||
**CKEditor 5 text alignment feature** – https://github.com/ckeditor/ckeditor5-alignment <br>
|
|
||||||
Copyright (c) 2003–2024, [CKSource Holding sp. z o.o.](https://cksource.com) All rights reserved.
|
|
||||||
|
|
||||||
Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html).
|
|
||||||
|
|
||||||
Sources of Intellectual Property Included in CKEditor
|
|
||||||
-----------------------------------------------------
|
|
||||||
|
|
||||||
Where not otherwise indicated, all CKEditor content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, CKEditor will incorporate work done by developers outside of CKSource with their express permission.
|
|
||||||
|
|
||||||
Trademarks
|
|
||||||
----------
|
|
||||||
|
|
||||||
**CKEditor** is a trademark of [CKSource Holding sp. z o.o.](https://cksource.com) All other brand and product names are trademarks, registered trademarks, or service marks of their respective holders.
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
CKEditor 5 text alignment feature
|
|
||||||
========================================
|
|
||||||
|
|
||||||
[](https://www.npmjs.com/package/@ckeditor/ckeditor5-alignment)
|
|
||||||
[](https://coveralls.io/github/ckeditor/ckeditor5?branch=master)
|
|
||||||
[](https://app.travis-ci.com/github/ckeditor/ckeditor5)
|
|
||||||
|
|
||||||
This package implements text alignment support for CKEditor 5.
|
|
||||||
|
|
||||||
## Demo
|
|
||||||
|
|
||||||
Check out the [demo in the text alignment feature guide](https://ckeditor.com/docs/ckeditor5/latest/features/text-alignment.html#demo).
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
See the [`@ckeditor/ckeditor5-alignment` package](https://ckeditor.com/docs/ckeditor5/latest/api/alignment.html) page in [CKEditor 5 documentation](https://ckeditor.com/docs/ckeditor5/latest/).
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
Licensed under the terms of [GNU General Public License Version 2 or later](http://www.gnu.org/licenses/gpl.html). For full details about the license, please check the `LICENSE.md` file or [https://ckeditor.com/legal/ckeditor-oss-license](https://ckeditor.com/legal/ckeditor-oss-license).
|
|
||||||
File diff suppressed because one or more lines are too long
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/af.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/af.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const e=n.af=n.af||{};e.dictionary=Object.assign(e.dictionary||{},{"Align center":"Belyn in die middel","Align left":"Belyn links","Align right":"Belyn regs",Justify:"Belyn beide kante","Text alignment":"Teksbelyning","Text alignment toolbar":"Teksbelyning nutsbank"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ar.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ar.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.ar=n.ar||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"محاذاة في المنتصف","Align left":"محاذاة لليسار","Align right":"محاذاة لليمين",Justify:"ضبط","Text alignment":"محاذاة النص","Text alignment toolbar":"شريط أدوات محاذاة النص"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/az.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/az.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.az=n.az||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Mərkəzə düzləndir","Align left":"Soldan düzləndir","Align right":"Sağdan düzləndir",Justify:"Eninə görə","Text alignment":"Mətn düzləndirməsi","Text alignment toolbar":"Mətnin düzləndirmə paneli"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/bg.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/bg.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.bg=n.bg||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Централно подравняване","Align left":"Ляво подравняване","Align right":"Дясно подравняване",Justify:"Разпредели по равно","Text alignment":"Подравняване на текста","Text alignment toolbar":"Лента за подравняване на текст"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/bn.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/bn.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.bn=n.bn||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"কেন্দ্র সারিবদ্ধ করুন","Align left":"বামে সারিবদ্ধ করুন","Align right":"ডানদিকে সারিবদ্ধ করুন",Justify:"জাস্টিফাই","Text alignment":"টেক্সট সারিবদ্ধকরণ","Text alignment toolbar":"টেক্সট শ্রেণীবিন্যাস টুলবার"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/bs.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/bs.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const a=n.bs=n.bs||{};a.dictionary=Object.assign(a.dictionary||{},{"Align center":"Centrirati","Align left":"Lijevo poravnanje","Align right":"Desno poravnanje",Justify:"","Text alignment":"Poravnanje teksta","Text alignment toolbar":"Traka za poravnanje teksta"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ca.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ca.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(i){const e=i.ca=i.ca||{};e.dictionary=Object.assign(e.dictionary||{},{"Align center":"Alineació centre","Align left":"Alineació esquerra","Align right":"Alineació dreta",Justify:"Justificar","Text alignment":"Alineació text","Text alignment toolbar":"Barra d'eines d'alineació de text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/cs.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/cs.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const t=n.cs=n.cs||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Zarovnat na střed","Align left":"Zarovnat vlevo","Align right":"Zarovnat vpravo",Justify:"Zarovnat do bloku","Text alignment":"Zarovnání textu","Text alignment toolbar":"Panel nástrojů zarovnání textu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/da.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/da.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(t){const n=t.da=t.da||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Justér center","Align left":"Justér venstre","Align right":"Justér højre",Justify:"Justér","Text alignment":"Tekstjustering","Text alignment toolbar":"Tekstjustering værktøjslinje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
!function(t){const i=t["de-ch"]=t["de-ch"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Zentriert","Align left":"Linksbündig","Align right":"Rechtsbündig",Justify:"Blocksatz","Text alignment":"Textausrichtung","Text alignment toolbar":"Textausrichtung Werkzeugleiste"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/de.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/de.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const t=n.de=n.de||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Zentriert","Align left":"Linksbündig","Align right":"Rechtsbündig",Justify:"Blocksatz","Text alignment":"Textausrichtung","Text alignment toolbar":"Text-Ausrichtung Toolbar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/el.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/el.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.el=n.el||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Στοίχιση στο κέντρο","Align left":"Στοίχιση αριστερά","Align right":"Στοίχιση δεξιά",Justify:"Πλήρης στοίχηση","Text alignment":"Στοίχιση κειμένου","Text alignment toolbar":"Γραμμή εργαλείων στοίχισης κειμένου"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const t=n["en-au"]=n["en-au"]||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Align centre","Align left":"Align left","Align right":"Align right",Justify:"Justify","Text alignment":"Text alignment","Text alignment toolbar":"Text alignment toolbar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n["en-gb"]=n["en-gb"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Align center","Align left":"Align left","Align right":"Align right",Justify:"Justify","Text alignment":"Text alignment","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
!function(i){const e=i["es-co"]=i["es-co"]||{};e.dictionary=Object.assign(e.dictionary||{},{"Align center":"Centrar","Align left":"Alinear a la izquierda","Align right":"Alinear a la derecha",Justify:"Justificar","Text alignment":"Alineación de texto","Text alignment toolbar":"Herramientas de alineación de texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/es.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/es.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(e){const i=e.es=e.es||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Centrar","Align left":"Alinear a la izquierda","Align right":"Alinear a la derecha",Justify:"Justificar","Text alignment":"Alineación del texto","Text alignment toolbar":"Barra de herramientas de alineación del texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/et.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/et.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.et=n.et||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Keskjoondus","Align left":"Vasakjoondus","Align right":"Paremjoondus",Justify:"Rööpjoondus","Text alignment":"Teksti joondamine","Text alignment toolbar":"Teksti joonduse tööriistariba"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/fa.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/fa.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.fa=n.fa||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"تراز وسط","Align left":"تراز چپ","Align right":"تراز راست",Justify:"هم تراز کردن","Text alignment":"تراز متن","Text alignment toolbar":"نوار ابزار ترازبندی متن"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/fi.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/fi.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(a){const i=a.fi=a.fi||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Tasaa keskelle","Align left":"Tasaa vasemmalle","Align right":"Tasaa oikealle",Justify:"Tasaa molemmat reunat","Text alignment":"Tekstin tasaus","Text alignment toolbar":"Tekstin suuntauksen työkalupalkki"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/fr.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/fr.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(e){const t=e.fr=e.fr||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Centrer","Align left":"Aligner à gauche","Align right":"Aligner à droite",Justify:"Justifier","Text alignment":"Alignement du texte","Text alignment toolbar":"Barre d'outils d'alignement du texte"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/gl.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/gl.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(t){const e=t.gl=t.gl||{};e.dictionary=Object.assign(e.dictionary||{},{"Align center":"Centrar horizontalmente","Align left":"Aliñar á esquerda","Align right":"Aliñar á dereita",Justify:"Xustificado","Text alignment":"Aliñamento do texto","Text alignment toolbar":"Barra de ferramentas de aliñamento de textos"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/he.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/he.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.he=n.he||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"יישור באמצע","Align left":"יישור לשמאל","Align right":"יישור לימין",Justify:"מרכוז גבולות","Text alignment":"יישור טקסט","Text alignment toolbar":"סרגל כלים יישור טקסט"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/hi.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/hi.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(i){const n=i.hi=i.hi||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Align center","Align left":"Align left","Align right":"Align right",Justify:"Justify","Text alignment":"Text alignment","Text alignment toolbar":"Text alignment toolbar"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/hr.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/hr.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const a=n.hr=n.hr||{};a.dictionary=Object.assign(a.dictionary||{},{"Align center":"Poravnaj po sredini","Align left":"Poravnaj ulijevo","Align right":"Poravnaj udesno",Justify:"Razvuci","Text alignment":"Poravnanje teksta","Text alignment toolbar":"Traka za poravnanje"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/hu.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/hu.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(i){const t=i.hu=i.hu||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Középre igazítás","Align left":"Balra igazítás","Align right":"Jobbra igazítás",Justify:"Sorkizárt","Text alignment":"Szöveg igazítása","Text alignment toolbar":"Szöveg igazítás eszköztár"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/id.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/id.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(a){const t=a.id=a.id||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Rata tengah","Align left":"Rata kiri","Align right":"Rata kanan",Justify:"Rata kanan-kiri","Text alignment":"Perataan teks","Text alignment toolbar":"Alat perataan teks"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/it.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/it.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(i){const n=i.it=i.it||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Allinea al centro","Align left":"Allinea a sinistra","Align right":"Allinea a destra",Justify:"Giustifica","Text alignment":"Allineamento del testo","Text alignment toolbar":"Barra degli strumenti dell'allineamento"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ja.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ja.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.ja=n.ja||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"中央揃え","Align left":"左揃え","Align right":"右揃え",Justify:"両端揃え","Text alignment":"文字揃え","Text alignment toolbar":"テキストの整列"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/jv.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/jv.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const t=n.jv=n.jv||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Rata tengah","Align left":"Rata kiwa","Align right":"Rata tengen",Justify:"Rata kiwa tengen","Text alignment":"Perataan seratan","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/kk.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/kk.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.kk=n.kk||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Ортадан туралау","Align left":"Солға туралау","Align right":"Оңға туралау",Justify:"","Text alignment":"Мәтінді туралау","Text alignment toolbar":"Мәтінді туралау құралдар тақтасы"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/km.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/km.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.km=n.km||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"តម្រឹមកណ្ដាល","Align left":"តម្រឹមឆ្វេង","Align right":"តម្រឹមស្ដាំ",Justify:"តម្រឹមសងខាង","Text alignment":"ការតម្រឹមអក្សរ","Text alignment toolbar":"របារឧបករណ៍តម្រឹមអក្សរ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ko.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ko.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.ko=n.ko||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"가운데 정렬","Align left":"왼쪽 정렬","Align right":"오른쪽 정렬",Justify:"양쪽 정렬","Text alignment":"텍스트 정렬","Text alignment toolbar":"텍스트 정렬 툴바"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ku.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ku.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.ku=n.ku||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"بەهێڵکردنی ناورەڕاست","Align left":"بەهێڵکردنی چەپ","Align right":"بەهێڵکردنی ڕاست",Justify:"هاوستوونی","Text alignment":"ڕیززکردنی تێکست","Text alignment toolbar":"تووڵامرازی ڕیززکردنی تێکست"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/lt.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/lt.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(i){const t=i.lt=i.lt||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"Centruoti","Align left":"Lygiuoti į kairę","Align right":"Lygiuoti į dešinę",Justify:"Lygiuoti per visą plotį","Text alignment":"Teksto lygiavimas","Text alignment toolbar":"Teksto lygiavimo įrankių juosta"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/lv.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/lv.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(i){const n=i.lv=i.lv||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Centrēt","Align left":"Pa kreisi","Align right":"Pa labi",Justify:"Izlīdzināt abas malas","Text alignment":"Teksta izlīdzināšana","Text alignment toolbar":"Teksta līdzināšanas rīkjosla"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ms.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ms.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(a){const n=a.ms=a.ms||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Jajarkan tengah","Align left":"Jajarkan kiri","Align right":"Jajarkan kiri",Justify:"Imbang","Text alignment":"Jajaran teks","Text alignment toolbar":"Bar alat capaian jajaran teks"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/nb.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/nb.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(t){const n=t.nb=t.nb||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Midstill","Align left":"Venstrejuster","Align right":"Høyrejuster",Justify:"Blokkjuster","Text alignment":"Tekstjustering","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ne.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ne.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.ne=n.ne||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"केन्द्र पङ्क्तिबद्ध गर्नुहोस्","Align left":"बायाँ पङ्क्तिबद्ध गर्नुहोस्","Align right":"दायाँ पङ्क्तिबद्ध गर्नुहोस्",Justify:"जस्टिफाइ गर्नुहोस्","Text alignment":"पाठ संरेखण","Text alignment toolbar":""})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/nl.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/nl.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(i){const n=i.nl=i.nl||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Midden uitlijnen","Align left":"Links uitlijnen","Align right":"Rechts uitlijnen",Justify:"Volledig uitlijnen","Text alignment":"Tekst uitlijning","Text alignment toolbar":"Tekst uitlijning werkbalk"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/no.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/no.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(t){const n=t.no=t.no||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Midtstill","Align left":"Venstrejuster","Align right":"Høyrejuster",Justify:"Blokkjuster","Text alignment":"Tekstjustering","Text alignment toolbar":"Verktøylinje for tekstjustering"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/pl.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/pl.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.pl=n.pl||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Wyrównaj do środka","Align left":"Wyrównaj do lewej","Align right":"Wyrównaj do prawej",Justify:"Wyrównaj obustronnie","Text alignment":"Wyrównanie tekstu","Text alignment toolbar":"Pasek narzędzi wyrównania tekstu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
!function(t){const i=t["pt-br"]=t["pt-br"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Centralizar","Align left":"Alinhar à esquerda","Align right":"Alinhar à direita",Justify:"Justificar","Text alignment":"Alinhamento do texto","Text alignment toolbar":"Ferramentas de alinhamento de texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/pt.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/pt.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(t){const i=t.pt=t.pt||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Alinhar ao centro","Align left":"Alinhar à esquerda","Align right":"Alinhar à direita",Justify:"Justificar","Text alignment":"Alinhamento de texto","Text alignment toolbar":"Barra de alinhamento de texto"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ro.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ro.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(i){const n=i.ro=i.ro||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Aliniază la centru","Align left":"Aliniază la stânga","Align right":"Aliniază la dreapta",Justify:"Aliniază stânga-dreapta","Text alignment":"Aliniere text","Text alignment toolbar":"Bara aliniere text"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ru.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ru.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.ru=n.ru||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Выравнивание по центру","Align left":"Выравнивание по левому краю","Align right":"Выравнивание по правому краю",Justify:"Выравнивание по ширине","Text alignment":"Выравнивание текста","Text alignment toolbar":"Выравнивание"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/sk.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/sk.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const a=n.sk=n.sk||{};a.dictionary=Object.assign(a.dictionary||{},{"Align center":"Zarovnať na stred","Align left":"Zarovnať vľavo","Align right":"Zarovnať vpravo",Justify:"Do bloku","Text alignment":"Zarovnanie textu","Text alignment toolbar":"Panel nástrojov zarovnania textu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/sl.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/sl.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(a){const n=a.sl=a.sl||{};n.dictionary=Object.assign(n.dictionary||{},{"Align center":"Sredinska poravnava","Align left":"Poravnava levo","Align right":"Poravnava desno",Justify:"Postavi na sredino","Text alignment":"Poravnava besedila","Text alignment toolbar":"Orodna vrstica besedila"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/sq.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/sq.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(t){const i=t.sq=t.sq||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Radhit në mes","Align left":"Radhit majtas","Align right":"Radhit djathtas",Justify:"Plotësim","Text alignment":"Radhitja e tekstit","Text alignment toolbar":"Shiriti i rradhitjes së tekstit"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const a=n["sr-latn"]=n["sr-latn"]||{};a.dictionary=Object.assign(a.dictionary||{},{"Align center":"Centralno ravnanje","Align left":"Levo ravnanje","Align right":"Desno ravnanje",Justify:"Obostrano ravnanje","Text alignment":"Ravnanje teksta","Text alignment toolbar":"Alatke za ravnanje teksta"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/sr.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/sr.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.sr=n.sr||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Централно равнанје","Align left":"Лево равнање","Align right":"Десно равнање",Justify:"Обострано равнање","Text alignment":"Равнање текста","Text alignment toolbar":"Алатке за равнање текста"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/sv.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/sv.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(t){const e=t.sv=t.sv||{};e.dictionary=Object.assign(e.dictionary||{},{"Align center":"Centrera","Align left":"Vänsterjustera","Align right":"Högerjustera",Justify:"Justera till marginaler","Text alignment":"Textjustering","Text alignment toolbar":"Verktygsfält för textjustering"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/th.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/th.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const t=n.th=n.th||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"จัดกึ่งกลาง","Align left":"จัดชิดซ้าย","Align right":"จัดชิดขวา",Justify:"จัด(ขอบ)","Text alignment":"จัดตำแหน่งข้อความ","Text alignment toolbar":"แถบเครื่องมือจัดตำแหน่งข้อความ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/tk.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/tk.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(e){const i=e.tk=e.tk||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Merkeze deňleşdir","Align left":"Çepe deňleşdiriň","Align right":"Saga deňleşdiriň",Justify:"Akla","Text alignment":"Tekstiň deňleşdirilmegi","Text alignment toolbar":"Teksti deňleşdirmek gurallar paneli"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/tr.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/tr.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(a){const i=a.tr=a.tr||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Ortala","Align left":"Sola hizala","Align right":"Sağa hizala",Justify:"İki yana yasla","Text alignment":"Yazı hizalama","Text alignment toolbar":"Yazı Hizlama Araç Çubuğu"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ug.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ug.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.ug=n.ug||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"ئوتتۇرىغا توغرىلاش","Align left":"سولغا توغرىلاش","Align right":"ئوڭغا توغرىلاش",Justify:"ئوڭ سولدىن توغرىلا","Text alignment":"تېكىست توغرىلاش","Text alignment toolbar":"تېكىست توغرىلاش قورالبالدىقى"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/uk.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/uk.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.uk=n.uk||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"По центру","Align left":"По лівому краю","Align right":"По правому краю",Justify:"По ширині","Text alignment":"Вирівнювання тексту","Text alignment toolbar":"Панель інструментів вирівнювання тексту"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ur.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/ur.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.ur=n.ur||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"درمیانی سیدھ","Align left":"بائیں سیدھ","Align right":"دائیں سیدھ",Justify:"برابر سیدھ","Text alignment":"متن کی سیدھ","Text alignment toolbar":"خانہ آلات برائے سیدھ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/uz.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/uz.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(i){const t=i.uz=i.uz||{};t.dictionary=Object.assign(t.dictionary||{},{"Align center":"O'rtada tekislash","Align left":"Chap tomonda tekislash","Align right":"O'ng tomonda tekislash",Justify:"Kengligi bo'yicha tekislash","Text alignment":"Matnni tekislash","Text alignment toolbar":"Tekislash"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/vi.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/vi.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.vi=n.vi||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"Canh giữa","Align left":"Canh trái","Align right":"Canh phải",Justify:"Canh đều","Text alignment":"Căn chỉnh văn bản","Text alignment toolbar":"Thanh công cụ canh chữ"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n["zh-cn"]=n["zh-cn"]||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"居中对齐","Align left":"左对齐","Align right":"右对齐",Justify:"两端对齐","Text alignment":"对齐","Text alignment toolbar":"对齐工具栏"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/zh.js
generated
vendored
1
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/build/translations/zh.js
generated
vendored
|
|
@ -1 +0,0 @@
|
||||||
!function(n){const i=n.zh=n.zh||{};i.dictionary=Object.assign(i.dictionary||{},{"Align center":"置中對齊","Align left":"靠左對齊","Align right":"靠右對齊",Justify:"左右對齊","Text alignment":"文字對齊","Text alignment toolbar":"文字對齊"})}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
|
||||||
31
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/ckeditor5-metadata.json
generated
vendored
31
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/ckeditor5-metadata.json
generated
vendored
|
|
@ -1,31 +0,0 @@
|
||||||
{
|
|
||||||
"plugins": [
|
|
||||||
{
|
|
||||||
"name": "Alignment",
|
|
||||||
"className": "Alignment",
|
|
||||||
"path": "src/alignment.js",
|
|
||||||
"description": "Enables support for text alignment. You can use it to align your content to left, right and center or to justify it.",
|
|
||||||
"docs": "features/text-alignment.html",
|
|
||||||
"uiComponents": [
|
|
||||||
{
|
|
||||||
"type": "SplitButton",
|
|
||||||
"name": "alignment",
|
|
||||||
"iconPath": "@ckeditor/ckeditor5-core/theme/icons/align-left.svg"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"htmlOutput": [
|
|
||||||
{
|
|
||||||
"elements": "$block",
|
|
||||||
"styles": "text-align",
|
|
||||||
"_comment": "By default, the alignment feature uses the `text-align` inline style."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"elements": "$block",
|
|
||||||
"classes": "*",
|
|
||||||
"isAlternative": true,
|
|
||||||
"_comment": "If `config.alignment.options` is set, these classes are used for alignment instead of inline styles."
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
{
|
|
||||||
"Align left": "Toolbar button tooltip for aligning the text to the left.",
|
|
||||||
"Align right": "Toolbar button tooltip for aligning the text to the right.",
|
|
||||||
"Align center": "Toolbar button tooltip for aligning the text to center.",
|
|
||||||
"Justify": "Toolbar button tooltip for making the text justified.",
|
|
||||||
"Text alignment": "Dropdown button tooltip for the text alignment feature.",
|
|
||||||
"Text alignment toolbar": "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
}
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/af.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/af.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language-Team: Afrikaans (https://app.transifex.com/ckeditor/teams/11143/af/)\n"
|
|
||||||
"Language: af\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "Belyn links"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "Belyn regs"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "Belyn in die middel"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr "Belyn beide kante"
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "Teksbelyning"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr "Teksbelyning nutsbank"
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/ar.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/ar.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language-Team: Arabic (https://app.transifex.com/ckeditor/teams/11143/ar/)\n"
|
|
||||||
"Language: ar\n"
|
|
||||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "محاذاة لليسار"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "محاذاة لليمين"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "محاذاة في المنتصف"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr "ضبط"
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "محاذاة النص"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr "شريط أدوات محاذاة النص"
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/az.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/az.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language-Team: Azerbaijani (https://app.transifex.com/ckeditor/teams/11143/az/)\n"
|
|
||||||
"Language: az\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "Soldan düzləndir"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "Sağdan düzləndir"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "Mərkəzə düzləndir"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr "Eninə görə"
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "Mətn düzləndirməsi"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr "Mətnin düzləndirmə paneli"
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/bg.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/bg.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language-Team: Bulgarian (https://app.transifex.com/ckeditor/teams/11143/bg/)\n"
|
|
||||||
"Language: bg\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "Ляво подравняване"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "Дясно подравняване"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "Централно подравняване"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr "Разпредели по равно"
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "Подравняване на текста"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr "Лента за подравняване на текст"
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/bn.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/bn.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language-Team: Bengali (https://app.transifex.com/ckeditor/teams/11143/bn/)\n"
|
|
||||||
"Language: bn\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "বামে সারিবদ্ধ করুন"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "ডানদিকে সারিবদ্ধ করুন"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "কেন্দ্র সারিবদ্ধ করুন"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr "জাস্টিফাই"
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "টেক্সট সারিবদ্ধকরণ"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr "টেক্সট শ্রেণীবিন্যাস টুলবার"
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/bs.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/bs.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language-Team: Bosnian (https://app.transifex.com/ckeditor/teams/11143/bs/)\n"
|
|
||||||
"Language: bs\n"
|
|
||||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "Lijevo poravnanje"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "Desno poravnanje"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "Centrirati"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "Poravnanje teksta"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr "Traka za poravnanje teksta"
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/ca.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/ca.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language-Team: Catalan (https://app.transifex.com/ckeditor/teams/11143/ca/)\n"
|
|
||||||
"Language: ca\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "Alineació esquerra"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "Alineació dreta"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "Alineació centre"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr "Justificar"
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "Alineació text"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr "Barra d'eines d'alineació de text"
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/cs.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/cs.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language-Team: Czech (https://app.transifex.com/ckeditor/teams/11143/cs/)\n"
|
|
||||||
"Language: cs\n"
|
|
||||||
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "Zarovnat vlevo"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "Zarovnat vpravo"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "Zarovnat na střed"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr "Zarovnat do bloku"
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "Zarovnání textu"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr "Panel nástrojů zarovnání textu"
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/da.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/da.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language-Team: Danish (https://app.transifex.com/ckeditor/teams/11143/da/)\n"
|
|
||||||
"Language: da\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "Justér venstre"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "Justér højre"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "Justér center"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr "Justér"
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "Tekstjustering"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr "Tekstjustering værktøjslinje"
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/de-ch.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/de-ch.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language-Team: German (Switzerland) (https://app.transifex.com/ckeditor/teams/11143/de_CH/)\n"
|
|
||||||
"Language: de_CH\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "Linksbündig"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "Rechtsbündig"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "Zentriert"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr "Blocksatz"
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "Textausrichtung"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr "Textausrichtung Werkzeugleiste"
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/de.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/de.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language-Team: German (https://app.transifex.com/ckeditor/teams/11143/de/)\n"
|
|
||||||
"Language: de\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "Linksbündig"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "Rechtsbündig"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "Zentriert"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr "Blocksatz"
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "Textausrichtung"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr "Text-Ausrichtung Toolbar"
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/el.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/el.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language-Team: Greek (https://app.transifex.com/ckeditor/teams/11143/el/)\n"
|
|
||||||
"Language: el\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "Στοίχιση αριστερά"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "Στοίχιση δεξιά"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "Στοίχιση στο κέντρο"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr "Πλήρης στοίχηση"
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "Στοίχιση κειμένου"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr "Γραμμή εργαλείων στοίχισης κειμένου"
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/en-au.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/en-au.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language-Team: English (Australia) (https://app.transifex.com/ckeditor/teams/11143/en_AU/)\n"
|
|
||||||
"Language: en_AU\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "Align left"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "Align right"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "Align centre"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr "Justify"
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "Text alignment"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr "Text alignment toolbar"
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/en-gb.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/en-gb.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language-Team: English (United Kingdom) (https://app.transifex.com/ckeditor/teams/11143/en_GB/)\n"
|
|
||||||
"Language: en_GB\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "Align left"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "Align right"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "Align center"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr "Justify"
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "Text alignment"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr ""
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/en.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/en.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language: \n"
|
|
||||||
"Language-Team: \n"
|
|
||||||
"Plural-Forms: \n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "Align left"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "Align right"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "Align center"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr "Justify"
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "Text alignment"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr "Text alignment toolbar"
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/es-co.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/es-co.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language-Team: Spanish (Colombia) (https://app.transifex.com/ckeditor/teams/11143/es_CO/)\n"
|
|
||||||
"Language: es_CO\n"
|
|
||||||
"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "Alinear a la izquierda"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "Alinear a la derecha"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "Centrar"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr "Justificar"
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "Alineación de texto"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr "Herramientas de alineación de texto"
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/es.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/es.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language-Team: Spanish (https://app.transifex.com/ckeditor/teams/11143/es/)\n"
|
|
||||||
"Language: es\n"
|
|
||||||
"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "Alinear a la izquierda"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "Alinear a la derecha"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "Centrar"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr "Justificar"
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "Alineación del texto"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr "Barra de herramientas de alineación del texto"
|
|
||||||
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/et.po
generated
vendored
42
vendor/ckeditor5/node_modules/@ckeditor/ckeditor5-alignment/lang/translations/et.po
generated
vendored
|
|
@ -1,42 +0,0 @@
|
||||||
# Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
|
||||||
#
|
|
||||||
# !!! IMPORTANT !!!
|
|
||||||
#
|
|
||||||
# Before you edit this file, please keep in mind that contributing to the project
|
|
||||||
# translations is possible ONLY via the Transifex online service.
|
|
||||||
#
|
|
||||||
# To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
|
|
||||||
#
|
|
||||||
# To learn more, check out the official contributor's guide:
|
|
||||||
# https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Language-Team: Estonian (https://app.transifex.com/ckeditor/teams/11143/et/)\n"
|
|
||||||
"Language: et\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the left."
|
|
||||||
msgid "Align left"
|
|
||||||
msgstr "Vasakjoondus"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to the right."
|
|
||||||
msgid "Align right"
|
|
||||||
msgstr "Paremjoondus"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for aligning the text to center."
|
|
||||||
msgid "Align center"
|
|
||||||
msgstr "Keskjoondus"
|
|
||||||
|
|
||||||
msgctxt "Toolbar button tooltip for making the text justified."
|
|
||||||
msgid "Justify"
|
|
||||||
msgstr "Rööpjoondus"
|
|
||||||
|
|
||||||
msgctxt "Dropdown button tooltip for the text alignment feature."
|
|
||||||
msgid "Text alignment"
|
|
||||||
msgstr "Teksti joondamine"
|
|
||||||
|
|
||||||
msgctxt "Label used by assistive technologies describing the text alignment feature toolbar."
|
|
||||||
msgid "Text alignment toolbar"
|
|
||||||
msgstr "Teksti joonduse tööriistariba"
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue