Deleted useless files such as backend, node_modules and package-lock. Modified readme.
@@ -1,57 +0,0 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# Environment files
|
||||
.env
|
||||
.env.*.local
|
||||
|
||||
# Build outputs
|
||||
dist/
|
||||
build/
|
||||
|
||||
# Static files
|
||||
public/
|
||||
out/
|
||||
|
||||
# Test files
|
||||
coverage/
|
||||
*.lcov
|
||||
|
||||
# Database files
|
||||
*.sqlite3
|
||||
*.db
|
||||
*.db-wal
|
||||
*.db-shm
|
||||
|
||||
# Temporary files
|
||||
*.tmp
|
||||
*.temp
|
||||
*.swp
|
||||
*.swo
|
||||
|
||||
# IDE and editor files
|
||||
.vscode/
|
||||
.idea/
|
||||
*.iml
|
||||
|
||||
# System files
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Other
|
||||
*.log.*
|
||||
@@ -1,157 +0,0 @@
|
||||
const Crop = require("../Models/crop.model.js");
|
||||
const Farm = require("../Models/farm.model.js");
|
||||
const { uploadOnCloudinary } = require("../Utils/cloudinary.js");
|
||||
|
||||
// Create a new crop
|
||||
const createCrop = async (req, res) => {
|
||||
try {
|
||||
const { name, farm, harvestDate, growthStage, healthStatus } = req.body;
|
||||
if (!req.file.path) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "Avatar not uploaded on cloudinary.",
|
||||
});
|
||||
}
|
||||
|
||||
const imageUrl = await uploadOnCloudinary(req.file.path);
|
||||
|
||||
console.log("Image url is : ", imageUrl);
|
||||
|
||||
if (!imageUrl) {
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: "Image not uploaded on cloudinary.",
|
||||
});
|
||||
}
|
||||
|
||||
// Check if the farm exists
|
||||
const existingFarm = await Farm.findById(farm);
|
||||
if (!existingFarm)
|
||||
return res.status(404).json({ message: "Farm not found" });
|
||||
|
||||
const crop = new Crop({
|
||||
name,
|
||||
farm,
|
||||
image: imageUrl,
|
||||
harvestDate,
|
||||
growthStage,
|
||||
healthStatus,
|
||||
});
|
||||
|
||||
await crop.save();
|
||||
|
||||
// Add crop to farm
|
||||
existingFarm.crops.push(crop._id);
|
||||
await existingFarm.save();
|
||||
|
||||
res.status(201).json(crop);
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Get all crops for a specific farm
|
||||
const getCropsByFarm = async (req, res) => {
|
||||
try {
|
||||
console.log("My farm id is : ", req.params.farmId);
|
||||
const crops = await Crop.find({ farm: req.params.farmId });
|
||||
|
||||
res.status(200).json(crops);
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Get a single crop by ID
|
||||
const getCropById = async (req, res) => {
|
||||
try {
|
||||
const crop = await Crop.findById(req.params.cropId).populate("farm");
|
||||
|
||||
if (!crop) return res.status(404).json({ message: "Crop not found" });
|
||||
|
||||
res.status(200).json(crop);
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Update crop details
|
||||
const updateCrop = async (req, res) => {
|
||||
try {
|
||||
const updatedCrop = await Crop.findByIdAndUpdate(
|
||||
req.params.cropId,
|
||||
req.body,
|
||||
{ new: true }
|
||||
);
|
||||
|
||||
if (!updatedCrop)
|
||||
return res.status(404).json({ message: "Crop not found" });
|
||||
|
||||
res.status(200).json(updatedCrop);
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Delete a crop
|
||||
const deleteCrop = async (req, res) => {
|
||||
try {
|
||||
const crop = await Crop.findById(req.params.cropId);
|
||||
|
||||
if (!crop) return res.status(404).json({ message: "Crop not found" });
|
||||
|
||||
await crop.deleteOne();
|
||||
|
||||
// Remove crop from the farm
|
||||
await Farm.findByIdAndUpdate(crop.farm, { $pull: { crops: crop._id } });
|
||||
|
||||
res.status(200).json({ message: "Crop deleted successfully" });
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Update crop growth stage
|
||||
const updateGrowthStage = async (req, res) => {
|
||||
try {
|
||||
const { growthStage } = req.body;
|
||||
|
||||
const crop = await Crop.findById(req.params.cropId);
|
||||
if (!crop) return res.status(404).json({ message: "Crop not found" });
|
||||
|
||||
crop.growthStage = growthStage;
|
||||
await crop.save();
|
||||
|
||||
res.status(200).json({ message: "Growth stage updated", crop });
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Update crop health status
|
||||
const updateHealthStatus = async (req, res) => {
|
||||
try {
|
||||
const { healthStatus } = req.body;
|
||||
|
||||
const crop = await Crop.findById(req.params.cropId);
|
||||
if (!crop) return res.status(404).json({ message: "Crop not found" });
|
||||
|
||||
crop.healthStatus = healthStatus;
|
||||
await crop.save();
|
||||
|
||||
res.status(200).json({ message: "Health status updated", crop });
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
module.exports = {
|
||||
createCrop,
|
||||
getCropsByFarm,
|
||||
getCropById,
|
||||
updateCrop,
|
||||
deleteCrop,
|
||||
updateGrowthStage,
|
||||
updateHealthStatus,
|
||||
};
|
||||
@@ -1,131 +0,0 @@
|
||||
const Farm = require("../Models/farm.model.js");
|
||||
const Crop = require("../Models/crop.model.js");
|
||||
const Finance = require("../Models/finance.model.js");
|
||||
|
||||
// Create a farm
|
||||
const createFarm = async (req, res) => {
|
||||
try {
|
||||
const { name, location, waterContent, soilType, size } = req.body;
|
||||
|
||||
const farm = new Farm({
|
||||
name,
|
||||
location,
|
||||
size,
|
||||
waterContent,
|
||||
soilType,
|
||||
owner: req.user._id,
|
||||
});
|
||||
|
||||
await farm.save();
|
||||
res.status(201).json(farm);
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Get all farms for a user
|
||||
const getUserFarms = async (req, res) => {
|
||||
try {
|
||||
const farms = await Farm.find({ owner: req.user._id })
|
||||
.populate("crops")
|
||||
.populate("finances");
|
||||
|
||||
res.status(200).json(farms);
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Get a single farm by ID
|
||||
const getFarmById = async (req, res) => {
|
||||
try {
|
||||
const farm = await Farm.findById(req.params.farmId)
|
||||
.populate("crops")
|
||||
.populate("finances");
|
||||
|
||||
if (!farm) return res.status(404).json({ message: "Farm not found" });
|
||||
|
||||
res.status(200).json(farm);
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Update farm details
|
||||
const updateFarm = async (req, res) => {
|
||||
try {
|
||||
const updatedFarm = await Farm.findByIdAndUpdate(
|
||||
req.params.farmId,
|
||||
req.body,
|
||||
{ new: true }
|
||||
);
|
||||
|
||||
if (!updatedFarm)
|
||||
return res.status(404).json({ message: "Farm not found" });
|
||||
|
||||
res.status(200).json(updatedFarm);
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Delete a farm
|
||||
const deleteFarm = async (req, res) => {
|
||||
try {
|
||||
const farm = await Farm.findById(req.params.farmId);
|
||||
|
||||
if (!farm) return res.status(404).json({ message: "Farm not found" });
|
||||
|
||||
await Crop.deleteMany({ farm: farm._id });
|
||||
await Finance.findByIdAndDelete(farm.finances);
|
||||
await farm.deleteOne();
|
||||
|
||||
res.status(200).json({ message: "Farm deleted successfully" });
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Add fertilizer to a farm
|
||||
const addFertilizer = async (req, res) => {
|
||||
try {
|
||||
const { name, quantity } = req.body;
|
||||
|
||||
const farm = await Farm.findById(req.params.farmId);
|
||||
if (!farm) return res.status(404).json({ message: "Farm not found" });
|
||||
|
||||
farm.fertilizer.push({ name, quantity });
|
||||
await farm.save();
|
||||
|
||||
res.status(200).json({ message: "Fertilizer added", farm });
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Add pesticide to a farm
|
||||
const addPesticide = async (req, res) => {
|
||||
try {
|
||||
const { name, quantity } = req.body;
|
||||
|
||||
const farm = await Farm.findById(req.params.farmId);
|
||||
if (!farm) return res.status(404).json({ message: "Farm not found" });
|
||||
|
||||
farm.pestisides.push({ name, quantity });
|
||||
await farm.save();
|
||||
|
||||
res.status(200).json({ message: "Pesticide added", farm });
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
createFarm,
|
||||
getUserFarms,
|
||||
getFarmById,
|
||||
updateFarm,
|
||||
deleteFarm,
|
||||
addFertilizer,
|
||||
addPesticide,
|
||||
};
|
||||
@@ -1,136 +0,0 @@
|
||||
const Finance = require("../Models/finance.model.js");
|
||||
const Farm = require("../Models/farm.model.js");
|
||||
|
||||
// Create finance record for a farm
|
||||
const createFinance = async (req, res) => {
|
||||
try {
|
||||
const { farm } = req.body;
|
||||
|
||||
// Check if the farm exists
|
||||
const existingFarm = await Farm.findById(farm);
|
||||
if (!existingFarm)
|
||||
return res.status(404).json({ message: "Farm not found" });
|
||||
|
||||
const finance = new Finance({
|
||||
farm,
|
||||
transactions: [],
|
||||
totalExpenses: 0,
|
||||
totalRevenue: 0,
|
||||
});
|
||||
|
||||
await finance.save();
|
||||
|
||||
// Link finance to farm
|
||||
existingFarm.finances = finance._id;
|
||||
await existingFarm.save();
|
||||
|
||||
res.status(201).json(finance);
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Get finance details by farm ID
|
||||
const getFinanceByFarm = async (req, res) => {
|
||||
try {
|
||||
console.log("My farm id is : ", req.params.farmId);
|
||||
const finance = await Finance.findOne({ farm: req.params.farmId });
|
||||
|
||||
if (!finance)
|
||||
return res.status(404).json({ message: "Finance record not found" });
|
||||
|
||||
res.status(200).json(finance);
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Add a transaction (expense/revenue)
|
||||
const addTransaction = async (req, res) => {
|
||||
try {
|
||||
const { type, amount, description } = req.body;
|
||||
|
||||
const finance = await Finance.findById(req.params.financeId);
|
||||
if (!finance)
|
||||
return res.status(404).json({ message: "Finance record not found" });
|
||||
|
||||
finance.transactions.push({ type, amount, description });
|
||||
|
||||
// Update totals
|
||||
if (type === "Expense") {
|
||||
finance.totalExpenses += amount;
|
||||
} else if (type === "Revenue") {
|
||||
finance.totalRevenue += amount;
|
||||
}
|
||||
|
||||
await finance.save();
|
||||
res.status(200).json({ message: "Transaction added", finance });
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Delete a transaction
|
||||
const deleteTransaction = async (req, res) => {
|
||||
try {
|
||||
const finance = await Finance.findById(req.params.financeId);
|
||||
if (!finance)
|
||||
return res.status(404).json({ message: "Finance record not found" });
|
||||
|
||||
const transaction = finance.transactions.id(req.params.transactionId);
|
||||
if (!transaction)
|
||||
return res.status(404).json({ message: "Transaction not found" });
|
||||
|
||||
// Adjust totals before removing
|
||||
if (transaction.type === "Expense") {
|
||||
finance.totalExpenses -= transaction.amount;
|
||||
} else if (transaction.type === "Revenue") {
|
||||
finance.totalRevenue -= transaction.amount;
|
||||
}
|
||||
|
||||
transaction.remove();
|
||||
await finance.save();
|
||||
|
||||
res.status(200).json({ message: "Transaction deleted", finance });
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Get all transactions for a farm's finance
|
||||
const getTransactions = async (req, res) => {
|
||||
try {
|
||||
const finance = await Finance.findById(req.params.financeId);
|
||||
if (!finance)
|
||||
return res.status(404).json({ message: "Finance record not found" });
|
||||
|
||||
res.status(200).json(finance.transactions);
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Get total expenses and revenue
|
||||
const getFinancialSummary = async (req, res) => {
|
||||
try {
|
||||
const finance = await Finance.findById(req.params.financeId);
|
||||
if (!finance)
|
||||
return res.status(404).json({ message: "Finance record not found" });
|
||||
|
||||
res.status(200).json({
|
||||
totalExpenses: finance.totalExpenses,
|
||||
totalRevenue: finance.totalRevenue,
|
||||
});
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
createFinance,
|
||||
getFinanceByFarm,
|
||||
addTransaction,
|
||||
deleteTransaction,
|
||||
getTransactions,
|
||||
getFinancialSummary,
|
||||
};
|
||||
@@ -1,120 +0,0 @@
|
||||
const Task = require("../Models/task.model.js");
|
||||
const Farm = require("../Models/farm.model.js");
|
||||
const Crop = require("../Models/crop.model.js");
|
||||
|
||||
// Create a new task
|
||||
const createTask = async (req, res) => {
|
||||
try {
|
||||
const { farm, crop, taskType, description, assignedDate, status } =
|
||||
req.body;
|
||||
|
||||
// Validate farm existence
|
||||
const existingFarm = await Farm.findById(farm);
|
||||
if (!existingFarm)
|
||||
return res.status(404).json({ message: "Farm not found" });
|
||||
|
||||
// Validate crop if provided
|
||||
if (crop) {
|
||||
const existingCrop = await Crop.findById(crop);
|
||||
if (!existingCrop)
|
||||
return res.status(404).json({ message: "Crop not found" });
|
||||
}
|
||||
|
||||
const task = new Task({
|
||||
farm,
|
||||
crop,
|
||||
taskType,
|
||||
description,
|
||||
assignedDate,
|
||||
status,
|
||||
});
|
||||
|
||||
await task.save();
|
||||
res.status(201).json(task);
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Get all tasks for a specific farm
|
||||
const getTasksByFarm = async (req, res) => {
|
||||
try {
|
||||
const tasks = await Task.find({ farm: req.params.farmId }).populate("crop");
|
||||
|
||||
res.status(200).json(tasks);
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Get a single task by ID
|
||||
const getTaskById = async (req, res) => {
|
||||
try {
|
||||
const task = await Task.findById(req.params.taskId).populate("farm crop");
|
||||
|
||||
if (!task) return res.status(404).json({ message: "Task not found" });
|
||||
|
||||
res.status(200).json(task);
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Update task details
|
||||
const updateTask = async (req, res) => {
|
||||
try {
|
||||
const updatedTask = await Task.findByIdAndUpdate(
|
||||
req.params.taskId,
|
||||
req.body,
|
||||
{ new: true }
|
||||
);
|
||||
|
||||
if (!updatedTask)
|
||||
return res.status(404).json({ message: "Task not found" });
|
||||
|
||||
res.status(200).json(updatedTask);
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Delete a task
|
||||
const deleteTask = async (req, res) => {
|
||||
try {
|
||||
const task = await Task.findById(req.params.taskId);
|
||||
|
||||
if (!task) return res.status(404).json({ message: "Task not found" });
|
||||
|
||||
await task.deleteOne();
|
||||
|
||||
res.status(200).json({ message: "Task deleted successfully" });
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
// Update task status (Pending → Completed)
|
||||
const updateTaskStatus = async (req, res) => {
|
||||
try {
|
||||
const { status } = req.body;
|
||||
|
||||
const task = await Task.findById(req.params.taskId);
|
||||
if (!task) return res.status(404).json({ message: "Task not found" });
|
||||
|
||||
task.status = status;
|
||||
await task.save();
|
||||
|
||||
res.status(200).json({ message: "Task status updated", task });
|
||||
} catch (error) {
|
||||
res.status(500).json({ message: error.message });
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
createTask,
|
||||
getTasksByFarm,
|
||||
getTaskById,
|
||||
updateTask,
|
||||
deleteTask,
|
||||
updateTaskStatus,
|
||||
};
|
||||
@@ -1,466 +0,0 @@
|
||||
const catchAsyncErrors = require("../Middlewares/catchAsyncErrors.js");
|
||||
const User = require("../Models/user.model.js");
|
||||
const { uploadOnCloudinary } = require("../Utils/cloudinary.js");
|
||||
const sendEmail = require("../Utils/sendmail.js");
|
||||
const crypto = require("crypto");
|
||||
const jwt = require("jsonwebtoken");
|
||||
|
||||
// Register or Sign up new User -- Done
|
||||
const registerUser = catchAsyncErrors(async (req, res) => {
|
||||
const { name, email, password, role } = req.body;
|
||||
|
||||
const user = await User.create({
|
||||
name,
|
||||
email,
|
||||
password,
|
||||
role,
|
||||
});
|
||||
|
||||
if (!user) {
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: "User not created something went wrong.",
|
||||
});
|
||||
}
|
||||
|
||||
return res.status(200).json({
|
||||
success: true,
|
||||
message: "User is registered successfully",
|
||||
data: user,
|
||||
});
|
||||
});
|
||||
|
||||
// Login user in our web app -- Done
|
||||
const loginUser = catchAsyncErrors(async (req, res) => {
|
||||
const { email, password } = req.body;
|
||||
|
||||
const user = await User.findOne({ email });
|
||||
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: "User not found",
|
||||
});
|
||||
}
|
||||
|
||||
const checkUser = await user.isPasswordCorrect(password);
|
||||
|
||||
if (!checkUser) {
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: "Password is incorrect",
|
||||
});
|
||||
}
|
||||
|
||||
const token = await user.generateRefreshToken();
|
||||
|
||||
if (!token) {
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: "token not created something went wrong.",
|
||||
});
|
||||
}
|
||||
|
||||
user.password = null;
|
||||
|
||||
return res
|
||||
.status(200)
|
||||
.cookie(process.env.TOKEN_NAME, token, {
|
||||
path: "/",
|
||||
sameSite: "None",
|
||||
secure: process.env.NODE_ENV === "production",
|
||||
httpOnly: true,
|
||||
expires: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000),
|
||||
})
|
||||
.json({
|
||||
success: true,
|
||||
message: "User is successfully logged in.",
|
||||
data: user,
|
||||
});
|
||||
});
|
||||
|
||||
// Logout user in our web app -- Done
|
||||
const logoutUser = catchAsyncErrors(async (req, res) => {
|
||||
return res
|
||||
.clearCookie(process.env.TOKEN_NAME, {
|
||||
path: "/",
|
||||
sameSite: "None",
|
||||
secure: process.env.NODE_ENV === "production",
|
||||
httpOnly: true,
|
||||
expires: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000),
|
||||
})
|
||||
.status(201)
|
||||
.json({
|
||||
success: true,
|
||||
message: "User is logged out successfully",
|
||||
});
|
||||
});
|
||||
|
||||
// -- DONE
|
||||
const intializeUser = catchAsyncErrors(async (req, res) => {
|
||||
const tokenValue = req.cookies[process.env.TOKEN_NAME];
|
||||
|
||||
// console.log("I am the one who is doing this : ", tokenValue);
|
||||
|
||||
if (!tokenValue) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: "User is not logged in.",
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
const payload = await jwt.verify(
|
||||
tokenValue,
|
||||
process.env.REFRESH_TOKEN_SECRET
|
||||
);
|
||||
|
||||
if (!payload) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: "Something went wrong",
|
||||
});
|
||||
}
|
||||
|
||||
const user = await User.findById(payload._id).select("-password");
|
||||
|
||||
return res.status(200).json({
|
||||
success: true,
|
||||
message: "User data get successfully",
|
||||
data: user,
|
||||
});
|
||||
} catch (error) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: "Something went wrong",
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Update user deatails -- ADMIN
|
||||
const updateUserDetails = catchAsyncErrors(async (req, res) => {
|
||||
const user = await User.findById(req.params.id);
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
success: true,
|
||||
message: "User not found",
|
||||
});
|
||||
}
|
||||
|
||||
const { name, email } = req.body;
|
||||
|
||||
const updateUser = await User.findByIdAndUpdate(req.params.id, {
|
||||
$set: {
|
||||
name: name,
|
||||
email: email,
|
||||
},
|
||||
}).select("-password");
|
||||
|
||||
return res.status(200).json({
|
||||
success: true,
|
||||
message: "User is updated successfully",
|
||||
data: updateUser,
|
||||
});
|
||||
});
|
||||
|
||||
// forget password -- Done
|
||||
const forgetPassword = catchAsyncErrors(async (req, res) => {
|
||||
const { email } = req.body;
|
||||
const user = await User.findOne({ email });
|
||||
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: "User not found ",
|
||||
});
|
||||
}
|
||||
|
||||
// get reset password
|
||||
|
||||
const resetToken = await user.getResetPassword();
|
||||
|
||||
await user.save({ validateBeforeSave: false });
|
||||
|
||||
/*const resetPasswordUrl = `${req.protocol}://${req.get(
|
||||
"host"
|
||||
)}/api/v1/password/reset/${resetToken}`;*/
|
||||
|
||||
const resetPasswordUrl = `${process.env.FRONTEND_URI}/user/api/v1/password/reset/${resetToken}`;
|
||||
|
||||
const message = `Your password token is :-\n\n${resetPasswordUrl}\n\nIf you are not requested this email then please ingore this mail.`;
|
||||
|
||||
try {
|
||||
await sendEmail({
|
||||
email: user.email,
|
||||
subject: "MentorFlux password recovery",
|
||||
message: message,
|
||||
});
|
||||
return res.status(200).json({
|
||||
success: true,
|
||||
message: `Email sent to ${email} successfully`,
|
||||
});
|
||||
} catch (error) {
|
||||
user.resetPasswordToken = undefined;
|
||||
user.resetPasswordExpiry = undefined;
|
||||
await user.save({ validateBeforeSave: false });
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: "Something went wrong ",
|
||||
error: error,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// reset users password -- DONE
|
||||
const resetPassword = catchAsyncErrors(async (req, res) => {
|
||||
const token = req.params.token;
|
||||
|
||||
const { password, confirmPassword } = req.body;
|
||||
|
||||
//console.log("My password is :", password);
|
||||
//console.log("My confirmPassword is :", confirmPassword);
|
||||
//console.log("My token is :", token);
|
||||
const resetPasswordToken = await crypto
|
||||
.createHash("sha256")
|
||||
.update(token)
|
||||
.digest("hex");
|
||||
|
||||
const user = await User.findOne({
|
||||
resetPasswordToken,
|
||||
resetPasswordExpiry: { $gte: Date.now() },
|
||||
});
|
||||
|
||||
if (!user) {
|
||||
return res.status(401).json({
|
||||
success: false,
|
||||
message: "Reset Password token is invalid or has been expired",
|
||||
});
|
||||
}
|
||||
|
||||
if (password !== confirmPassword) {
|
||||
return res.status(401).json({
|
||||
success: false,
|
||||
message: "Please enter password and confirm password",
|
||||
});
|
||||
}
|
||||
|
||||
user.password = password;
|
||||
user.resetPasswordToken = undefined;
|
||||
user.resetPasswordExpiry = undefined;
|
||||
|
||||
//console.log("To check the user ", user);
|
||||
|
||||
await user.save();
|
||||
|
||||
return res.status(200).json({
|
||||
success: true,
|
||||
message: "Password changed successfully",
|
||||
});
|
||||
});
|
||||
|
||||
// get user personal details
|
||||
const getUserDetails = catchAsyncErrors(async (req, res) => {
|
||||
|
||||
|
||||
const user = await User.findById(req.user._id);
|
||||
|
||||
if (!user) {
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: "Something went wrong ",
|
||||
});
|
||||
}
|
||||
|
||||
return res.status(200).json({
|
||||
success: true,
|
||||
message: "User details are fetched successfully",
|
||||
data: user,
|
||||
});
|
||||
});
|
||||
|
||||
// Update users password
|
||||
const updatePassword = catchAsyncErrors(async (req, res) => {
|
||||
const { password, oldPassword, confirmPassword } = req.body;
|
||||
|
||||
const user = await User.findById(req.user._id);
|
||||
|
||||
const isPasswordMatched = await user.isPasswordCorrect(oldPassword);
|
||||
|
||||
if (!user) {
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: "User not found",
|
||||
});
|
||||
}
|
||||
|
||||
if (!isPasswordMatched) {
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: "Old password is incorrect.Please enter correct password ",
|
||||
});
|
||||
}
|
||||
|
||||
if (password !== confirmPassword) {
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: "Password and Confirm password should be same.",
|
||||
});
|
||||
}
|
||||
|
||||
user.password = password;
|
||||
await user.save({ validateBeforeSave: false });
|
||||
|
||||
return res.status(200).json({
|
||||
success: true,
|
||||
message: "Password upadated successfully",
|
||||
});
|
||||
});
|
||||
|
||||
// update personal details
|
||||
const updatePersonalDetails = catchAsyncErrors(async (req, res) => {
|
||||
const { name, email } = req.body;
|
||||
const user = await User.findByIdAndUpdate(req.user._id, {
|
||||
$set: {
|
||||
name,
|
||||
email,
|
||||
},
|
||||
});
|
||||
|
||||
if (!user) {
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: "Something went wrong",
|
||||
});
|
||||
}
|
||||
|
||||
return res.status(200).json({
|
||||
success: true,
|
||||
message: "User details updated successfully",
|
||||
data: user,
|
||||
});
|
||||
});
|
||||
|
||||
// Get all users details -- ADMIN
|
||||
const getAllusersDetail = catchAsyncErrors(async (req, res) => {
|
||||
const users = await find();
|
||||
return res.status(200).json({
|
||||
success: true,
|
||||
message: "All user fetch successfully",
|
||||
data: users,
|
||||
});
|
||||
});
|
||||
|
||||
// get single user details
|
||||
const getSingaluserDetail = catchAsyncErrors(async (req, res) => {
|
||||
const user = await User.findById(req.params.id);
|
||||
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: "User not found",
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// upadate user Role -- ADMIN
|
||||
const updateUserRole = catchAsyncErrors(async (req, res) => {
|
||||
const { name, email, role } = req.body;
|
||||
const user = await User.findByIdAndUpdate(req.params.id, {
|
||||
$set: {
|
||||
name,
|
||||
email,
|
||||
role,
|
||||
},
|
||||
});
|
||||
|
||||
if (!user) {
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: "Something went wrong",
|
||||
});
|
||||
}
|
||||
|
||||
return res.status(200).json({
|
||||
success: true,
|
||||
message: "User Role updated successfully",
|
||||
data: user,
|
||||
});
|
||||
});
|
||||
|
||||
// Delete user -- ADMIN
|
||||
const DeleteUser = catchAsyncErrors(async (req, res) => {
|
||||
const user = await User.findByIdAndDelete(req.params.id);
|
||||
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: "User does not exist",
|
||||
});
|
||||
}
|
||||
|
||||
return res.status(200).json({
|
||||
success: true,
|
||||
message: "User deleted successfully",
|
||||
data: user,
|
||||
});
|
||||
});
|
||||
|
||||
// update avatar -- user
|
||||
const updateAvatar = catchAsyncErrors(async (req, res) => {
|
||||
//console.log("Our file is : ", req.file.path);
|
||||
|
||||
if (!req.file.path) {
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "Avatar not uploaded on cloudinary.",
|
||||
});
|
||||
}
|
||||
|
||||
const avatarUrl = await uploadOnCloudinary(req.file.path);
|
||||
|
||||
if (!avatarUrl) {
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: "Avatar not uploaded on cloudinary.",
|
||||
});
|
||||
}
|
||||
|
||||
//console.log("Avatar url is : ", avatarUrl);
|
||||
|
||||
//console.log("our user is : ", req.user);
|
||||
|
||||
const user = await User.findByIdAndUpdate(req.user._id, {
|
||||
$set: {
|
||||
avatar: avatarUrl,
|
||||
},
|
||||
});
|
||||
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: "User not found.",
|
||||
});
|
||||
}
|
||||
|
||||
return res.status(200).json({
|
||||
success: true,
|
||||
message: "Avatar updated successfully.",
|
||||
data: user,
|
||||
});
|
||||
});
|
||||
|
||||
module.exports = {
|
||||
registerUser,
|
||||
loginUser,
|
||||
logoutUser,
|
||||
updateUserDetails,
|
||||
forgetPassword,
|
||||
resetPassword,
|
||||
getUserDetails,
|
||||
updatePassword,
|
||||
updatePersonalDetails,
|
||||
updateUserRole,
|
||||
DeleteUser,
|
||||
intializeUser,
|
||||
updateAvatar,
|
||||
};
|
||||
@@ -1,21 +0,0 @@
|
||||
const mongoose = require("mongoose");
|
||||
const catchAsyncErrors = require("../Middlewares/catchAsyncErrors.js");
|
||||
|
||||
const DB_connect = catchAsyncErrors(async () => {
|
||||
try {
|
||||
const connectionInstance = await mongoose.connect(
|
||||
`${process.env.MONGODB_URI}/${process.env.DATABASE_NAME}`
|
||||
);
|
||||
|
||||
if (!connectionInstance) {
|
||||
console.log("MongoDB connection failed");
|
||||
}
|
||||
console.log(
|
||||
"MongoDB connected Successfully on server : " +
|
||||
connectionInstance.connection.host
|
||||
);
|
||||
} catch (error) {
|
||||
console.log("MongoDB connection failed due to some error :", error);
|
||||
}
|
||||
});
|
||||
module.exports = DB_connect;
|
||||
@@ -1,49 +0,0 @@
|
||||
const jwt = require("jsonwebtoken");
|
||||
const User = require("../Models/user.model.js");
|
||||
const dotenv = require("dotenv");
|
||||
dotenv.config({
|
||||
path: "./.env",
|
||||
});
|
||||
|
||||
async function checkAuthenticated(req, res, next) {
|
||||
const tokenValue = req.cookies[process.env.TOKEN_NAME];
|
||||
|
||||
console.log("I am called", tokenValue);
|
||||
if (!tokenValue) {
|
||||
return res.status(404).json({
|
||||
success: false,
|
||||
message: "User is not logged in.",
|
||||
});
|
||||
}
|
||||
try {
|
||||
const payload = await jwt.verify(
|
||||
tokenValue,
|
||||
process.env.REFRESH_TOKEN_SECRET
|
||||
);
|
||||
|
||||
if (!payload) {
|
||||
return next();
|
||||
}
|
||||
|
||||
req.user = payload;
|
||||
return next();
|
||||
} catch (error) {
|
||||
return next();
|
||||
}
|
||||
}
|
||||
|
||||
function authorizeRoles(...roles) {
|
||||
return async (req, res, next) => {
|
||||
if (!roles.includes(req.user.role)) {
|
||||
return res.status(401).json({
|
||||
success: false,
|
||||
message: "You are unauthorised to access this resource",
|
||||
});
|
||||
return next();
|
||||
}
|
||||
|
||||
return next();
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = { checkAuthenticated, authorizeRoles };
|
||||
@@ -1,3 +0,0 @@
|
||||
module.exports = (theFunc) => (req, res, next) => {
|
||||
Promise.resolve(theFunc(req, res, next)).catch(next);
|
||||
};
|
||||
@@ -1,16 +0,0 @@
|
||||
const multer = require("multer");
|
||||
|
||||
const storage = multer.diskStorage({
|
||||
destination: function (req, file, cb) {
|
||||
cb(null, "./public/images");
|
||||
},
|
||||
|
||||
filename: function (req, file, cb) {
|
||||
const uniquePrefix = Date.now();
|
||||
cb(null, uniquePrefix + "-" + file.originalname);
|
||||
},
|
||||
});
|
||||
|
||||
const upload = multer({ storage: storage });
|
||||
|
||||
module.exports = upload;
|
||||
@@ -1,22 +0,0 @@
|
||||
const mongoose = require("mongoose");
|
||||
|
||||
const cropSchema = new mongoose.Schema(
|
||||
{
|
||||
name: { type: String, required: true },
|
||||
farm: { type: mongoose.Schema.Types.ObjectId, ref: "Farm", required: true },
|
||||
image: { type: String },
|
||||
plantedDate: { type: Date, required: true, default: Date.now() },
|
||||
harvestDate: { type: Date },
|
||||
growthStage: {
|
||||
type: String,
|
||||
enum: ["Planted", "Growing", "Ready to Harvest"],
|
||||
default: "Planted",
|
||||
},
|
||||
healthStatus: { type: String, default: "Healthy" },
|
||||
},
|
||||
{ timestamps: true }
|
||||
);
|
||||
|
||||
const Crop = mongoose.model("Crop", cropSchema);
|
||||
|
||||
module.exports = Crop;
|
||||
@@ -1,37 +0,0 @@
|
||||
const mongoose = require("mongoose");
|
||||
|
||||
const farmSchema = new mongoose.Schema(
|
||||
{
|
||||
name: { type: String, required: true },
|
||||
location: { type: String, required: true },
|
||||
owner: {
|
||||
type: mongoose.Schema.Types.ObjectId,
|
||||
ref: "User",
|
||||
required: true,
|
||||
},
|
||||
size: { type: String },
|
||||
waterContent: { type: String, required: true },
|
||||
soilType: { type: String, required: true },
|
||||
fertilizer: [
|
||||
{
|
||||
name: { type: String },
|
||||
quantity: { type: Number },
|
||||
addedAt: { type: Date, default: Date.now },
|
||||
},
|
||||
],
|
||||
pestisides: [
|
||||
{
|
||||
name: { type: String },
|
||||
quantity: { type: Number },
|
||||
addedAt: { type: Date, default: Date.now },
|
||||
},
|
||||
],
|
||||
crops: [{ type: mongoose.Schema.Types.ObjectId, ref: "Crop" }],
|
||||
finances: { type: mongoose.Schema.Types.ObjectId, ref: "Finance" },
|
||||
},
|
||||
{ timestamps: true }
|
||||
);
|
||||
|
||||
const Farm = mongoose.model("Farm", farmSchema);
|
||||
|
||||
module.exports = Farm;
|
||||
@@ -1,21 +0,0 @@
|
||||
const mongoose = require("mongoose");
|
||||
const financeSchema = new mongoose.Schema(
|
||||
{
|
||||
farm: { type: mongoose.Schema.Types.ObjectId, ref: "Farm", required: true },
|
||||
transactions: [
|
||||
{
|
||||
type: { type: String, enum: ["Expense", "Revenue"], required: true },
|
||||
amount: { type: Number, required: true },
|
||||
description: { type: String },
|
||||
date: { type: Date, default: Date.now },
|
||||
},
|
||||
],
|
||||
totalExpenses: { type: Number, default: 0 },
|
||||
totalRevenue: { type: Number, default: 0 },
|
||||
},
|
||||
{ timestamps: true }
|
||||
);
|
||||
|
||||
const Finance = mongoose.model("Finance", financeSchema);
|
||||
|
||||
module.exports = Finance;
|
||||
@@ -1,31 +0,0 @@
|
||||
const mongoose = require("mongoose");
|
||||
|
||||
const taskSchema = new mongoose.Schema(
|
||||
{
|
||||
farm: { type: mongoose.Schema.Types.ObjectId, ref: "Farm", required: true },
|
||||
crop: { type: mongoose.Schema.Types.ObjectId, ref: "Crop" },
|
||||
taskType: {
|
||||
type: String,
|
||||
enum: [
|
||||
"Sowing",
|
||||
"Watering",
|
||||
"Fertilization",
|
||||
"Pest Control",
|
||||
"Harvesting",
|
||||
],
|
||||
required: true,
|
||||
},
|
||||
description: { type: String },
|
||||
assignedDate: { type: Date, required: true, default: Date.now },
|
||||
status: {
|
||||
type: String,
|
||||
enum: ["Pending", "Completed"],
|
||||
default: "Pending",
|
||||
},
|
||||
},
|
||||
{ timestamps: true }
|
||||
);
|
||||
|
||||
const Task = mongoose.model("Task", taskSchema);
|
||||
|
||||
module.exports = Task;
|
||||
@@ -1,85 +0,0 @@
|
||||
const mongoose = require("mongoose");
|
||||
const bcrypt = require("bcrypt");
|
||||
const jwt = require("jsonwebtoken");
|
||||
const crypto = require("crypto");
|
||||
|
||||
const userSchema = new mongoose.Schema(
|
||||
{
|
||||
name: {
|
||||
type: String,
|
||||
required: [true, "Please Enter your name"],
|
||||
maxLength: [30, "Please Enter the valid name"],
|
||||
minLength: [2, "Name should have more than 5 characters"],
|
||||
},
|
||||
country: {
|
||||
type: String,
|
||||
},
|
||||
email: {
|
||||
type: String,
|
||||
required: true,
|
||||
unique: true,
|
||||
lowerCase: true,
|
||||
},
|
||||
password: {
|
||||
type: String,
|
||||
required: true,
|
||||
minLength: [6, "Password should have more than 6 characters"],
|
||||
},
|
||||
avatar: {
|
||||
type: String,
|
||||
default: "/images/profile.jpeg",
|
||||
},
|
||||
role: { type: String, enum: ["farmer", "admin"], default: "farmer" },
|
||||
farms: [{ type: mongoose.Schema.Types.ObjectId, ref: "Farm" }],
|
||||
|
||||
resetPasswordToken: String,
|
||||
resetPasswordExpiry: Date,
|
||||
},
|
||||
{
|
||||
timestamps: true,
|
||||
}
|
||||
);
|
||||
|
||||
userSchema.pre("save", async function (next) {
|
||||
if (!this.isModified("password")) return next();
|
||||
|
||||
this.password = await bcrypt.hash(this.password, 10);
|
||||
return next();
|
||||
});
|
||||
|
||||
userSchema.methods.isPasswordCorrect = async function (password) {
|
||||
return await bcrypt.compare(password, this.password);
|
||||
};
|
||||
|
||||
userSchema.methods.generateRefreshToken = async function () {
|
||||
return await jwt.sign(
|
||||
{
|
||||
_id: this._id,
|
||||
email: this.email,
|
||||
},
|
||||
process.env.REFRESH_TOKEN_SECRET
|
||||
// {
|
||||
// expiresIn: process.env.REFRESH_TOKEN_EXPIRY,
|
||||
// }
|
||||
);
|
||||
};
|
||||
|
||||
userSchema.methods.getResetPassword = async function () {
|
||||
// Generating token
|
||||
const resetToken = await crypto.randomBytes(20).toString("hex");
|
||||
|
||||
// Hashing and adding reset password token to userschema
|
||||
|
||||
this.resetPasswordToken = crypto
|
||||
.createHash("sha256")
|
||||
.update(resetToken)
|
||||
.digest("hex");
|
||||
|
||||
this.resetPasswordExpiry = Date.now() + 15 * 60 * 1000;
|
||||
|
||||
return resetToken;
|
||||
};
|
||||
|
||||
const User = mongoose.model("User", userSchema);
|
||||
|
||||
module.exports = User;
|
||||
@@ -1,25 +0,0 @@
|
||||
const express = require("express");
|
||||
const {
|
||||
createCrop,
|
||||
getCropsByFarm,
|
||||
getCropById,
|
||||
updateCrop,
|
||||
deleteCrop,
|
||||
updateHealthStatus,
|
||||
updateGrowthStage,
|
||||
} = require("../Controllers/crop.controller.js");
|
||||
const { checkAuthenticated } = require("../Middlewares/authentication.js");
|
||||
const upload = require("../Middlewares/multer.js");
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
// Routes for crop management
|
||||
router.post("/", checkAuthenticated, upload.single("image"), createCrop); // Create a new crop
|
||||
router.get("/farm/:farmId", checkAuthenticated, getCropsByFarm); // Get all crops
|
||||
router.get("/:cropId", checkAuthenticated, getCropById); // Get a crop by ID
|
||||
router.put("/:cropId", checkAuthenticated, updateCrop); // Update crop details
|
||||
router.delete("/:cropId", checkAuthenticated, deleteCrop); // Delete a crop
|
||||
router.put("/health/:cropId", checkAuthenticated, updateHealthStatus);
|
||||
router.put("/growth/:cropId", checkAuthenticated, updateGrowthStage);
|
||||
|
||||
module.exports = router;
|
||||
@@ -1,19 +0,0 @@
|
||||
const express = require("express");
|
||||
const {
|
||||
createFarm,
|
||||
getUserFarms,
|
||||
getFarmById,
|
||||
updateFarm,
|
||||
deleteFarm,
|
||||
} = require("../Controllers/farm.controller.js");
|
||||
const { checkAuthenticated } = require("../Middlewares/authentication.js");
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
router.post("/", checkAuthenticated, createFarm); // Create a new farm
|
||||
router.get("/", checkAuthenticated, getUserFarms); // Get all farms
|
||||
router.get("/:farmId", checkAuthenticated, getFarmById); // Get a farm by ID
|
||||
router.put("/:farmId", checkAuthenticated, updateFarm); // Update a farm
|
||||
router.delete("/:farmId", checkAuthenticated, deleteFarm); // Delete a farm
|
||||
|
||||
module.exports = router;
|
||||
@@ -1,24 +0,0 @@
|
||||
const express = require("express");
|
||||
const {
|
||||
addTransaction,
|
||||
createFinance,
|
||||
getFinanceByFarm,
|
||||
deleteTransaction,
|
||||
getTransactions,
|
||||
getFinancialSummary,
|
||||
} = require("../Controllers/finance.controller.js");
|
||||
const { checkAuthenticated } = require("../Middlewares/authentication.js");
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
// Routes for finance management
|
||||
router.post("/", checkAuthenticated, createFinance); // Create a new finance record
|
||||
router.get("/:farmId", checkAuthenticated, getFinanceByFarm); // Get all finance records
|
||||
router.get("/transactions/:financeId", checkAuthenticated, getTransactions); // Get a finance record by ID
|
||||
router.get("/summary/:financeId", checkAuthenticated, getFinancialSummary); //
|
||||
router.delete("/:financeId", checkAuthenticated, deleteTransaction); // Delete a finance record
|
||||
|
||||
// Add transactions (Expense/Revenue) to a finance record
|
||||
router.post("/:financeId/transaction", checkAuthenticated, addTransaction);
|
||||
|
||||
module.exports = router;
|
||||
@@ -1,25 +0,0 @@
|
||||
const { checkAuthenticated } = require("../Middlewares/authentication.js");
|
||||
|
||||
const express = require("express");
|
||||
const {
|
||||
createTask,
|
||||
getTasksByFarm,
|
||||
getTaskById,
|
||||
updateTask,
|
||||
deleteTask,
|
||||
updateTaskStatus,
|
||||
} = require("../Controllers/task.controller.js");
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
// Routes for task management
|
||||
router.post("/", checkAuthenticated, createTask); // Create a new task
|
||||
router.get("/farm/:farmId", checkAuthenticated, getTasksByFarm); // Get all tasks for a specific farm
|
||||
router.get("/:taskId", checkAuthenticated, getTaskById); // Get a task by ID
|
||||
router.put("/:taskId", checkAuthenticated, updateTask); // Update task details
|
||||
router.delete("/:taskId", checkAuthenticated, deleteTask); // Delete a task
|
||||
|
||||
// Update task status (Pending → Completed)
|
||||
router.patch("/:taskId/status", checkAuthenticated, updateTaskStatus);
|
||||
|
||||
module.exports = router;
|
||||
@@ -1,52 +0,0 @@
|
||||
const express = require("express");
|
||||
const {
|
||||
registerUser,
|
||||
loginUser,
|
||||
logoutUser,
|
||||
updateUserDetails,
|
||||
forgetPassword,
|
||||
resetPassword,
|
||||
getUserDetails,
|
||||
updatePassword,
|
||||
updatePersonalDetails,
|
||||
DeleteUser,
|
||||
updateUserRole,
|
||||
intializeUser,
|
||||
updateAvatar,
|
||||
} = require("../Controllers/user.controller.js");
|
||||
|
||||
const { checkAuthenticated } = require("../Middlewares/authentication.js");
|
||||
|
||||
const upload = require("../Middlewares/multer.js");
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
router.route("/register").post(registerUser);
|
||||
|
||||
router.route("/login").post(loginUser);
|
||||
|
||||
router.route("/password/forgot").post(forgetPassword);
|
||||
|
||||
router.route("/password/reset/:token").put(resetPassword);
|
||||
|
||||
router.route("/logout").get(logoutUser);
|
||||
|
||||
router.route("/update/:id").put(updateUserDetails);
|
||||
|
||||
router.route("/me").get(checkAuthenticated, getUserDetails);
|
||||
|
||||
router.route("/getuser").get(intializeUser);
|
||||
|
||||
router.route("/password/update").put(updatePassword);
|
||||
|
||||
router.route("/me/update").put(updatePersonalDetails);
|
||||
|
||||
router.route("/user/delete/:id").delete(DeleteUser);
|
||||
|
||||
router.route("/user/updateRole/:id").put(updateUserRole);
|
||||
|
||||
router
|
||||
.route("/user/avatar")
|
||||
.put(checkAuthenticated, upload.single("avatar"), updateAvatar);
|
||||
|
||||
module.exports = router;
|
||||
@@ -1,23 +0,0 @@
|
||||
const cloudinary = require("cloudinary").v2;
|
||||
const fs = require("fs");
|
||||
|
||||
const uploadOnCloudinary = async (localFilePath) => {
|
||||
try {
|
||||
if (!localFilePath) return null;
|
||||
|
||||
const responce = await cloudinary.uploader.upload(localFilePath, {
|
||||
resource_type: "auto",
|
||||
});
|
||||
|
||||
// console.log("File is uploaded successfully");
|
||||
fs.unlinkSync(localFilePath, () => {
|
||||
console.log("file removed successfully");
|
||||
});
|
||||
return responce.url;
|
||||
} catch (error) {
|
||||
fs.unlinkSync(localFilePath);
|
||||
console.log("file removed successfully");
|
||||
return null;
|
||||
}
|
||||
};
|
||||
module.exports = { uploadOnCloudinary };
|
||||
@@ -1,357 +0,0 @@
|
||||
// const {
|
||||
// GoogleGenerativeAI,
|
||||
// HarmCategory,
|
||||
// HarmBlockThreshold,
|
||||
// } = require("@google/generative-ai");
|
||||
// const {
|
||||
// GoogleGenerativeAI,
|
||||
// HarmCategory,
|
||||
// HarmBlockThreshold,
|
||||
// } = require("@google/generative-ai");
|
||||
// const dotenv = require("dotenv");
|
||||
|
||||
// dotenv.config({
|
||||
// path: "./.env",
|
||||
// });
|
||||
|
||||
// const apiKey = process.env.GEMINI_API_KEY;
|
||||
// const genAI = new GoogleGenerativeAI(apiKey);
|
||||
|
||||
// const model = genAI.getGenerativeModel({
|
||||
// model: "gemini-2.0-flash",
|
||||
// });
|
||||
|
||||
// const generationConfig = {
|
||||
// temperature: 1,
|
||||
// topP: 0.95,
|
||||
// topK: 40,
|
||||
// maxOutputTokens: 8192,
|
||||
// responseMimeType: "text/plain",
|
||||
// };
|
||||
|
||||
// export async function run(message) {
|
||||
// const chatSession = model.startChat({
|
||||
// generationConfig,
|
||||
// history: [
|
||||
// {
|
||||
// role: "user",
|
||||
// parts: [
|
||||
// {
|
||||
// text: "AI Model Guidelines:\n\nContext Restriction: Only provide answers based on the content available on [Your Website Name]. Do not generate responses unrelated to the website's information.\nNo External Knowledge: If a user asks about a topic outside the website’s scope, politely inform them that you can only assist with website-related queries.\nSafe & Ethical Responses: Do not answer harmful, illegal, controversial, or inappropriate questions. If such a query is detected, respond with a neutral message stating that the request cannot be fulfilled.\nAccuracy & Clarity: Ensure responses are factual, clear, and helpful, directly referencing available website data without assumptions or speculation.\n\nGreeting should be similar lto this :\nHello! 👋\nI’m here to assist you with information available on [Your Website Name]. Here’s what I can do:\n\n✅ Answer questions based on the content from this website.\n✅ Guide you through available services, features, and resources.\n✅ Help you navigate and find what you need.\n\nuse emoji when you feel like it makes sense and increases the user understanding",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// {
|
||||
// role: "model",
|
||||
// parts: [
|
||||
// {
|
||||
// text: "Hello! 👋\n\nI’m here to assist you with information available on [Your Website Name]. Here’s what I can do:\n\n✅ Answer questions based on the content from this website.\n✅ Guide you through available services, features, and resources.\n✅ Help you navigate and find what you need.\n\nHow can I help you today? 😃\n",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// {
|
||||
// role: "user",
|
||||
// parts: [{ text: "forget everythings until now " }],
|
||||
// },
|
||||
// {
|
||||
// role: "model",
|
||||
// parts: [
|
||||
// {
|
||||
// text: "Understood. I am now reset and ready to assist you with information available on [Your Website Name], adhering to the guidelines. How can I help you?\n",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// {
|
||||
// role: "user",
|
||||
// parts: [
|
||||
// {
|
||||
// text: "you will get some json or js object which will be some questions related to farming, you have to answer those questions and give proper description which is neccessary for a farmer to have if you recommend some kind of poisonous pestiside or something give a small warning and some things to keep some precausetions, dont answer anything unrelated to farming and strictly avoid harmful topics like war or viiolence, if farmer wants to kill pestisides then thats ok but anything else is not \n ",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// {
|
||||
// role: "model",
|
||||
// parts: [
|
||||
// {
|
||||
// text: "Understood. I will answer questions related to farming based on the content available on [Your Website Name]. I will provide detailed descriptions where necessary, including precautions when recommending potentially harmful pesticides. I will strictly avoid topics unrelated to farming or any harmful subjects. Please provide the JSON or JS object containing the questions. I'm ready! 🚜\n",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// {
|
||||
// role: "user",
|
||||
// parts: [
|
||||
// {
|
||||
// text: "keep the warning and precuastions short, and you are not a chatbot you are a data processing unit who will have the data and analyze it and answer accordingly\n ",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// {
|
||||
// role: "model",
|
||||
// parts: [
|
||||
// {
|
||||
// text: "Understood. I will function as a data processing unit, analyzing the provided data related to farming and answering questions with concise warnings and precautions where applicable. I will not engage in conversational chatbot behavior. Please provide the data. I'm ready to process! 👩🌾\n",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// ],
|
||||
// });
|
||||
|
||||
// const result = await chatSession.sendMessage(message);
|
||||
// console.log(result.response.text());
|
||||
// }
|
||||
|
||||
// const {
|
||||
// GoogleGenerativeAI,
|
||||
// HarmCategory,
|
||||
// HarmBlockThreshold,
|
||||
// } = require("@google/generative-ai");
|
||||
// const apiKey = "AIzaSyDsXug23r4umgcJpj77KeqNyYW0hQnYDgg";
|
||||
// const genAI = new GoogleGenerativeAI(apiKey);
|
||||
// const model = genAI.getGenerativeModel({
|
||||
// model: "gemini-2.0-flash",
|
||||
// });
|
||||
// const generationConfig = {
|
||||
// temperature: 1,
|
||||
// topP: 0.95,
|
||||
// topK: 40,
|
||||
// maxOutputTokens: 8192,
|
||||
// responseMimeType: "text/plain",
|
||||
// };
|
||||
// async function run(message) {
|
||||
// const chatSession = model.startChat({
|
||||
// generationConfig,
|
||||
// history: [
|
||||
// {
|
||||
// role: "user",
|
||||
// parts: [
|
||||
// {
|
||||
// text: "you will get some json or js object which will be some questions related to farming, you have to answer those questions and give proper description which is neccessary for a farmer to have if you recommend some kind of poisonous pestiside or something give a small warning and some things to keep some precausetions, dont answer anything unrelated to farming and strictly avoid harmful topics like war or viiolence, if farmer wants to kill pestisides then thats ok but anything else is not \n ",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// {
|
||||
// role: "model",
|
||||
// parts: [
|
||||
// {
|
||||
// text: "Understood. I will answer questions related to farming based on the content available on [Your Website Name]. I will provide detailed descriptions where necessary, including precautions when recommending potentially harmful pesticides. I will strictly avoid topics unrelated to farming or any harmful subjects. Please provide the JSON or JS object containing the questions. I'm ready! 🚜\n",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// {
|
||||
// role: "user",
|
||||
// parts: [
|
||||
// {
|
||||
// text: "keep the warning and precuastions short, and you are not a chatbot you are a data processing unit who will have the data and analyze it and answer accordingly\n ",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// {
|
||||
// role: "model",
|
||||
// parts: [
|
||||
// {
|
||||
// text: "Understood. I will function as a data processing unit, analyzing the provided data related to farming and answering questions with concise warnings and precautions where applicable. I will not engage in conversational chatbot behavior. Please provide the data. I'm ready to process! 👩🌾\n",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// ],
|
||||
// });
|
||||
// const result = await chatSession.sendMessage(message);
|
||||
// console.log(result.response.text());
|
||||
// }
|
||||
// run("How we check the farmes soil type ? ");
|
||||
|
||||
// const {
|
||||
// GoogleGenerativeAI,
|
||||
// HarmCategory,
|
||||
// HarmBlockThreshold,
|
||||
// } = require("@google/generative-ai");
|
||||
|
||||
// const apiKey = "AIzaSyDsXug23r4umgcJpj77KeqNyYW0hQnYDgg";
|
||||
// const genAI = new GoogleGenerativeAI(apiKey);
|
||||
|
||||
// const model = genAI.getGenerativeModel({
|
||||
// model: "gemini-2.0-flash",
|
||||
// });
|
||||
|
||||
// const generationConfig = {
|
||||
// temperature: 1,
|
||||
// topP: 0.95,
|
||||
// topK: 40,
|
||||
// maxOutputTokens: 8192,
|
||||
// responseMimeType: "text/plain",
|
||||
// };
|
||||
|
||||
// async function run(message) {
|
||||
// const chatSession = model.startChat({
|
||||
// generationConfig,
|
||||
// history: [
|
||||
// {
|
||||
// role: "user",
|
||||
// parts: [
|
||||
// {
|
||||
// text: "AI Guidelines:\n- The AI must only provide answers related to farming, including crops, sowing, irrigation, harvesting, fertilizers, pesticides, soil health, and climate conditions. \n- The AI must not answer anything outside farming. \n- If asked an unrelated question, the AI must not respond. \n- If the query is unclear, the AI must default to farming-related guidance. \n- The AI must provide only one-line responses without extra details. \n- No harmful, hurtful, or controversial responses. \n- No advice on illegal, unsafe, or unethical farming practices.\n",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// {
|
||||
// role: "model",
|
||||
// parts: [
|
||||
// {
|
||||
// text: "Understood. I will only provide one-line responses directly related to farming.\n",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// ],
|
||||
// });
|
||||
|
||||
// const result = await chatSession.sendMessage(message);
|
||||
// console.log(result.response.text());
|
||||
// }
|
||||
|
||||
// const {
|
||||
// GoogleGenerativeAI,
|
||||
// HarmCategory,
|
||||
// HarmBlockThreshold,
|
||||
// } = require("@google/generative-ai");
|
||||
|
||||
// const apiKey = "AIzaSyDsXug23r4umgcJpj77KeqNyYW0hQnYDgg";
|
||||
// const genAI = new GoogleGenerativeAI(apiKey);
|
||||
|
||||
// const model = genAI.getGenerativeModel({
|
||||
// model: "gemini-2.0-flash",
|
||||
// });
|
||||
|
||||
// const generationConfig = {
|
||||
// temperature: 1,
|
||||
// topP: 0.95,
|
||||
// topK: 40,
|
||||
// maxOutputTokens: 8192,
|
||||
// responseMimeType: "text/plain",
|
||||
// };
|
||||
|
||||
// async function run() {
|
||||
// const chatSession = model.startChat({
|
||||
// generationConfig,
|
||||
// history: [
|
||||
// {
|
||||
// role: "user",
|
||||
// parts: [
|
||||
// {
|
||||
// text: "AI Guidelines:\n- The AI must only provide answers related to farming, including crops, sowing, irrigation, harvesting, fertilizers, pesticides, soil health, and climate conditions. \n- The AI must not answer anything outside farming. \n- If asked an unrelated question, the AI must not respond. \n- If the query is unclear, the AI must default to farming-related guidance. \n- The AI must provide only one-line responses without extra details. \n- No harmful, hurtful, or controversial responses. \n- No advice on illegal, unsafe, or unethical farming practices.\n",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// {
|
||||
// role: "model",
|
||||
// parts: [
|
||||
// {
|
||||
// text: "Understood. I will only provide one-line responses directly related to farming.\n",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// {
|
||||
// role: "user",
|
||||
// parts: [
|
||||
// {
|
||||
// text: "you can also receive json or javascript object as an input ",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// {
|
||||
// role: "model",
|
||||
// parts: [
|
||||
// {
|
||||
// text: "Understood. I will process the JSON or JavaScript object only if it pertains to farming and respond with a single line.\n",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// ],
|
||||
// });
|
||||
|
||||
// const result = await chatSession.sendMessage("INSERT_INPUT_HERE");
|
||||
// console.log(result.response.text());
|
||||
// }
|
||||
|
||||
const {
|
||||
GoogleGenerativeAI,
|
||||
HarmCategory,
|
||||
HarmBlockThreshold,
|
||||
} = require("@google/generative-ai");
|
||||
|
||||
const apiKey = "AIzaSyDsXug23r4umgcJpj77KeqNyYW0hQnYDgg";
|
||||
const genAI = new GoogleGenerativeAI(apiKey);
|
||||
|
||||
const model = genAI.getGenerativeModel({
|
||||
model: "gemini-2.0-flash",
|
||||
});
|
||||
|
||||
const generationConfig = {
|
||||
temperature: 1,
|
||||
topP: 0.95,
|
||||
topK: 40,
|
||||
maxOutputTokens: 8192,
|
||||
responseMimeType: "text/plain",
|
||||
};
|
||||
|
||||
async function run(message) {
|
||||
const chatSession = model.startChat({
|
||||
generationConfig,
|
||||
history: [
|
||||
{
|
||||
role: "user",
|
||||
parts: [
|
||||
{
|
||||
text: "AI Guidelines:\n- The AI must only provide answers related to farming, including crops, sowing, irrigation, harvesting, fertilizers, pesticides, soil health, and climate conditions. \n- The AI must not answer anything outside farming. \n- If asked an unrelated question, the AI must not respond. \n- If the query is unclear, the AI must default to farming-related guidance. \n- The AI must provide only one-line responses without extra details. \n- No harmful, hurtful, or controversial responses. \n- No advice on illegal, unsafe, or unethical farming practices.\n",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
role: "model",
|
||||
parts: [
|
||||
{
|
||||
text: "Understood. I will only provide one-line responses directly related to farming.\n",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
role: "user",
|
||||
parts: [
|
||||
{
|
||||
text: "you can also receive json or javascript object as an input ",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
role: "model",
|
||||
parts: [
|
||||
{
|
||||
text: "Understood. I will process the JSON or JavaScript object only if it pertains to farming and respond with a single line.\n",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
role: "user",
|
||||
parts: [
|
||||
{
|
||||
text: "Answer everything which falls under the farming and agriculture even if the prompt does not include any farm or agriculture word in it",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
role: "model",
|
||||
parts: [
|
||||
{
|
||||
text: "Understood. I will assume all queries are related to farming and provide a one-line farming-related response.\n",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
const result = await chatSession.sendMessage(message);
|
||||
console.log(result.response.text());
|
||||
}
|
||||
|
||||
module.exports = { run };
|
||||
|
||||
// run("Sowing start and harvesting end which crop ?");
|
||||
@@ -1,25 +0,0 @@
|
||||
const nodemailer = require("nodemailer");
|
||||
|
||||
const sendEmail = async (options) => {
|
||||
const transporter = await nodemailer.createTransport({
|
||||
service: "gmail",
|
||||
host: process.env.HOST,
|
||||
port: process.env.EMAIL_PORT,
|
||||
secure: false,
|
||||
auth: {
|
||||
user: process.env.SMPT_MAIL, // senders email
|
||||
pass: process.env.SMPT_PASSWORD, // app passoword created for your app by using step :: google account> manage your google account >security>enable two step verification > search app password and create password for your app
|
||||
},
|
||||
});
|
||||
|
||||
const mailOptions = {
|
||||
from: "",
|
||||
to: options.email,
|
||||
subject: options.subject,
|
||||
text: options.message,
|
||||
};
|
||||
|
||||
await transporter.sendMail(mailOptions);
|
||||
};
|
||||
|
||||
module.exports = sendEmail;
|
||||
@@ -1,48 +0,0 @@
|
||||
const express = require("express");
|
||||
const cors = require("cors");
|
||||
const cookieParser = require("cookie-parser");
|
||||
|
||||
const userRoute = require("./Routes/user.routes.js");
|
||||
const farmRoute = require("./Routes/farm.routes.js");
|
||||
const cropRoute = require("./Routes/crop.routes.js");
|
||||
const financeRoute = require("./Routes/finance.routes.js");
|
||||
const taskRoute = require("./Routes/task.routes.js");
|
||||
const { checkAuthenticated } = require("./Middlewares/authentication.js");
|
||||
const dotenv = require("dotenv");
|
||||
const { run } = require("./Utils/model.js");
|
||||
|
||||
dotenv.config({
|
||||
path: "./.env",
|
||||
});
|
||||
|
||||
const app = express();
|
||||
|
||||
const corsOptions = {
|
||||
origin: process.env.FRONTEND_URI,
|
||||
methods: "GET,HEAD,PUT,PATCH,POST,DELETE",
|
||||
credentials: true,
|
||||
};
|
||||
|
||||
app.use(cors(corsOptions));
|
||||
app.use(express.json({ limit: "16kb" }));
|
||||
app.use(express.urlencoded({ extended: true, limit: "16kb" }));
|
||||
app.use(express.static("public"));
|
||||
app.use(cookieParser());
|
||||
|
||||
app.get("/", (req, res) => {
|
||||
return res.send("Hiddskpkpk...");
|
||||
});
|
||||
|
||||
app.use("/api/v1", userRoute);
|
||||
|
||||
app.use("/api/v1/farm", farmRoute);
|
||||
|
||||
app.use("/api/v1/crop", cropRoute);
|
||||
|
||||
app.use("/api/v1/finance", financeRoute);
|
||||
|
||||
app.use("/api/v1/task", taskRoute);
|
||||
|
||||
|
||||
|
||||
module.exports = app;
|
||||
@@ -1,24 +0,0 @@
|
||||
const server = require("./app.js");
|
||||
const dotenv = require("dotenv");
|
||||
const cloudinary = require("cloudinary").v2;
|
||||
const DB_connect = require("./Database/DB_connect.js");
|
||||
const app = require("./app.js");
|
||||
|
||||
// dotenv Configuration
|
||||
dotenv.config({
|
||||
path: "./.env",
|
||||
});
|
||||
|
||||
cloudinary.config({
|
||||
cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
|
||||
api_key: process.env.CLOUDINARY_API_KEY,
|
||||
api_secret: process.env.CLOUDINARY_API_SECRET,
|
||||
});
|
||||
|
||||
DB_connect();
|
||||
|
||||
// Listening the port
|
||||
app.listen(process.env.PORT, () => {
|
||||
console.log("Server is Running on ", process.env.PORT);
|
||||
console.log("Frontend URI : ", process.env.FRONTEND_URI);
|
||||
});
|
||||
@@ -1,32 +0,0 @@
|
||||
{
|
||||
"name": "backend",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1",
|
||||
"dev": "nodemon index.js"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"description": "",
|
||||
"dependencies": {
|
||||
"@google/generative-ai": "^0.22.0",
|
||||
"@huggingface/transformers": "^3.3.3",
|
||||
"@xenova/transformers": "^2.17.2",
|
||||
"bcrypt": "^5.1.1",
|
||||
"cloudinary": "^2.5.1",
|
||||
"cookie-parser": "^1.4.6",
|
||||
"cors": "^2.8.5",
|
||||
"dotenv": "^16.4.5",
|
||||
"express": "^4.19.2",
|
||||
"jimp": "^1.6.0",
|
||||
"jsonwebtoken": "^9.0.2",
|
||||
"mongoose": "^8.6.1",
|
||||
"multer": "^1.4.5-lts.1",
|
||||
"nodemailer": "^6.9.15",
|
||||
"socket.io": "^4.7.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"nodemon": "^3.1.4"
|
||||
}
|
||||
}
|
||||
@@ -1,31 +0,0 @@
|
||||
import { pipeline } from "@xenova/transformers";
|
||||
import Jimp from "jimp";
|
||||
|
||||
async function main() {
|
||||
const modelName = "Xenova/distilbert-base-uncased-finetuned-sst-2-english"; // Example model
|
||||
|
||||
// Load the model
|
||||
const classifier = await pipeline("image-classification", modelName);
|
||||
|
||||
// Load the image
|
||||
let image;
|
||||
try {
|
||||
image = await Jimp.read("/home/karan/Downloads/tomato.png");
|
||||
image.rgba(true);
|
||||
} catch (error) {
|
||||
console.error("Error: Unable to open image. Check the file type or path.");
|
||||
console.error(error);
|
||||
return;
|
||||
}
|
||||
|
||||
// Convert image to buffer
|
||||
const buffer = await image.getBufferAsync(Jimp.MIME_PNG);
|
||||
|
||||
// Classify the image
|
||||
const result = await classifier(buffer);
|
||||
|
||||
console.log("Predicted class:", result);
|
||||
}
|
||||
|
||||
main().catch(console.error);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Status200
|
||||
|
||||
Frontend branch for testing.
|
||||
Ombase's frontend branch.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,119 +0,0 @@
|
||||
{
|
||||
"name": "git repo",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"node_modules/@yr/monotone-cubic-spline": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz",
|
||||
"integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/apexcharts": {
|
||||
"version": "3.46.0",
|
||||
"resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.46.0.tgz",
|
||||
"integrity": "sha512-ELAY6vj8JQD7QLktKasTzwm9Wt0qxqfQSo+3QWS7G7I774iK8HCkG1toGsqJH0mkK6PtYBtnSIe66uUcwoCw1w==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@yr/monotone-cubic-spline": "^1.0.3",
|
||||
"svg.draggable.js": "^2.2.2",
|
||||
"svg.easing.js": "^2.0.0",
|
||||
"svg.filter.js": "^2.0.2",
|
||||
"svg.pathmorphing.js": "^0.1.3",
|
||||
"svg.resize.js": "^1.4.3",
|
||||
"svg.select.js": "^3.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/svg.draggable.js": {
|
||||
"version": "2.2.2",
|
||||
"resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz",
|
||||
"integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"svg.js": "^2.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/svg.easing.js": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz",
|
||||
"integrity": "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"svg.js": ">=2.3.x"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/svg.filter.js": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz",
|
||||
"integrity": "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"svg.js": "^2.2.5"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/svg.js": {
|
||||
"version": "2.7.1",
|
||||
"resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz",
|
||||
"integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/svg.pathmorphing.js": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz",
|
||||
"integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"svg.js": "^2.4.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/svg.resize.js": {
|
||||
"version": "1.4.3",
|
||||
"resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz",
|
||||
"integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"svg.js": "^2.6.5",
|
||||
"svg.select.js": "^2.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/svg.resize.js/node_modules/svg.select.js": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz",
|
||||
"integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"svg.js": "^2.2.5"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/svg.select.js": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz",
|
||||
"integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"svg.js": "^2.6.5"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
.DS_Store
|
||||
.git*
|
||||
test
|
||||
package-lock.json
|
||||
@@ -1,5 +0,0 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- "4"
|
||||
- "6"
|
||||
sudo: false
|
||||
@@ -1,20 +0,0 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 yr.no
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
@@ -1,23 +0,0 @@
|
||||
[](https://npmjs.org/package/@yr/monotone-cubic-spline)
|
||||
[](https://travis-ci.org/YR/monotone-cubic-spline?branch=master)
|
||||
|
||||
Convert a series of points to a monotone cubic spline (based on D3.js implementation)
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
const spline = require('@yr/monotone-cubic-spline');
|
||||
const points = spline.points([[0,0], [1,1], [2,1], [3,0], [4,0]]);
|
||||
const svgPath = spline.svgPath(points);
|
||||
|
||||
console.log(svgPath);
|
||||
// => 'M0 0C0.08333333333333333, 0.08333333333333333, ...'
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
**points(points)**: convert array of points (x,y) to array of bezier points (c1x,c1y,c2x,c2y,x,y)
|
||||
|
||||
**slice(points, start, end)**: slice a segment of converted points
|
||||
|
||||
**svgPath(points)**: convert array of bezier points to svg path (`d`) string
|
||||
@@ -1,166 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Convert a series of points to a monotone cubic spline
|
||||
* Algorithm based on https://github.com/mbostock/d3
|
||||
* https://github.com/yr/monotone-cubic-spline
|
||||
* @copyright Yr
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
var ε = 1e-6;
|
||||
|
||||
module.exports = {
|
||||
/**
|
||||
* Convert 'points' to bezier
|
||||
* @param {Array} points
|
||||
* @returns {Array}
|
||||
*/
|
||||
points: function points(_points) {
|
||||
var tgts = tangents(_points);
|
||||
|
||||
var p = _points[1];
|
||||
var p0 = _points[0];
|
||||
var pts = [];
|
||||
var t = tgts[1];
|
||||
var t0 = tgts[0];
|
||||
|
||||
// Add starting 'M' and 'C' points
|
||||
pts.push(p0, [p0[0] + t0[0], p0[1] + t0[1], p[0] - t[0], p[1] - t[1], p[0], p[1]]);
|
||||
|
||||
// Add 'S' points
|
||||
for (var i = 2, n = tgts.length; i < n; i++) {
|
||||
var _p = _points[i];
|
||||
var _t = tgts[i];
|
||||
|
||||
pts.push([_p[0] - _t[0], _p[1] - _t[1], _p[0], _p[1]]);
|
||||
}
|
||||
|
||||
return pts;
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* Slice out a segment of 'points'
|
||||
* @param {Array} points
|
||||
* @param {Number} start
|
||||
* @param {Number} end
|
||||
* @returns {Array}
|
||||
*/
|
||||
slice: function slice(points, start, end) {
|
||||
var pts = points.slice(start, end);
|
||||
|
||||
if (start) {
|
||||
// Add additional 'C' points
|
||||
if (pts[1].length < 6) {
|
||||
var n = pts[0].length;
|
||||
|
||||
pts[1] = [pts[0][n - 2] * 2 - pts[0][n - 4], pts[0][n - 1] * 2 - pts[0][n - 3]].concat(pts[1]);
|
||||
}
|
||||
// Remove control points for 'M'
|
||||
pts[0] = pts[0].slice(-2);
|
||||
}
|
||||
|
||||
return pts;
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* Convert 'points' to svg path
|
||||
* @param {Array} points
|
||||
* @returns {String}
|
||||
*/
|
||||
svgPath: function svgPath(points) {
|
||||
var p = '';
|
||||
|
||||
for (var i = 0; i < points.length; i++) {
|
||||
var point = points[i];
|
||||
var n = point.length;
|
||||
|
||||
if (!i) {
|
||||
p += 'M' + point[n - 2] + ' ' + point[n - 1];
|
||||
} else if (n > 4) {
|
||||
p += 'C' + point[0] + ', ' + point[1];
|
||||
p += ', ' + point[2] + ', ' + point[3];
|
||||
p += ', ' + point[4] + ', ' + point[5];
|
||||
} else {
|
||||
p += 'S' + point[0] + ', ' + point[1];
|
||||
p += ', ' + point[2] + ', ' + point[3];
|
||||
}
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Generate tangents for 'points'
|
||||
* @param {Array} points
|
||||
* @returns {Array}
|
||||
*/
|
||||
function tangents(points) {
|
||||
var m = finiteDifferences(points);
|
||||
var n = points.length - 1;
|
||||
|
||||
var tgts = [];
|
||||
var a = void 0,
|
||||
b = void 0,
|
||||
d = void 0,
|
||||
s = void 0;
|
||||
|
||||
for (var i = 0; i < n; i++) {
|
||||
d = slope(points[i], points[i + 1]);
|
||||
|
||||
if (Math.abs(d) < ε) {
|
||||
m[i] = m[i + 1] = 0;
|
||||
} else {
|
||||
a = m[i] / d;
|
||||
b = m[i + 1] / d;
|
||||
s = a * a + b * b;
|
||||
if (s > 9) {
|
||||
s = d * 3 / Math.sqrt(s);
|
||||
m[i] = s * a;
|
||||
m[i + 1] = s * b;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (var _i = 0; _i <= n; _i++) {
|
||||
s = (points[Math.min(n, _i + 1)][0] - points[Math.max(0, _i - 1)][0]) / (6 * (1 + m[_i] * m[_i]));
|
||||
tgts.push([s || 0, m[_i] * s || 0]);
|
||||
}
|
||||
|
||||
return tgts;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute slope from point 'p0' to 'p1'
|
||||
* @param {Array} p0
|
||||
* @param {Array} p1
|
||||
* @returns {Number}
|
||||
*/
|
||||
function slope(p0, p1) {
|
||||
return (p1[1] - p0[1]) / (p1[0] - p0[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute three-point differences for 'points'
|
||||
* @param {Array} points
|
||||
* @returns {Array}
|
||||
*/
|
||||
function finiteDifferences(points) {
|
||||
var m = [];
|
||||
var p0 = points[0];
|
||||
var p1 = points[1];
|
||||
var d = m[0] = slope(p0, p1);
|
||||
var i = 1;
|
||||
|
||||
for (var n = points.length - 1; i < n; i++) {
|
||||
p0 = p1;
|
||||
p1 = points[i + 1];
|
||||
m[i] = (d + (d = slope(p0, p1))) * 0.5;
|
||||
}
|
||||
m[i] = d;
|
||||
|
||||
return m;
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
{
|
||||
"name": "@yr/monotone-cubic-spline",
|
||||
"description": "Convert a series of points to a monotone cubic spline",
|
||||
"version": "1.0.3",
|
||||
"author": "Alexander Pope <alexander.pope@nrk.no>",
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"babel-plugin-syntax-trailing-function-commas": "6.22.0",
|
||||
"babel-plugin-transform-async-generator-functions": "6.24.1",
|
||||
"babel-plugin-transform-async-to-generator": "6.24.1",
|
||||
"babel-plugin-transform-es2015-arrow-functions": "6.22.0",
|
||||
"babel-plugin-transform-es2015-block-scoped-functions": "6.22.0",
|
||||
"babel-plugin-transform-es2015-block-scoping": "6.24.1",
|
||||
"babel-plugin-transform-es2015-classes": "6.24.1",
|
||||
"babel-plugin-transform-es2015-computed-properties": "6.24.1",
|
||||
"babel-plugin-transform-es2015-destructuring": "6.23.0",
|
||||
"babel-plugin-transform-es2015-duplicate-keys": "6.24.1",
|
||||
"babel-plugin-transform-es2015-for-of": "6.23.0",
|
||||
"babel-plugin-transform-es2015-function-name": "6.24.1",
|
||||
"babel-plugin-transform-es2015-literals": "6.22.0",
|
||||
"babel-plugin-transform-es2015-object-super": "6.24.1",
|
||||
"babel-plugin-transform-es2015-parameters": "6.24.1",
|
||||
"babel-plugin-transform-es2015-shorthand-properties": "6.24.1",
|
||||
"babel-plugin-transform-es2015-spread": "6.22.0",
|
||||
"babel-plugin-transform-es2015-sticky-regex": "6.24.1",
|
||||
"babel-plugin-transform-es2015-template-literals": "6.22.0",
|
||||
"babel-plugin-transform-es2015-unicode-regex": "6.24.1",
|
||||
"babel-plugin-transform-es5-property-mutators": "6.24.1",
|
||||
"babel-plugin-transform-exponentiation-operator": "6.24.1",
|
||||
"babel-plugin-transform-object-rest-spread": "6.23.0",
|
||||
"buddy": "6.x.x",
|
||||
"expect.js": "*",
|
||||
"mocha": "*"
|
||||
},
|
||||
"main": "src/index.js",
|
||||
"repository": "https://github.com/YR/monotone-cubic-spline.git",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"prepublish": "buddy build",
|
||||
"test": "NODE_ENV=test mocha test/lib-test.js --reporter spec"
|
||||
},
|
||||
"browser": "index.js",
|
||||
"buddy": {
|
||||
"build": [
|
||||
{
|
||||
"input": "src/",
|
||||
"output": ".",
|
||||
"bundle": false,
|
||||
"version": "es5"
|
||||
},
|
||||
{
|
||||
"input": "src/index.js",
|
||||
"output": "test/lib.js"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,161 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Convert a series of points to a monotone cubic spline
|
||||
* Algorithm based on https://github.com/mbostock/d3
|
||||
* https://github.com/yr/monotone-cubic-spline
|
||||
* @copyright Yr
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
const ε = 1e-6;
|
||||
|
||||
module.exports = {
|
||||
/**
|
||||
* Convert 'points' to bezier
|
||||
* @param {Array} points
|
||||
* @returns {Array}
|
||||
*/
|
||||
points(points) {
|
||||
const tgts = tangents(points);
|
||||
|
||||
const p = points[1];
|
||||
const p0 = points[0];
|
||||
const pts = [];
|
||||
const t = tgts[1];
|
||||
const t0 = tgts[0];
|
||||
|
||||
// Add starting 'M' and 'C' points
|
||||
pts.push(p0, [p0[0] + t0[0], p0[1] + t0[1], p[0] - t[0], p[1] - t[1], p[0], p[1]]);
|
||||
|
||||
// Add 'S' points
|
||||
for (let i = 2, n = tgts.length; i < n; i++) {
|
||||
const p = points[i];
|
||||
const t = tgts[i];
|
||||
|
||||
pts.push([p[0] - t[0], p[1] - t[1], p[0], p[1]]);
|
||||
}
|
||||
|
||||
return pts;
|
||||
},
|
||||
|
||||
/**
|
||||
* Slice out a segment of 'points'
|
||||
* @param {Array} points
|
||||
* @param {Number} start
|
||||
* @param {Number} end
|
||||
* @returns {Array}
|
||||
*/
|
||||
slice(points, start, end) {
|
||||
const pts = points.slice(start, end);
|
||||
|
||||
if (start) {
|
||||
// Add additional 'C' points
|
||||
if (pts[1].length < 6) {
|
||||
const n = pts[0].length;
|
||||
|
||||
pts[1] = [pts[0][n - 2] * 2 - pts[0][n - 4], pts[0][n - 1] * 2 - pts[0][n - 3]].concat(pts[1]);
|
||||
}
|
||||
// Remove control points for 'M'
|
||||
pts[0] = pts[0].slice(-2);
|
||||
}
|
||||
|
||||
return pts;
|
||||
},
|
||||
|
||||
/**
|
||||
* Convert 'points' to svg path
|
||||
* @param {Array} points
|
||||
* @returns {String}
|
||||
*/
|
||||
svgPath(points) {
|
||||
let p = '';
|
||||
|
||||
for (let i = 0; i < points.length; i++) {
|
||||
const point = points[i];
|
||||
const n = point.length;
|
||||
|
||||
if (!i) {
|
||||
p += `M${point[n - 2]} ${point[n - 1]}`;
|
||||
} else if (n > 4) {
|
||||
p += `C${point[0]}, ${point[1]}`;
|
||||
p += `, ${point[2]}, ${point[3]}`;
|
||||
p += `, ${point[4]}, ${point[5]}`;
|
||||
} else {
|
||||
p += `S${point[0]}, ${point[1]}`;
|
||||
p += `, ${point[2]}, ${point[3]}`;
|
||||
}
|
||||
}
|
||||
|
||||
return p;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Generate tangents for 'points'
|
||||
* @param {Array} points
|
||||
* @returns {Array}
|
||||
*/
|
||||
function tangents(points) {
|
||||
const m = finiteDifferences(points);
|
||||
const n = points.length - 1;
|
||||
|
||||
const tgts = [];
|
||||
let a, b, d, s;
|
||||
|
||||
for (let i = 0; i < n; i++) {
|
||||
d = slope(points[i], points[i + 1]);
|
||||
|
||||
if (Math.abs(d) < ε) {
|
||||
m[i] = m[i + 1] = 0;
|
||||
} else {
|
||||
a = m[i] / d;
|
||||
b = m[i + 1] / d;
|
||||
s = a * a + b * b;
|
||||
if (s > 9) {
|
||||
s = d * 3 / Math.sqrt(s);
|
||||
m[i] = s * a;
|
||||
m[i + 1] = s * b;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i <= n; i++) {
|
||||
s = (points[Math.min(n, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));
|
||||
tgts.push([s || 0, m[i] * s || 0]);
|
||||
}
|
||||
|
||||
return tgts;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute slope from point 'p0' to 'p1'
|
||||
* @param {Array} p0
|
||||
* @param {Array} p1
|
||||
* @returns {Number}
|
||||
*/
|
||||
function slope(p0, p1) {
|
||||
return (p1[1] - p0[1]) / (p1[0] - p0[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Compute three-point differences for 'points'
|
||||
* @param {Array} points
|
||||
* @returns {Array}
|
||||
*/
|
||||
function finiteDifferences(points) {
|
||||
const m = [];
|
||||
let p0 = points[0];
|
||||
let p1 = points[1];
|
||||
let d = (m[0] = slope(p0, p1));
|
||||
let i = 1;
|
||||
|
||||
for (let n = points.length - 1; i < n; i++) {
|
||||
p0 = p1;
|
||||
p1 = points[i + 1];
|
||||
m[i] = (d + (d = slope(p0, p1))) * 0.5;
|
||||
}
|
||||
m[i] = d;
|
||||
|
||||
return m;
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2018 ApexCharts
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
@@ -1,230 +0,0 @@
|
||||
<p align="center"><img src="https://apexcharts.com/media/apexcharts-logo.png"></p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/apexcharts/apexcharts.js/blob/master/LICENSE"><img src="https://img.shields.io/badge/License-MIT-brightgreen.svg" alt="License"></a>
|
||||
<a href="https://travis-ci.com/apexcharts/apexcharts.js"><img src="https://api.travis-ci.com/apexcharts/apexcharts.js.svg?branch=master" alt="build" /></a>
|
||||
<img alt="downloads" src="https://img.shields.io/npm/dm/apexcharts.svg"/>
|
||||
<a href="https://www.npmjs.com/package/apexcharts"><img src="https://img.shields.io/npm/v/apexcharts.svg" alt="ver"></a>
|
||||
<img alt="size" src="https://badgen.net/bundlephobia/min/apexcharts?label=size">
|
||||
<a href="https://cdn.jsdelivr.net/npm/apexcharts@3.12.0/types/apexcharts.d.ts"><img src="https://badgen.net/npm/types/apexcharts"/></a>
|
||||
<a href="https://github.com/prettier/prettier"><img src="https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square" alt="prettier"></a>
|
||||
<a href="https://www.jsdelivr.com/package/npm/apexcharts"><img src="https://data.jsdelivr.com/v1/package/npm/apexcharts/badge" alt="jsdelivr" /></a>
|
||||
<a href="https://codeclimate.com/github/apexcharts/apexcharts.js"><img src="https://badgen.net/codeclimate/maintainability/apexcharts/apexcharts.js" /></a>
|
||||
<img src="https://badgen.net/codeclimate/tech-debt/apexcharts/apexcharts.js"/>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://twitter.com/intent/tweet?text=Create%20visualizations%20with%20this%20free%20and%20open-source%20JavaScript%20Chart%20library&url=https://www.apexcharts.com&hashtags=javascript,charts,visualizations,developers,apexcharts"><img src="https://img.shields.io/twitter/url/http/shields.io.svg?style=social"> </a>
|
||||
</p>
|
||||
|
||||
<p align="center">A modern JavaScript charting library that allows you to build interactive data visualizations with simple API and 100+ ready-to-use samples. Packed with the features that you expect, ApexCharts includes over a dozen chart types that deliver beautiful, responsive visualizations in your apps and dashboards. ApexCharts is an MIT-licensed open-source project that can be used in commercial and non-commercial projects.</p>
|
||||
|
||||
<p align="center"><a href="https://apexcharts.com/javascript-chart-demos/"><img
|
||||
src="https://apexcharts.com/media/apexcharts-banner.png"></a></p>
|
||||
|
||||
<br />
|
||||
|
||||
## Browsers support
|
||||
|
||||
| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br/>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br/>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br/>Safari | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br/> Edge | [<img src="https://user-images.githubusercontent.com/17712401/124668393-30772d00-de87-11eb-9360-3199c3b68b95.png" alt="IE" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br/> IE11 |
|
||||
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| 31+ ✔ | 35+ ✔ | 6+ ✔ | Edge ✔ | [(IE11)](#using-it-with-ie11) ✔ |
|
||||
|
||||
## Download and Installation
|
||||
|
||||
##### Installing via npm
|
||||
|
||||
```bash
|
||||
npm install apexcharts --save
|
||||
```
|
||||
|
||||
##### Direct <script> include
|
||||
|
||||
```html
|
||||
<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
|
||||
```
|
||||
|
||||
## Wrappers for Vue/React/Angular/Stencil
|
||||
|
||||
Integrate easily with 3rd party frameworks
|
||||
|
||||
- [vue-apexcharts](https://github.com/apexcharts/vue-apexcharts)
|
||||
- [react-apexcharts](https://github.com/apexcharts/react-apexcharts)
|
||||
- [ng-apexcharts](https://github.com/apexcharts/ng-apexcharts) - Plugin by [Morris Janatzek](https://morrisj.net/)
|
||||
- [stencil-apexcharts](https://github.com/apexcharts/stencil-apexcharts)
|
||||
|
||||
### Unofficial Wrappers
|
||||
|
||||
Useful links to wrappers other than the popular frameworks mentioned above
|
||||
|
||||
- [apexcharter](https://github.com/dreamRs/apexcharter) - Htmlwidget for ApexCharts
|
||||
- [apexcharts.rb](https://github.com/styd/apexcharts.rb) - Ruby wrapper for ApexCharts
|
||||
- [larapex-charts](https://github.com/ArielMejiaDev/larapex-charts) - Laravel wrapper for ApexCharts
|
||||
- [blazor-apexcharts](https://github.com/apexcharts/Blazor-ApexCharts) - Blazor wrapper for ApexCharts [demo](https://apexcharts.github.io/Blazor-ApexCharts/)
|
||||
- [svelte-apexcharts](https://github.com/galkatz373/svelte-apexcharts) - Svelte wrapper for ApexCharts
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
import ApexCharts from 'apexcharts'
|
||||
```
|
||||
|
||||
To create a basic bar chart with minimal configuration, write as follows:
|
||||
|
||||
```js
|
||||
var options = {
|
||||
chart: {
|
||||
type: 'bar'
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: 'sales',
|
||||
data: [30, 40, 35, 50, 49, 60, 70, 91, 125]
|
||||
}
|
||||
],
|
||||
xaxis: {
|
||||
categories: [1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999]
|
||||
}
|
||||
}
|
||||
|
||||
var chart = new ApexCharts(document.querySelector('#chart'), options)
|
||||
chart.render()
|
||||
```
|
||||
|
||||
This will render the following chart
|
||||
|
||||
<p align="center"><a href="https://apexcharts.com/javascript-chart-demos/column-charts/"><img src="https://apexcharts.com/media/first-bar-chart.svg"></a></p>
|
||||
|
||||
### A little more than the basic
|
||||
|
||||
You can create a combination of different charts, sync them and give your desired look with unlimited possibilities.
|
||||
Below is an example of synchronized charts with github style.
|
||||
|
||||
<p align="center"><a href="https://apexcharts.com/javascript-chart-demos/area-charts/github-style/"><img src="https://apexcharts.com/media/github-charts.gif"></a></p>
|
||||
|
||||
## Interactivity
|
||||
|
||||
Zoom, Pan, and Scroll through data. Make selections and load other charts using those selections.
|
||||
An example showing some interactivity
|
||||
|
||||
<p align="center"><a href="https://codepen.io/apexcharts/pen/QrbEQg" target="_blank"><img src="https://apexcharts.com/media/interactivity.gif" alt="interactive chart"></a></p>
|
||||
|
||||
## Dynamic Series Update
|
||||
|
||||
Another approach is to Drill down charts where one selection updates the data of other charts.
|
||||
An example of loading dynamic series into charts is shown below
|
||||
|
||||
<p align="center"><a href="https://apexcharts.com/javascript-chart-demos/column-charts/dynamic-loaded-chart/"><img src="https://apexcharts.com/media/dynamic-selection.gif" alt="dynamic-loading-chart" /></a></p>
|
||||
|
||||
## Annotations
|
||||
|
||||
Annotations allow you to write custom text on specific values or on axes values. Valuable to expand the visual appeal of your chart and make it more informative.
|
||||
|
||||
<p align="center"><a href="https://apexcharts.com/docs/annotations/"><img src="https://apexcharts.com/media/annotations.png" alt="annotations" /></a></p>
|
||||
|
||||
## Mixed Charts
|
||||
|
||||
You can combine more than one chart type to create a combo/mixed chart. Possible combinations can be line/area/column together in a single chart. Each chart type can have its own y-axis.
|
||||
|
||||
<p align="center"><a href="https://apexcharts.com/javascript-chart-demos/mixed-charts/"><img src="https://apexcharts.com/wp-content/uploads/2018/05/line-column-area-mixed-chart.svg" alt="annotations" width="490" /></a></p>
|
||||
|
||||
## Candlestick
|
||||
|
||||
Use a candlestick chart (a common financial chart) to describe price changes of a security, derivative, or currency. The below image shows how you can use another chart as a brush/preview pane which acts as a handle to browse the main candlestick chart.
|
||||
|
||||
<p align="center"><a href="https://apexcharts.com/javascript-chart-demos/candlestick-charts/"><img src="https://apexcharts.com/media/candlestick.png" alt="candlestick" width="490" /></a></p>
|
||||
|
||||
## Heatmaps
|
||||
|
||||
Use Heatmaps to represent data through colors and shades. Frequently used with bigger data collections, they are valuable for recognizing patterns and areas of focus.
|
||||
|
||||
<p align="center"><a href="https://apexcharts.com/javascript-chart-demos/heatmap-charts/"><img src="https://apexcharts.com/media/heatmap-charts.png" alt="heatmap" /></a></p>
|
||||
|
||||
## Gauges
|
||||
|
||||
The tiny gauges are an important part of a dashboard and are useful in displaying single-series data. A demo of these gauges:
|
||||
|
||||
<p align="center"><a href="https://apexcharts.com/javascript-chart-demos/radialbar-charts/"><img src="https://apexcharts.com/media/radialbars-gauges.png" width="490" alt="radialbar-chart" /></a></p>
|
||||
|
||||
## Sparklines
|
||||
|
||||
Utilize sparklines to indicate trends in data, for example, occasional increments or declines, monetary cycles, or to feature the most extreme and least values:
|
||||
|
||||
<p align="center"><a href="https://apexcharts.com/javascript-chart-demos/sparklines/"><img src="https://apexcharts.com/media/sparklines.png" alt="sparkline-chart" /></a></p>
|
||||
|
||||
|
||||
## Need Advanced Data Grid for your next project?
|
||||
We partnered with Infragistics, creators of the fastest data grids on the planet! Ignite UI Grids can handle unlimited rows and columns of data while providing access to custom templates and real-time data updates.
|
||||
|
||||
<p align="center"><a href="https://www.infragistics.com/products/ignite-ui-angular/angular/components/grid/grid" target="_blank"><img src="https://apexcharts.com/media/infragistics-data-grid.png" /></a></p>
|
||||
|
||||
Featuring an intuitive API for easy theming and branding, you can quickly bind to data with minimal hand-on coding. The grid is available in most of your favorite frameworks:
|
||||
|
||||
<a target="_blank" href="https://www.infragistics.com/products/ignite-ui-angular/angular/components/grid/grid">Angular Data Grid</a> | <a target="_blank" href="https://www.infragistics.com/products/ignite-ui-react/react/components/grids">React Data Grid</a> | <a target="_blank" href="https://www.infragistics.com/products/ignite-ui-blazor/blazor/components/data-grid">Blazor Data Grid</a> | <a target="_blank" href="https://www.infragistics.com/products/ignite-ui-web-components/web-components/components/data-grid">Web Components DataGrid</a> | <a target="_blank" href="https://www.igniteui.com/grid/overview">jQuery Data Grid </a>
|
||||
|
||||
## What's included
|
||||
|
||||
The download bundle includes the following files and directories providing a minified single file in the dist folder. Every asset including icon/css is bundled in the js itself to avoid loading multiple files.
|
||||
|
||||
```
|
||||
apexcharts/
|
||||
├── dist/
|
||||
│ └── apexcharts.min.js
|
||||
├── src/
|
||||
│ ├── assets/
|
||||
│ ├── charts/
|
||||
│ ├── modules/
|
||||
│ ├── utils/
|
||||
│ └── apexcharts.js
|
||||
└── samples/
|
||||
```
|
||||
|
||||
## Using it with IE11
|
||||
|
||||
If you need to make it work with IE11, you need to include these polyfills before including ApexCharts
|
||||
|
||||
- [promise-polyfill](https://cdn.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.min.js)
|
||||
- [classlist.js](https://cdn.jsdelivr.net/npm/eligrey-classlist-js-polyfill)
|
||||
- [ResizeObserver polyfill](https://cdn.jsdelivr.net/npm/@juggle/resize-observer)
|
||||
- [findIndex](https://cdn.jsdelivr.net/npm/findindex_polyfill_mdn) - You will need this only if you require timeline/rangebar charts
|
||||
- [canvg](https://unpkg.com/canvg@3.0.4/lib/umd.js) - You will need this only if you require PNG download of your charts
|
||||
|
||||
## Development
|
||||
|
||||
#### Install dependencies and run the project
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
This will start the webpack watch and any changes you make to `src` folder will auto-compile and output will be produced in the `dist` folder.
|
||||
|
||||
More details in [Contributing Guidelines](CONTRIBUTING.md).
|
||||
|
||||
#### Minifying the src
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
## Where do I go next?
|
||||
|
||||
Head over to the <a href="https://apexcharts.com/docs/">documentation</a> section to read more about how to use different kinds of charts and explore all options.
|
||||
|
||||
## Contacts
|
||||
|
||||
Email: <a href="info@apexcharts.com">info@apexcharts.com</a>
|
||||
|
||||
Twitter: <a href="https://twitter.com/apexcharts">@apexcharts</a>
|
||||
|
||||
Facebook: <a href="https://facebook.com/apexcharts">fb.com/apexcharts</a>
|
||||
|
||||
## Dependency
|
||||
|
||||
ApexCharts uses <a href="https://svgdotjs.github.io/" target="_blank">SVG.js</a> for drawing shapes, animations, applying svg filters, and a lot more under the hood. The library is bundled in the final build file, so you don't need to include it.
|
||||
|
||||
## License
|
||||
|
||||
ApexCharts is released under MIT license. You are free to use, modify and distribute this software, as long as the copyright header is left intact.
|
||||
@@ -1,601 +0,0 @@
|
||||
@keyframes opaque {
|
||||
0% {
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
to {
|
||||
opacity: 1
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes resizeanim {
|
||||
0%,to {
|
||||
opacity: 0
|
||||
}
|
||||
}
|
||||
|
||||
.apexcharts-canvas {
|
||||
position: relative;
|
||||
user-select: none
|
||||
}
|
||||
|
||||
.apexcharts-canvas ::-webkit-scrollbar {
|
||||
-webkit-appearance: none;
|
||||
width: 6px
|
||||
}
|
||||
|
||||
.apexcharts-canvas ::-webkit-scrollbar-thumb {
|
||||
border-radius: 4px;
|
||||
background-color: rgba(0,0,0,.5);
|
||||
box-shadow: 0 0 1px rgba(255,255,255,.5);
|
||||
-webkit-box-shadow: 0 0 1px rgba(255,255,255,.5)
|
||||
}
|
||||
|
||||
.apexcharts-inner {
|
||||
position: relative
|
||||
}
|
||||
|
||||
.apexcharts-text tspan {
|
||||
font-family: inherit
|
||||
}
|
||||
|
||||
.legend-mouseover-inactive {
|
||||
transition: .15s ease all;
|
||||
opacity: .2
|
||||
}
|
||||
|
||||
.apexcharts-legend-text {
|
||||
padding-left: 15px;
|
||||
margin-left: -15px;
|
||||
}
|
||||
|
||||
.apexcharts-series-collapsed {
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
.apexcharts-tooltip {
|
||||
border-radius: 5px;
|
||||
box-shadow: 2px 2px 6px -4px #999;
|
||||
cursor: default;
|
||||
font-size: 14px;
|
||||
left: 62px;
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
z-index: 12;
|
||||
transition: .15s ease all
|
||||
}
|
||||
|
||||
.apexcharts-tooltip.apexcharts-active {
|
||||
opacity: 1;
|
||||
transition: .15s ease all
|
||||
}
|
||||
|
||||
.apexcharts-tooltip.apexcharts-theme-light {
|
||||
border: 1px solid #e3e3e3;
|
||||
background: rgba(255,255,255,.96)
|
||||
}
|
||||
|
||||
.apexcharts-tooltip.apexcharts-theme-dark {
|
||||
color: #fff;
|
||||
background: rgba(30,30,30,.8)
|
||||
}
|
||||
|
||||
.apexcharts-tooltip * {
|
||||
font-family: inherit
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-title {
|
||||
padding: 6px;
|
||||
font-size: 15px;
|
||||
margin-bottom: 4px
|
||||
}
|
||||
|
||||
.apexcharts-tooltip.apexcharts-theme-light .apexcharts-tooltip-title {
|
||||
background: #eceff1;
|
||||
border-bottom: 1px solid #ddd
|
||||
}
|
||||
|
||||
.apexcharts-tooltip.apexcharts-theme-dark .apexcharts-tooltip-title {
|
||||
background: rgba(0,0,0,.7);
|
||||
border-bottom: 1px solid #333
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-text-goals-value,.apexcharts-tooltip-text-y-value,.apexcharts-tooltip-text-z-value {
|
||||
display: inline-block;
|
||||
margin-left: 5px;
|
||||
font-weight: 600
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-text-goals-label:empty,.apexcharts-tooltip-text-goals-value:empty,.apexcharts-tooltip-text-y-label:empty,.apexcharts-tooltip-text-y-value:empty,.apexcharts-tooltip-text-z-value:empty,.apexcharts-tooltip-title:empty {
|
||||
display: none
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-text-goals-label,.apexcharts-tooltip-text-goals-value {
|
||||
padding: 6px 0 5px
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-goals-group,.apexcharts-tooltip-text-goals-label,.apexcharts-tooltip-text-goals-value {
|
||||
display: flex
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-text-goals-label:not(:empty),.apexcharts-tooltip-text-goals-value:not(:empty) {
|
||||
margin-top: -6px
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-marker {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
position: relative;
|
||||
top: 0;
|
||||
margin-right: 10px;
|
||||
border-radius: 50%
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-series-group {
|
||||
padding: 0 10px;
|
||||
display: none;
|
||||
text-align: left;
|
||||
justify-content: left;
|
||||
align-items: center
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-series-group.apexcharts-active .apexcharts-tooltip-marker {
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-series-group.apexcharts-active,.apexcharts-tooltip-series-group:last-child {
|
||||
padding-bottom: 4px
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-series-group-hidden {
|
||||
opacity: 0;
|
||||
height: 0;
|
||||
line-height: 0;
|
||||
padding: 0!important
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-y-group {
|
||||
padding: 6px 0 5px
|
||||
}
|
||||
|
||||
.apexcharts-custom-tooltip,.apexcharts-tooltip-box {
|
||||
padding: 4px 8px
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-boxPlot {
|
||||
display: flex;
|
||||
flex-direction: column-reverse
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-box>div {
|
||||
margin: 4px 0
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-box span.value {
|
||||
font-weight: 700
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-rangebar {
|
||||
padding: 5px 8px
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-rangebar .category {
|
||||
font-weight: 600;
|
||||
color: #777
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-rangebar .series-name {
|
||||
font-weight: 700;
|
||||
display: block;
|
||||
margin-bottom: 5px
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip,.apexcharts-yaxistooltip {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
color: #373d3f;
|
||||
font-size: 13px;
|
||||
text-align: center;
|
||||
border-radius: 2px;
|
||||
position: absolute;
|
||||
z-index: 10;
|
||||
background: #eceff1;
|
||||
border: 1px solid #90a4ae
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip {
|
||||
padding: 9px 10px;
|
||||
transition: .15s ease all
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip.apexcharts-theme-dark {
|
||||
background: rgba(0,0,0,.7);
|
||||
border: 1px solid rgba(0,0,0,.5);
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip:after,.apexcharts-xaxistooltip:before {
|
||||
left: 50%;
|
||||
border: solid transparent;
|
||||
content: " ";
|
||||
height: 0;
|
||||
width: 0;
|
||||
position: absolute;
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip:after {
|
||||
border-color: transparent;
|
||||
border-width: 6px;
|
||||
margin-left: -6px
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip:before {
|
||||
border-color: transparent;
|
||||
border-width: 7px;
|
||||
margin-left: -7px
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip-bottom:after,.apexcharts-xaxistooltip-bottom:before {
|
||||
bottom: 100%
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip-top:after,.apexcharts-xaxistooltip-top:before {
|
||||
top: 100%
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip-bottom:after {
|
||||
border-bottom-color: #eceff1
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip-bottom:before {
|
||||
border-bottom-color: #90a4ae
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip-bottom.apexcharts-theme-dark:after,.apexcharts-xaxistooltip-bottom.apexcharts-theme-dark:before {
|
||||
border-bottom-color: rgba(0,0,0,.5)
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip-top:after {
|
||||
border-top-color: #eceff1
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip-top:before {
|
||||
border-top-color: #90a4ae
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip-top.apexcharts-theme-dark:after,.apexcharts-xaxistooltip-top.apexcharts-theme-dark:before {
|
||||
border-top-color: rgba(0,0,0,.5)
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip.apexcharts-active {
|
||||
opacity: 1;
|
||||
transition: .15s ease all
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip {
|
||||
padding: 4px 10px
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip.apexcharts-theme-dark {
|
||||
background: rgba(0,0,0,.7);
|
||||
border: 1px solid rgba(0,0,0,.5);
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip:after,.apexcharts-yaxistooltip:before {
|
||||
top: 50%;
|
||||
border: solid transparent;
|
||||
content: " ";
|
||||
height: 0;
|
||||
width: 0;
|
||||
position: absolute;
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip:after {
|
||||
border-color: transparent;
|
||||
border-width: 6px;
|
||||
margin-top: -6px
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip:before {
|
||||
border-color: transparent;
|
||||
border-width: 7px;
|
||||
margin-top: -7px
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-left:after,.apexcharts-yaxistooltip-left:before {
|
||||
left: 100%
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-right:after,.apexcharts-yaxistooltip-right:before {
|
||||
right: 100%
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-left:after {
|
||||
border-left-color: #eceff1
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-left:before {
|
||||
border-left-color: #90a4ae
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-left.apexcharts-theme-dark:after,.apexcharts-yaxistooltip-left.apexcharts-theme-dark:before {
|
||||
border-left-color: rgba(0,0,0,.5)
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-right:after {
|
||||
border-right-color: #eceff1
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-right:before {
|
||||
border-right-color: #90a4ae
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-right.apexcharts-theme-dark:after,.apexcharts-yaxistooltip-right.apexcharts-theme-dark:before {
|
||||
border-right-color: rgba(0,0,0,.5)
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip.apexcharts-active {
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-hidden {
|
||||
display: none
|
||||
}
|
||||
|
||||
.apexcharts-xcrosshairs,.apexcharts-ycrosshairs {
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
transition: .15s ease all
|
||||
}
|
||||
|
||||
.apexcharts-xcrosshairs.apexcharts-active,.apexcharts-ycrosshairs.apexcharts-active {
|
||||
opacity: 1;
|
||||
transition: .15s ease all
|
||||
}
|
||||
|
||||
.apexcharts-ycrosshairs-hidden {
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
.apexcharts-selection-rect {
|
||||
cursor: move
|
||||
}
|
||||
|
||||
.svg_select_boundingRect,.svg_select_points_rot {
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
visibility: hidden
|
||||
}
|
||||
|
||||
.apexcharts-selection-rect+g .svg_select_boundingRect,.apexcharts-selection-rect+g .svg_select_points_rot {
|
||||
opacity: 0;
|
||||
visibility: hidden
|
||||
}
|
||||
|
||||
.apexcharts-selection-rect+g .svg_select_points_l,.apexcharts-selection-rect+g .svg_select_points_r {
|
||||
cursor: ew-resize;
|
||||
opacity: 1;
|
||||
visibility: visible
|
||||
}
|
||||
|
||||
.svg_select_points {
|
||||
fill: #efefef;
|
||||
stroke: #333;
|
||||
rx: 2
|
||||
}
|
||||
|
||||
.apexcharts-svg.apexcharts-zoomable.hovering-zoom {
|
||||
cursor: crosshair
|
||||
}
|
||||
|
||||
.apexcharts-svg.apexcharts-zoomable.hovering-pan {
|
||||
cursor: move
|
||||
}
|
||||
|
||||
.apexcharts-menu-icon,.apexcharts-pan-icon,.apexcharts-reset-icon,.apexcharts-selection-icon,.apexcharts-toolbar-custom-icon,.apexcharts-zoom-icon,.apexcharts-zoomin-icon,.apexcharts-zoomout-icon {
|
||||
cursor: pointer;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
line-height: 24px;
|
||||
color: #6e8192;
|
||||
text-align: center
|
||||
}
|
||||
|
||||
.apexcharts-menu-icon svg,.apexcharts-reset-icon svg,.apexcharts-zoom-icon svg,.apexcharts-zoomin-icon svg,.apexcharts-zoomout-icon svg {
|
||||
fill: #6e8192
|
||||
}
|
||||
|
||||
.apexcharts-selection-icon svg {
|
||||
fill: #444;
|
||||
transform: scale(.76)
|
||||
}
|
||||
|
||||
.apexcharts-theme-dark .apexcharts-menu-icon svg,.apexcharts-theme-dark .apexcharts-pan-icon svg,.apexcharts-theme-dark .apexcharts-reset-icon svg,.apexcharts-theme-dark .apexcharts-selection-icon svg,.apexcharts-theme-dark .apexcharts-toolbar-custom-icon svg,.apexcharts-theme-dark .apexcharts-zoom-icon svg,.apexcharts-theme-dark .apexcharts-zoomin-icon svg,.apexcharts-theme-dark .apexcharts-zoomout-icon svg {
|
||||
fill: #f3f4f5
|
||||
}
|
||||
|
||||
.apexcharts-canvas .apexcharts-reset-zoom-icon.apexcharts-selected svg,.apexcharts-canvas .apexcharts-selection-icon.apexcharts-selected svg,.apexcharts-canvas .apexcharts-zoom-icon.apexcharts-selected svg {
|
||||
fill: #008ffb
|
||||
}
|
||||
|
||||
.apexcharts-theme-light .apexcharts-menu-icon:hover svg,.apexcharts-theme-light .apexcharts-reset-icon:hover svg,.apexcharts-theme-light .apexcharts-selection-icon:not(.apexcharts-selected):hover svg,.apexcharts-theme-light .apexcharts-zoom-icon:not(.apexcharts-selected):hover svg,.apexcharts-theme-light .apexcharts-zoomin-icon:hover svg,.apexcharts-theme-light .apexcharts-zoomout-icon:hover svg {
|
||||
fill: #333
|
||||
}
|
||||
|
||||
.apexcharts-menu-icon,.apexcharts-selection-icon {
|
||||
position: relative
|
||||
}
|
||||
|
||||
.apexcharts-reset-icon {
|
||||
margin-left: 5px
|
||||
}
|
||||
|
||||
.apexcharts-menu-icon,.apexcharts-reset-icon,.apexcharts-zoom-icon {
|
||||
transform: scale(.85)
|
||||
}
|
||||
|
||||
.apexcharts-zoomin-icon,.apexcharts-zoomout-icon {
|
||||
transform: scale(.7)
|
||||
}
|
||||
|
||||
.apexcharts-zoomout-icon {
|
||||
margin-right: 3px
|
||||
}
|
||||
|
||||
.apexcharts-pan-icon {
|
||||
transform: scale(.62);
|
||||
position: relative;
|
||||
left: 1px;
|
||||
top: 0
|
||||
}
|
||||
|
||||
.apexcharts-pan-icon svg {
|
||||
fill: #fff;
|
||||
stroke: #6e8192;
|
||||
stroke-width: 2
|
||||
}
|
||||
|
||||
.apexcharts-pan-icon.apexcharts-selected svg {
|
||||
stroke: #008ffb
|
||||
}
|
||||
|
||||
.apexcharts-pan-icon:not(.apexcharts-selected):hover svg {
|
||||
stroke: #333
|
||||
}
|
||||
|
||||
.apexcharts-toolbar {
|
||||
position: absolute;
|
||||
z-index: 11;
|
||||
max-width: 176px;
|
||||
text-align: right;
|
||||
border-radius: 3px;
|
||||
padding: 0 6px 2px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center
|
||||
}
|
||||
|
||||
.apexcharts-menu {
|
||||
background: #fff;
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 3px;
|
||||
padding: 3px;
|
||||
right: 10px;
|
||||
opacity: 0;
|
||||
min-width: 110px;
|
||||
transition: .15s ease all;
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.apexcharts-menu.apexcharts-menu-open {
|
||||
opacity: 1;
|
||||
pointer-events: all;
|
||||
transition: .15s ease all
|
||||
}
|
||||
|
||||
.apexcharts-menu-item {
|
||||
padding: 6px 7px;
|
||||
font-size: 12px;
|
||||
cursor: pointer
|
||||
}
|
||||
|
||||
.apexcharts-theme-light .apexcharts-menu-item:hover {
|
||||
background: #eee
|
||||
}
|
||||
|
||||
.apexcharts-theme-dark .apexcharts-menu {
|
||||
background: rgba(0,0,0,.7);
|
||||
color: #fff
|
||||
}
|
||||
|
||||
@media screen and (min-width:768px) {
|
||||
.apexcharts-canvas:hover .apexcharts-toolbar {
|
||||
opacity: 1
|
||||
}
|
||||
}
|
||||
|
||||
.apexcharts-canvas .apexcharts-element-hidden,.apexcharts-datalabel.apexcharts-element-hidden,.apexcharts-hide .apexcharts-series-points {
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
.apexcharts-hidden-element-shown {
|
||||
opacity: 1;
|
||||
transition: 0.25s ease all;
|
||||
}
|
||||
.apexcharts-datalabel,.apexcharts-datalabel-label,.apexcharts-datalabel-value,.apexcharts-datalabels,.apexcharts-pie-label {
|
||||
cursor: default;
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.apexcharts-pie-label-delay {
|
||||
opacity: 0;
|
||||
animation-name: opaque;
|
||||
animation-duration: .3s;
|
||||
animation-fill-mode: forwards;
|
||||
animation-timing-function: ease
|
||||
}
|
||||
|
||||
.apexcharts-radialbar-label {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.apexcharts-annotation-rect,.apexcharts-area-series .apexcharts-area,.apexcharts-area-series .apexcharts-series-markers .apexcharts-marker.no-pointer-events,.apexcharts-gridline,.apexcharts-line,.apexcharts-line-series .apexcharts-series-markers .apexcharts-marker.no-pointer-events,.apexcharts-point-annotation-label,.apexcharts-radar-series path,.apexcharts-radar-series polygon,.apexcharts-toolbar svg,.apexcharts-tooltip .apexcharts-marker,.apexcharts-xaxis-annotation-label,.apexcharts-yaxis-annotation-label,.apexcharts-zoom-rect {
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.apexcharts-marker {
|
||||
transition: .15s ease all
|
||||
}
|
||||
|
||||
.resize-triggers {
|
||||
animation: 1ms resizeanim;
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
overflow: hidden
|
||||
}
|
||||
|
||||
.contract-trigger:before,.resize-triggers,.resize-triggers>div {
|
||||
content: " ";
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0
|
||||
}
|
||||
|
||||
.resize-triggers>div {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
background: #eee;
|
||||
overflow: auto
|
||||
}
|
||||
|
||||
.contract-trigger:before {
|
||||
overflow: hidden;
|
||||
width: 200%;
|
||||
height: 200%
|
||||
}
|
||||
|
||||
.apexcharts-bar-goals-markers{
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.apexcharts-bar-shadows{
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.apexcharts-rangebar-goals-markers{
|
||||
pointer-events: none
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
{
|
||||
"name": "ar",
|
||||
"options": {
|
||||
"months": [
|
||||
"يناير",
|
||||
"فبراير",
|
||||
"مارس",
|
||||
"أبريل",
|
||||
"مايو",
|
||||
"يونيو",
|
||||
"يوليو",
|
||||
"أغسطس",
|
||||
"سبتمبر",
|
||||
"أكتوبر",
|
||||
"نوفمبر",
|
||||
"ديسمبر"
|
||||
],
|
||||
"shortMonths": [
|
||||
"يناير",
|
||||
"فبراير",
|
||||
"مارس",
|
||||
"أبريل",
|
||||
"مايو",
|
||||
"يونيو",
|
||||
"يوليو",
|
||||
"أغسطس",
|
||||
"سبتمبر",
|
||||
"أكتوبر",
|
||||
"نوفمبر",
|
||||
"ديسمبر"
|
||||
],
|
||||
"days": [
|
||||
"الأحد",
|
||||
"الإثنين",
|
||||
"الثلاثاء",
|
||||
"الأربعاء",
|
||||
"الخميس",
|
||||
"الجمعة",
|
||||
"السبت"
|
||||
],
|
||||
"shortDays": [
|
||||
"أحد",
|
||||
"إثنين",
|
||||
"ثلاثاء",
|
||||
"أربعاء",
|
||||
"خميس",
|
||||
"جمعة",
|
||||
"سبت"
|
||||
],
|
||||
"toolbar": {
|
||||
"exportToSVG": "تحميل بصيغة SVG",
|
||||
"exportToPNG": "تحميل بصيغة PNG",
|
||||
"exportToCSV": "تحميل بصيغة CSV",
|
||||
"menu": "القائمة",
|
||||
"selection": "تحديد",
|
||||
"selectionZoom": "تكبير التحديد",
|
||||
"zoomIn": "تكبير",
|
||||
"zoomOut": "تصغير",
|
||||
"pan": "تحريك",
|
||||
"reset": "إعادة التعيين"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "be-cyrl",
|
||||
"options": {
|
||||
"months": [
|
||||
"Студзень",
|
||||
"Люты",
|
||||
"Сакавік",
|
||||
"Красавік",
|
||||
"Травень",
|
||||
"Чэрвень",
|
||||
"Ліпень",
|
||||
"Жнівень",
|
||||
"Верасень",
|
||||
"Кастрычнік",
|
||||
"Лістапад",
|
||||
"Сьнежань"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Сту",
|
||||
"Лют",
|
||||
"Сак",
|
||||
"Кра",
|
||||
"Тра",
|
||||
"Чэр",
|
||||
"Ліп",
|
||||
"Жні",
|
||||
"Вер",
|
||||
"Кас",
|
||||
"Ліс",
|
||||
"Сьн"
|
||||
],
|
||||
"days": [
|
||||
"Нядзеля",
|
||||
"Панядзелак",
|
||||
"Аўторак",
|
||||
"Серада",
|
||||
"Чацьвер",
|
||||
"Пятніца",
|
||||
"Субота"
|
||||
],
|
||||
"shortDays": ["Нд", "Пн", "Аў", "Ср", "Чц", "Пт", "Сб"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Спампаваць SVG",
|
||||
"exportToPNG": "Спампаваць PNG",
|
||||
"exportToCSV": "Спампаваць CSV",
|
||||
"menu": "Мэню",
|
||||
"selection": "Вылучэньне",
|
||||
"selectionZoom": "Вылучэньне з маштабаваньнем",
|
||||
"zoomIn": "Наблізіць",
|
||||
"zoomOut": "Аддаліць",
|
||||
"pan": "Ссоўваньне",
|
||||
"reset": "Скінуць маштабаваньне"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "be-latn",
|
||||
"options": {
|
||||
"months": [
|
||||
"Studzień",
|
||||
"Luty",
|
||||
"Sakavik",
|
||||
"Krasavik",
|
||||
"Travień",
|
||||
"Červień",
|
||||
"Lipień",
|
||||
"Žnivień",
|
||||
"Vierasień",
|
||||
"Kastryčnik",
|
||||
"Listapad",
|
||||
"Śniežań"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Stu",
|
||||
"Lut",
|
||||
"Sak",
|
||||
"Kra",
|
||||
"Tra",
|
||||
"Čer",
|
||||
"Lip",
|
||||
"Žni",
|
||||
"Vie",
|
||||
"Kas",
|
||||
"Lis",
|
||||
"Śni"
|
||||
],
|
||||
"days": [
|
||||
"Niadziela",
|
||||
"Paniadziełak",
|
||||
"Aŭtorak",
|
||||
"Sierada",
|
||||
"Čaćvier",
|
||||
"Piatnica",
|
||||
"Subota"
|
||||
],
|
||||
"shortDays": ["Nd", "Pn", "Aŭ", "Sr", "Čć", "Pt", "Sb"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Spampavać SVG",
|
||||
"exportToPNG": "Spampavać PNG",
|
||||
"exportToCSV": "Spampavać CSV",
|
||||
"menu": "Meniu",
|
||||
"selection": "Vyłučeńnie",
|
||||
"selectionZoom": "Vyłučeńnie z maštabavańniem",
|
||||
"zoomIn": "Nablizić",
|
||||
"zoomOut": "Addalić",
|
||||
"pan": "Ssoŭvańnie",
|
||||
"reset": "Skinuć maštabavańnie"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "ca",
|
||||
"options": {
|
||||
"months": [
|
||||
"Gener",
|
||||
"Febrer",
|
||||
"Març",
|
||||
"Abril",
|
||||
"Maig",
|
||||
"Juny",
|
||||
"Juliol",
|
||||
"Agost",
|
||||
"Setembre",
|
||||
"Octubre",
|
||||
"Novembre",
|
||||
"Desembre"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Gen.",
|
||||
"Febr.",
|
||||
"Març",
|
||||
"Abr.",
|
||||
"Maig",
|
||||
"Juny",
|
||||
"Jul.",
|
||||
"Ag.",
|
||||
"Set.",
|
||||
"Oct.",
|
||||
"Nov.",
|
||||
"Des."
|
||||
],
|
||||
"days": [
|
||||
"Diumenge",
|
||||
"Dilluns",
|
||||
"Dimarts",
|
||||
"Dimecres",
|
||||
"Dijous",
|
||||
"Divendres",
|
||||
"Dissabte"
|
||||
],
|
||||
"shortDays": ["Dg", "Dl", "Dt", "Dc", "Dj", "Dv", "Ds"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Descarregar SVG",
|
||||
"exportToPNG": "Descarregar PNG",
|
||||
"exportToCSV": "Descarregar CSV",
|
||||
"menu": "Menú",
|
||||
"selection": "Seleccionar",
|
||||
"selectionZoom": "Seleccionar Zoom",
|
||||
"zoomIn": "Augmentar",
|
||||
"zoomOut": "Disminuir",
|
||||
"pan": "Navegació",
|
||||
"reset": "Reiniciar Zoom"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "cs",
|
||||
"options": {
|
||||
"months": [
|
||||
"Leden",
|
||||
"Únor",
|
||||
"Březen",
|
||||
"Duben",
|
||||
"Květen",
|
||||
"Červen",
|
||||
"Červenec",
|
||||
"Srpen",
|
||||
"Září",
|
||||
"Říjen",
|
||||
"Listopad",
|
||||
"Prosinec"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Led",
|
||||
"Úno",
|
||||
"Bře",
|
||||
"Dub",
|
||||
"Kvě",
|
||||
"Čvn",
|
||||
"Čvc",
|
||||
"Srp",
|
||||
"Zář",
|
||||
"Říj",
|
||||
"Lis",
|
||||
"Pro"
|
||||
],
|
||||
"days": [
|
||||
"Neděle",
|
||||
"Pondělí",
|
||||
"Úterý",
|
||||
"Středa",
|
||||
"Čtvrtek",
|
||||
"Pátek",
|
||||
"Sobota"
|
||||
],
|
||||
"shortDays": ["Ne", "Po", "Út", "St", "Čt", "Pá", "So"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Stáhnout SVG",
|
||||
"exportToPNG": "Stáhnout PNG",
|
||||
"exportToCSV": "Stáhnout CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Vybrat",
|
||||
"selectionZoom": "Zoom: Vybrat",
|
||||
"zoomIn": "Zoom: Přiblížit",
|
||||
"zoomOut": "Zoom: Oddálit",
|
||||
"pan": "Přesouvat",
|
||||
"reset": "Resetovat"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "da",
|
||||
"options": {
|
||||
"months": [
|
||||
"januar",
|
||||
"februar",
|
||||
"marts",
|
||||
"april",
|
||||
"maj",
|
||||
"juni",
|
||||
"juli",
|
||||
"august",
|
||||
"september",
|
||||
"oktober",
|
||||
"november",
|
||||
"december"
|
||||
],
|
||||
"shortMonths": [
|
||||
"jan",
|
||||
"feb",
|
||||
"mar",
|
||||
"apr",
|
||||
"maj",
|
||||
"jun",
|
||||
"jul",
|
||||
"aug",
|
||||
"sep",
|
||||
"okt",
|
||||
"nov",
|
||||
"dec"
|
||||
],
|
||||
"days": [
|
||||
"Søndag",
|
||||
"Mandag",
|
||||
"Tirsdag",
|
||||
"Onsdag",
|
||||
"Torsdag",
|
||||
"Fredag",
|
||||
"Lørdag"
|
||||
],
|
||||
"shortDays": ["Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Download SVG",
|
||||
"exportToPNG": "Download PNG",
|
||||
"exportToCSV": "Download CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Valg",
|
||||
"selectionZoom": "Zoom til valg",
|
||||
"zoomIn": "Zoom ind",
|
||||
"zoomOut": "Zoom ud",
|
||||
"pan": "Panorér",
|
||||
"reset": "Nulstil zoom"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "de",
|
||||
"options": {
|
||||
"months": [
|
||||
"Januar",
|
||||
"Februar",
|
||||
"März",
|
||||
"April",
|
||||
"Mai",
|
||||
"Juni",
|
||||
"Juli",
|
||||
"August",
|
||||
"September",
|
||||
"Oktober",
|
||||
"November",
|
||||
"Dezember"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Jan",
|
||||
"Feb",
|
||||
"Mär",
|
||||
"Apr",
|
||||
"Mai",
|
||||
"Jun",
|
||||
"Jul",
|
||||
"Aug",
|
||||
"Sep",
|
||||
"Okt",
|
||||
"Nov",
|
||||
"Dez"
|
||||
],
|
||||
"days": [
|
||||
"Sonntag",
|
||||
"Montag",
|
||||
"Dienstag",
|
||||
"Mittwoch",
|
||||
"Donnerstag",
|
||||
"Freitag",
|
||||
"Samstag"
|
||||
],
|
||||
"shortDays": ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "SVG speichern",
|
||||
"exportToPNG": "PNG speichern",
|
||||
"exportToCSV": "CSV speichern",
|
||||
"menu": "Menü",
|
||||
"selection": "Auswahl",
|
||||
"selectionZoom": "Auswahl vergrößern",
|
||||
"zoomIn": "Vergrößern",
|
||||
"zoomOut": "Verkleinern",
|
||||
"pan": "Verschieben",
|
||||
"reset": "Zoom zurücksetzen"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "el",
|
||||
"options": {
|
||||
"months": [
|
||||
"Ιανουάριος",
|
||||
"Φεβρουάριος",
|
||||
"Μάρτιος",
|
||||
"Απρίλιος",
|
||||
"Μάιος",
|
||||
"Ιούνιος",
|
||||
"Ιούλιος",
|
||||
"Αύγουστος",
|
||||
"Σεπτέμβριος",
|
||||
"Οκτώβριος",
|
||||
"Νοέμβριος",
|
||||
"Δεκέμβριος"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Ιαν",
|
||||
"Φευ",
|
||||
"Μαρ",
|
||||
"Απρ",
|
||||
"Μάι",
|
||||
"Ιουν",
|
||||
"Ιουλ",
|
||||
"Αυγ",
|
||||
"Σεπ",
|
||||
"Οκτ",
|
||||
"Νοε",
|
||||
"Δεκ"
|
||||
],
|
||||
"days": [
|
||||
"Κυριακή",
|
||||
"Δευτέρα",
|
||||
"Τρίτη",
|
||||
"Τετάρτη",
|
||||
"Πέμπτη",
|
||||
"Παρασκευή",
|
||||
"Σάββατο"
|
||||
],
|
||||
"shortDays": ["Κυρ", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Λήψη SVG",
|
||||
"exportToPNG": "Λήψη PNG",
|
||||
"exportToCSV": "Λήψη CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Επιλογή",
|
||||
"selectionZoom": "Μεγένθυση βάση επιλογής",
|
||||
"zoomIn": "Μεγένθυνση",
|
||||
"zoomOut": "Σμίκρυνση",
|
||||
"pan": "Μετατόπιση",
|
||||
"reset": "Επαναφορά μεγένθυνσης"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "en",
|
||||
"options": {
|
||||
"months": [
|
||||
"January",
|
||||
"February",
|
||||
"March",
|
||||
"April",
|
||||
"May",
|
||||
"June",
|
||||
"July",
|
||||
"August",
|
||||
"September",
|
||||
"October",
|
||||
"November",
|
||||
"December"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Jan",
|
||||
"Feb",
|
||||
"Mar",
|
||||
"Apr",
|
||||
"May",
|
||||
"Jun",
|
||||
"Jul",
|
||||
"Aug",
|
||||
"Sep",
|
||||
"Oct",
|
||||
"Nov",
|
||||
"Dec"
|
||||
],
|
||||
"days": [
|
||||
"Sunday",
|
||||
"Monday",
|
||||
"Tuesday",
|
||||
"Wednesday",
|
||||
"Thursday",
|
||||
"Friday",
|
||||
"Saturday"
|
||||
],
|
||||
"shortDays": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Download SVG",
|
||||
"exportToPNG": "Download PNG",
|
||||
"exportToCSV": "Download CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Selection",
|
||||
"selectionZoom": "Selection Zoom",
|
||||
"zoomIn": "Zoom In",
|
||||
"zoomOut": "Zoom Out",
|
||||
"pan": "Panning",
|
||||
"reset": "Reset Zoom"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "es",
|
||||
"options": {
|
||||
"months": [
|
||||
"Enero",
|
||||
"Febrero",
|
||||
"Marzo",
|
||||
"Abril",
|
||||
"Mayo",
|
||||
"Junio",
|
||||
"Julio",
|
||||
"Agosto",
|
||||
"Septiembre",
|
||||
"Octubre",
|
||||
"Noviembre",
|
||||
"Diciembre"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Ene",
|
||||
"Feb",
|
||||
"Mar",
|
||||
"Abr",
|
||||
"May",
|
||||
"Jun",
|
||||
"Jul",
|
||||
"Ago",
|
||||
"Sep",
|
||||
"Oct",
|
||||
"Nov",
|
||||
"Dic"
|
||||
],
|
||||
"days": [
|
||||
"Domingo",
|
||||
"Lunes",
|
||||
"Martes",
|
||||
"Miércoles",
|
||||
"Jueves",
|
||||
"Viernes",
|
||||
"Sábado"
|
||||
],
|
||||
"shortDays": ["Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Descargar SVG",
|
||||
"exportToPNG": "Descargar PNG",
|
||||
"exportToCSV": "Descargar CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Seleccionar",
|
||||
"selectionZoom": "Seleccionar Zoom",
|
||||
"zoomIn": "Aumentar",
|
||||
"zoomOut": "Disminuir",
|
||||
"pan": "Navegación",
|
||||
"reset": "Reiniciar Zoom"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
{
|
||||
"name": "et",
|
||||
"options": {
|
||||
"months": [
|
||||
"jaanuar",
|
||||
"veebruar",
|
||||
"märts",
|
||||
"aprill",
|
||||
"mai",
|
||||
"juuni",
|
||||
"juuli",
|
||||
"august",
|
||||
"september",
|
||||
"oktoober",
|
||||
"november",
|
||||
"detsember"
|
||||
],
|
||||
"shortMonths": [
|
||||
"jaan",
|
||||
"veebr",
|
||||
"märts",
|
||||
"apr",
|
||||
"mai",
|
||||
"juuni",
|
||||
"juuli",
|
||||
"aug",
|
||||
"sept",
|
||||
"okt",
|
||||
"nov",
|
||||
"dets"
|
||||
],
|
||||
"days": [
|
||||
"pühapäev",
|
||||
"esmaspäev",
|
||||
"teisipäev",
|
||||
"kolmapäev",
|
||||
"neljapäev",
|
||||
"reede",
|
||||
"laupäev"
|
||||
],
|
||||
"shortDays": [
|
||||
"P",
|
||||
"E",
|
||||
"T",
|
||||
"K",
|
||||
"N",
|
||||
"R",
|
||||
"L"
|
||||
],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Lae alla SVG",
|
||||
"exportToPNG": "Lae alla PNG",
|
||||
"exportToCSV": "Lae alla CSV",
|
||||
"menu": "Menüü",
|
||||
"selection": "Valik",
|
||||
"selectionZoom": "Valiku suum",
|
||||
"zoomIn": "Suurenda",
|
||||
"zoomOut": "Vähenda",
|
||||
"pan": "Panoraamimine",
|
||||
"reset": "Lähtesta suum"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "fa",
|
||||
"options": {
|
||||
"months": [
|
||||
"فروردین",
|
||||
"اردیبهشت",
|
||||
"خرداد",
|
||||
"تیر",
|
||||
"مرداد",
|
||||
"شهریور",
|
||||
"مهر",
|
||||
"آبان",
|
||||
"آذر",
|
||||
"دی",
|
||||
"بهمن",
|
||||
"اسفند"
|
||||
],
|
||||
"shortMonths": [
|
||||
"فرو",
|
||||
"ارد",
|
||||
"خرد",
|
||||
"تیر",
|
||||
"مرد",
|
||||
"شهر",
|
||||
"مهر",
|
||||
"آبا",
|
||||
"آذر",
|
||||
"دی",
|
||||
"بهمـ",
|
||||
"اسفـ"
|
||||
],
|
||||
"days": [
|
||||
"یکشنبه",
|
||||
"دوشنبه",
|
||||
"سه شنبه",
|
||||
"چهارشنبه",
|
||||
"پنجشنبه",
|
||||
"جمعه",
|
||||
"شنبه"
|
||||
],
|
||||
"shortDays": ["ی", "د", "س", "چ", "پ", "ج", "ش"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "دانلود SVG",
|
||||
"exportToPNG": "دانلود PNG",
|
||||
"exportToCSV": "دانلود CSV",
|
||||
"menu": "منو",
|
||||
"selection": "انتخاب",
|
||||
"selectionZoom": "بزرگنمایی انتخابی",
|
||||
"zoomIn": "بزرگنمایی",
|
||||
"zoomOut": "کوچکنمایی",
|
||||
"pan": "پیمایش",
|
||||
"reset": "بازنشانی بزرگنمایی"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "fi",
|
||||
"options": {
|
||||
"months": [
|
||||
"Tammikuu",
|
||||
"Helmikuu",
|
||||
"Maaliskuu",
|
||||
"Huhtikuu",
|
||||
"Toukokuu",
|
||||
"Kesäkuu",
|
||||
"Heinäkuu",
|
||||
"Elokuu",
|
||||
"Syyskuu",
|
||||
"Lokakuu",
|
||||
"Marraskuu",
|
||||
"Joulukuu"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Tammi",
|
||||
"Helmi",
|
||||
"Maalis",
|
||||
"Huhti",
|
||||
"Touko",
|
||||
"Kesä",
|
||||
"Heinä",
|
||||
"Elo",
|
||||
"Syys",
|
||||
"Loka",
|
||||
"Marras",
|
||||
"Joulu"
|
||||
],
|
||||
"days": [
|
||||
"Sunnuntai",
|
||||
"Maanantai",
|
||||
"Tiistai",
|
||||
"Keskiviikko",
|
||||
"Torstai",
|
||||
"Perjantai",
|
||||
"Lauantai"
|
||||
],
|
||||
"shortDays": ["Su", "Ma", "Ti", "Ke", "To", "Pe", "La"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Lataa SVG",
|
||||
"exportToPNG": "Lataa PNG",
|
||||
"exportToCSV": "Lataa CSV",
|
||||
"menu": "Valikko",
|
||||
"selection": "Valinta",
|
||||
"selectionZoom": "Valinnan zoomaus",
|
||||
"zoomIn": "Lähennä",
|
||||
"zoomOut": "Loitonna",
|
||||
"pan": "Panoroi",
|
||||
"reset": "Nollaa zoomaus"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "fr",
|
||||
"options": {
|
||||
"months": [
|
||||
"janvier",
|
||||
"février",
|
||||
"mars",
|
||||
"avril",
|
||||
"mai",
|
||||
"juin",
|
||||
"juillet",
|
||||
"août",
|
||||
"septembre",
|
||||
"octobre",
|
||||
"novembre",
|
||||
"décembre"
|
||||
],
|
||||
"shortMonths": [
|
||||
"janv.",
|
||||
"févr.",
|
||||
"mars",
|
||||
"avr.",
|
||||
"mai",
|
||||
"juin",
|
||||
"juill.",
|
||||
"août",
|
||||
"sept.",
|
||||
"oct.",
|
||||
"nov.",
|
||||
"déc."
|
||||
],
|
||||
"days": [
|
||||
"dimanche",
|
||||
"lundi",
|
||||
"mardi",
|
||||
"mercredi",
|
||||
"jeudi",
|
||||
"vendredi",
|
||||
"samedi"
|
||||
],
|
||||
"shortDays": ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Télécharger au format SVG",
|
||||
"exportToPNG": "Télécharger au format PNG",
|
||||
"exportToCSV": "Télécharger au format CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Sélection",
|
||||
"selectionZoom": "Sélection et zoom",
|
||||
"zoomIn": "Zoomer",
|
||||
"zoomOut": "Dézoomer",
|
||||
"pan": "Navigation",
|
||||
"reset": "Réinitialiser le zoom"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "he",
|
||||
"options": {
|
||||
"months": [
|
||||
"ינואר",
|
||||
"פברואר",
|
||||
"מרץ",
|
||||
"אפריל",
|
||||
"מאי",
|
||||
"יוני",
|
||||
"יולי",
|
||||
"אוגוסט",
|
||||
"ספטמבר",
|
||||
"אוקטובר",
|
||||
"נובמבר",
|
||||
"דצמבר"
|
||||
],
|
||||
"shortMonths": [
|
||||
"ינו׳",
|
||||
"פבר׳",
|
||||
"מרץ",
|
||||
"אפר׳",
|
||||
"מאי",
|
||||
"יוני",
|
||||
"יולי",
|
||||
"אוג׳",
|
||||
"ספט׳",
|
||||
"אוק׳",
|
||||
"נוב׳",
|
||||
"דצמ׳"
|
||||
],
|
||||
"days": [
|
||||
"ראשון",
|
||||
"שני",
|
||||
"שלישי",
|
||||
"רביעי",
|
||||
"חמישי",
|
||||
"שישי",
|
||||
"שבת"
|
||||
],
|
||||
"shortDays": ["א׳", "ב׳", "ג׳", "ד׳", "ה׳", "ו׳", "ש׳"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "הורד SVG",
|
||||
"exportToPNG": "הורד PNG",
|
||||
"exportToCSV": "הורד CSV",
|
||||
"menu": "תפריט",
|
||||
"selection": "בחירה",
|
||||
"selectionZoom": "זום בחירה",
|
||||
"zoomIn": "הגדלה",
|
||||
"zoomOut": "הקטנה",
|
||||
"pan": "הזזה",
|
||||
"reset": "איפוס תצוגה"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "hi",
|
||||
"options": {
|
||||
"months": [
|
||||
"जनवरी",
|
||||
"फ़रवरी",
|
||||
"मार्च",
|
||||
"अप्रैल",
|
||||
"मई",
|
||||
"जून",
|
||||
"जुलाई",
|
||||
"अगस्त",
|
||||
"सितंबर",
|
||||
"अक्टूबर",
|
||||
"नवंबर",
|
||||
"दिसंबर"
|
||||
],
|
||||
"shortMonths": [
|
||||
"जनवरी",
|
||||
"फ़रवरी",
|
||||
"मार्च",
|
||||
"अप्रैल",
|
||||
"मई",
|
||||
"जून",
|
||||
"जुलाई",
|
||||
"अगस्त",
|
||||
"सितंबर",
|
||||
"अक्टूबर",
|
||||
"नवंबर",
|
||||
"दिसंबर"
|
||||
],
|
||||
"days": [
|
||||
"रविवार",
|
||||
"सोमवार",
|
||||
"मंगलवार",
|
||||
"बुधवार",
|
||||
"गुरुवार",
|
||||
"शुक्रवार",
|
||||
"शनिवार"
|
||||
],
|
||||
"shortDays": ["रवि", "सोम", "मंगल", "बुध", "गुरु", "शुक्र", "शनि"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "निर्यात SVG",
|
||||
"exportToPNG": "निर्यात PNG",
|
||||
"exportToCSV": "निर्यात CSV",
|
||||
"menu": "सूची",
|
||||
"selection": "चयन",
|
||||
"selectionZoom": "ज़ूम करना",
|
||||
"zoomIn": "ज़ूम इन",
|
||||
"zoomOut": "ज़ूम आउट",
|
||||
"pan": "पैनिंग",
|
||||
"reset": "फिर से कायम करना"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "hr",
|
||||
"options": {
|
||||
"months": [
|
||||
"Siječanj",
|
||||
"Veljača",
|
||||
"Ožujak",
|
||||
"Travanj",
|
||||
"Svibanj",
|
||||
"Lipanj",
|
||||
"Srpanj",
|
||||
"Kolovoz",
|
||||
"Rujan",
|
||||
"Listopad",
|
||||
"Studeni",
|
||||
"Prosinac"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Sij",
|
||||
"Velj",
|
||||
"Ožu",
|
||||
"Tra",
|
||||
"Svi",
|
||||
"Lip",
|
||||
"Srp",
|
||||
"Kol",
|
||||
"Ruj",
|
||||
"Lis",
|
||||
"Stu",
|
||||
"Pro"
|
||||
],
|
||||
"days": [
|
||||
"Nedjelja",
|
||||
"Ponedjeljak",
|
||||
"Utorak",
|
||||
"Srijeda",
|
||||
"Četvrtak",
|
||||
"Petak",
|
||||
"Subota"
|
||||
],
|
||||
"shortDays": ["Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Preuzmi SVG",
|
||||
"exportToPNG": "Preuzmi PNG",
|
||||
"exportToCSV": "Preuzmi CSV",
|
||||
"menu": "Izbornik",
|
||||
"selection": "Odabir",
|
||||
"selectionZoom": "Odabirno povećanje",
|
||||
"zoomIn": "Uvećajte prikaz",
|
||||
"zoomOut": "Umanjite prikaz",
|
||||
"pan": "Pomicanje",
|
||||
"reset": "Povratak na zadani prikaz"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
{
|
||||
"name": "hu",
|
||||
"options": {
|
||||
"months": [
|
||||
"január",
|
||||
"február",
|
||||
"március",
|
||||
"április",
|
||||
"május",
|
||||
"június",
|
||||
"július",
|
||||
"augusztus",
|
||||
"szeptember",
|
||||
"október",
|
||||
"november",
|
||||
"december"
|
||||
],
|
||||
"shortMonths": [
|
||||
"jan",
|
||||
"feb",
|
||||
"mar",
|
||||
"ápr",
|
||||
"máj",
|
||||
"jún",
|
||||
"júl",
|
||||
"aug",
|
||||
"szept",
|
||||
"okt",
|
||||
"nov",
|
||||
"dec"
|
||||
],
|
||||
"days": [
|
||||
"hétfő",
|
||||
"kedd",
|
||||
"szerda",
|
||||
"csütörtök",
|
||||
"péntek",
|
||||
"szombat",
|
||||
"vasárnap"
|
||||
],
|
||||
"shortDays": [
|
||||
"H",
|
||||
"K",
|
||||
"Sze",
|
||||
"Cs",
|
||||
"P",
|
||||
"Szo",
|
||||
"V"
|
||||
],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Exportálás SVG-be",
|
||||
"exportToPNG": "Exportálás PNG-be",
|
||||
"exportToCSV": "Exportálás CSV-be",
|
||||
"menu": "Fő ajánlat",
|
||||
"download": "SVG letöltése",
|
||||
"selection": "Kiválasztás",
|
||||
"selectionZoom": "Nagyító kiválasztása",
|
||||
"zoomIn": "Nagyítás",
|
||||
"zoomOut": "Kicsinyítés",
|
||||
"pan": "Képcsúsztatás",
|
||||
"reset": "Nagyító visszaállítása"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "hy",
|
||||
"options": {
|
||||
"months": [
|
||||
"Հունվար",
|
||||
"Փետրվար",
|
||||
"Մարտ",
|
||||
"Ապրիլ",
|
||||
"Մայիս",
|
||||
"Հունիս",
|
||||
"Հուլիս",
|
||||
"Օգոստոս",
|
||||
"Սեպտեմբեր",
|
||||
"Հոկտեմբեր",
|
||||
"Նոյեմբեր",
|
||||
"Դեկտեմբեր"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Հնվ",
|
||||
"Փտվ",
|
||||
"Մրտ",
|
||||
"Ապր",
|
||||
"Մյս",
|
||||
"Հնս",
|
||||
"Հլիս",
|
||||
"Օգս",
|
||||
"Սեպ",
|
||||
"Հոկ",
|
||||
"Նոյ",
|
||||
"Դեկ"
|
||||
],
|
||||
"days": [
|
||||
"Կիրակի",
|
||||
"Երկուշաբթի",
|
||||
"Երեքշաբթի",
|
||||
"Չորեքշաբթի",
|
||||
"Հինգշաբթի",
|
||||
"Ուրբաթ",
|
||||
"Շաբաթ"
|
||||
],
|
||||
"shortDays": ["Կիր", "Երկ", "Երք", "Չրք", "Հնգ", "Ուրբ", "Շբթ"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Բեռնել SVG",
|
||||
"exportToPNG": "Բեռնել PNG",
|
||||
"exportToCSV": "Բեռնել CSV",
|
||||
"menu": "Մենյու",
|
||||
"selection": "Ընտրված",
|
||||
"selectionZoom": "Ընտրված հատվածի խոշորացում",
|
||||
"zoomIn": "Խոշորացնել",
|
||||
"zoomOut": "Մանրացնել",
|
||||
"pan": "Տեղափոխում",
|
||||
"reset": "Բերել սկզբնական վիճակի"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
{
|
||||
"name": "id",
|
||||
"options": {
|
||||
"months": [
|
||||
"Januari",
|
||||
"Februari",
|
||||
"Maret",
|
||||
"April",
|
||||
"Mei",
|
||||
"Juni",
|
||||
"Juli",
|
||||
"Agustus",
|
||||
"September",
|
||||
"Oktober",
|
||||
"November",
|
||||
"Desember"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Jan",
|
||||
"Feb",
|
||||
"Mar",
|
||||
"Apr",
|
||||
"Mei",
|
||||
"Jun",
|
||||
"Jul",
|
||||
"Agu",
|
||||
"Sep",
|
||||
"Okt",
|
||||
"Nov",
|
||||
"Des"
|
||||
],
|
||||
"days": ["Minggu", "Senin", "Selasa", "Rabu", "kamis", "Jumat", "Sabtu"],
|
||||
"shortDays": ["Min", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Unduh SVG",
|
||||
"exportToPNG": "Unduh PNG",
|
||||
"exportToCSV": "Unduh CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Pilihan",
|
||||
"selectionZoom": "Perbesar Pilihan",
|
||||
"zoomIn": "Perbesar",
|
||||
"zoomOut": "Perkecil",
|
||||
"pan": "Geser",
|
||||
"reset": "Atur Ulang Zoom"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "it",
|
||||
"options": {
|
||||
"months": [
|
||||
"Gennaio",
|
||||
"Febbraio",
|
||||
"Marzo",
|
||||
"Aprile",
|
||||
"Maggio",
|
||||
"Giugno",
|
||||
"Luglio",
|
||||
"Agosto",
|
||||
"Settembre",
|
||||
"Ottobre",
|
||||
"Novembre",
|
||||
"Dicembre"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Gen",
|
||||
"Feb",
|
||||
"Mar",
|
||||
"Apr",
|
||||
"Mag",
|
||||
"Giu",
|
||||
"Lug",
|
||||
"Ago",
|
||||
"Set",
|
||||
"Ott",
|
||||
"Nov",
|
||||
"Dic"
|
||||
],
|
||||
"days": [
|
||||
"Domenica",
|
||||
"Lunedì",
|
||||
"Martedì",
|
||||
"Mercoledì",
|
||||
"Giovedì",
|
||||
"Venerdì",
|
||||
"Sabato"
|
||||
],
|
||||
"shortDays": ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Scarica SVG",
|
||||
"exportToPNG": "Scarica PNG",
|
||||
"exportToCSV": "Scarica CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Selezione",
|
||||
"selectionZoom": "Seleziona Zoom",
|
||||
"zoomIn": "Zoom In",
|
||||
"zoomOut": "Zoom Out",
|
||||
"pan": "Sposta",
|
||||
"reset": "Reimposta Zoom"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "ja",
|
||||
"options": {
|
||||
"months": [
|
||||
"1月",
|
||||
"2月",
|
||||
"3月",
|
||||
"4月",
|
||||
"5月",
|
||||
"6月",
|
||||
"7月",
|
||||
"8月",
|
||||
"9月",
|
||||
"10月",
|
||||
"11月",
|
||||
"12月"
|
||||
],
|
||||
"shortMonths": [
|
||||
"1月",
|
||||
"2月",
|
||||
"3月",
|
||||
"4月",
|
||||
"5月",
|
||||
"6月",
|
||||
"7月",
|
||||
"8月",
|
||||
"9月",
|
||||
"10月",
|
||||
"11月",
|
||||
"12月"
|
||||
],
|
||||
"days": [
|
||||
"日曜日",
|
||||
"月曜日",
|
||||
"火曜日",
|
||||
"水曜日",
|
||||
"木曜日",
|
||||
"金曜日",
|
||||
"土曜日"
|
||||
],
|
||||
"shortDays": ["日", "月", "火", "水", "木", "金", "土"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "SVGダウンロード",
|
||||
"exportToPNG": "PNGダウンロード",
|
||||
"exportToCSV": "CSVダウンロード",
|
||||
"menu": "メニュー",
|
||||
"selection": "選択",
|
||||
"selectionZoom": "選択ズーム",
|
||||
"zoomIn": "拡大",
|
||||
"zoomOut": "縮小",
|
||||
"pan": "パン",
|
||||
"reset": "ズームリセット"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "ka",
|
||||
"options": {
|
||||
"months": [
|
||||
"იანვარი",
|
||||
"თებერვალი",
|
||||
"მარტი",
|
||||
"აპრილი",
|
||||
"მაისი",
|
||||
"ივნისი",
|
||||
"ივლისი",
|
||||
"აგვისტო",
|
||||
"სექტემბერი",
|
||||
"ოქტომბერი",
|
||||
"ნოემბერი",
|
||||
"დეკემბერი"
|
||||
],
|
||||
"shortMonths": [
|
||||
"იან",
|
||||
"თებ",
|
||||
"მარ",
|
||||
"აპრ",
|
||||
"მაი",
|
||||
"ივნ",
|
||||
"ივლ",
|
||||
"აგვ",
|
||||
"სექ",
|
||||
"ოქტ",
|
||||
"ნოე",
|
||||
"დეკ"
|
||||
],
|
||||
"days": [
|
||||
"კვირა",
|
||||
"ორშაბათი",
|
||||
"სამშაბათი",
|
||||
"ოთხშაბათი",
|
||||
"ხუთშაბათი",
|
||||
"პარასკევი",
|
||||
"შაბათი"
|
||||
],
|
||||
"shortDays": ["კვი", "ორშ", "სამ", "ოთხ", "ხუთ", "პარ", "შაბ"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "გადმოქაჩე SVG",
|
||||
"exportToPNG": "გადმოქაჩე PNG",
|
||||
"exportToCSV": "გადმოქაჩე CSV",
|
||||
"menu": "მენიუ",
|
||||
"selection": "არჩევა",
|
||||
"selectionZoom": "არჩეულის გადიდება",
|
||||
"zoomIn": "გადიდება",
|
||||
"zoomOut": "დაპატარაება",
|
||||
"pan": "გადაჩოჩება",
|
||||
"reset": "გადიდების გაუქმება"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "ko",
|
||||
"options": {
|
||||
"months": [
|
||||
"1월",
|
||||
"2월",
|
||||
"3월",
|
||||
"4월",
|
||||
"5월",
|
||||
"6월",
|
||||
"7월",
|
||||
"8월",
|
||||
"9월",
|
||||
"10월",
|
||||
"11월",
|
||||
"12월"
|
||||
],
|
||||
"shortMonths": [
|
||||
"1월",
|
||||
"2월",
|
||||
"3월",
|
||||
"4월",
|
||||
"5월",
|
||||
"6월",
|
||||
"7월",
|
||||
"8월",
|
||||
"9월",
|
||||
"10월",
|
||||
"11월",
|
||||
"12월"
|
||||
],
|
||||
"days": [
|
||||
"일요일",
|
||||
"월요일",
|
||||
"화요일",
|
||||
"수요일",
|
||||
"목요일",
|
||||
"금요일",
|
||||
"토요일"
|
||||
],
|
||||
"shortDays": ["일", "월", "화", "수", "목", "금", "토"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "SVG 다운로드",
|
||||
"exportToPNG": "PNG 다운로드",
|
||||
"exportToCSV": "CSV 다운로드",
|
||||
"menu": "메뉴",
|
||||
"selection": "선택",
|
||||
"selectionZoom": "선택영역 확대",
|
||||
"zoomIn": "확대",
|
||||
"zoomOut": "축소",
|
||||
"pan": "패닝",
|
||||
"reset": "원래대로"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "lt",
|
||||
"options": {
|
||||
"months": [
|
||||
"Sausis",
|
||||
"Vasaris",
|
||||
"Kovas",
|
||||
"Balandis",
|
||||
"Gegužė",
|
||||
"Birželis",
|
||||
"Liepa",
|
||||
"Rugpjūtis",
|
||||
"Rugsėjis",
|
||||
"Spalis",
|
||||
"Lapkritis",
|
||||
"Gruodis"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Sau",
|
||||
"Vas",
|
||||
"Kov",
|
||||
"Bal",
|
||||
"Geg",
|
||||
"Bir",
|
||||
"Lie",
|
||||
"Rgp",
|
||||
"Rgs",
|
||||
"Spl",
|
||||
"Lap",
|
||||
"Grd"
|
||||
],
|
||||
"days": [
|
||||
"Sekmadienis",
|
||||
"Pirmadienis",
|
||||
"Antradienis",
|
||||
"Trečiadienis",
|
||||
"Ketvirtadienis",
|
||||
"Penktadienis",
|
||||
"Šeštadienis"
|
||||
],
|
||||
"shortDays": ["Sk", "Per", "An", "Tr", "Kt", "Pn", "Št"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Atsisiųsti SVG",
|
||||
"exportToPNG": "Atsisiųsti PNG",
|
||||
"exportToCSV": "Atsisiųsti CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Pasirinkimas",
|
||||
"selectionZoom": "Zoom: Pasirinkimas",
|
||||
"zoomIn": "Zoom: Priartinti",
|
||||
"zoomOut": "Zoom: Atitolinti",
|
||||
"pan": "Perkėlimas",
|
||||
"reset": "Atstatyti"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
{
|
||||
"name": "lv",
|
||||
"options": {
|
||||
"months": [
|
||||
"janvāris",
|
||||
"februāris",
|
||||
"marts",
|
||||
"aprīlis",
|
||||
"maijs",
|
||||
"jūnijs",
|
||||
"jūlijs",
|
||||
"augusts",
|
||||
"septembris",
|
||||
"oktobris",
|
||||
"novembris",
|
||||
"decembris"
|
||||
],
|
||||
"shortMonths": [
|
||||
"janv",
|
||||
"febr",
|
||||
"marts",
|
||||
"apr",
|
||||
"maijs",
|
||||
"jūn",
|
||||
"jūl",
|
||||
"aug",
|
||||
"sept",
|
||||
"okt",
|
||||
"nov",
|
||||
"dec"
|
||||
],
|
||||
"days": [
|
||||
"svētdiena",
|
||||
"pirmdiena",
|
||||
"otrdiena",
|
||||
"trešdiena",
|
||||
"ceturtdiena",
|
||||
"piektdiena",
|
||||
"sestdiena"
|
||||
],
|
||||
"shortDays": [
|
||||
"Sv",
|
||||
"P",
|
||||
"O",
|
||||
"T",
|
||||
"C",
|
||||
"P",
|
||||
"S"
|
||||
],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Lejuplādēt SVG",
|
||||
"exportToPNG": "Lejuplādēt PNG",
|
||||
"exportToCSV": "Lejuplādēt CSV",
|
||||
"menu": "Izvēlne",
|
||||
"selection": "Atlase",
|
||||
"selectionZoom": "Pietuvināt atlasi",
|
||||
"zoomIn": "Pietuvināt",
|
||||
"zoomOut": "Attālināt",
|
||||
"pan": "Pārvietoties diagrammā",
|
||||
"reset": "Atiestatīt pietuvinājumu"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
{
|
||||
"name": "ms",
|
||||
"options": {
|
||||
"months": [
|
||||
"Januari",
|
||||
"Februari",
|
||||
"Mac",
|
||||
"April",
|
||||
"Mei",
|
||||
"Jun",
|
||||
"Julai",
|
||||
"Ogos",
|
||||
"September",
|
||||
"Oktober",
|
||||
"November",
|
||||
"Disember"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Jan",
|
||||
"Feb",
|
||||
"Mac",
|
||||
"Apr",
|
||||
"Mei",
|
||||
"Jun",
|
||||
"Jul",
|
||||
"Ogos",
|
||||
"Sep",
|
||||
"Okt",
|
||||
"Nov",
|
||||
"Dis"
|
||||
],
|
||||
"days": [
|
||||
"Ahad",
|
||||
"Isnin",
|
||||
"Selasa",
|
||||
"Rabu",
|
||||
"Khamis",
|
||||
"Jumaat",
|
||||
"Sabtu"
|
||||
],
|
||||
"shortDays": [
|
||||
"Ahd",
|
||||
"Isn",
|
||||
"Sel",
|
||||
"Rab",
|
||||
"Kha",
|
||||
"Jum",
|
||||
"Sab"
|
||||
],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Muat turun SVG",
|
||||
"exportToPNG": "Muat turun PNG",
|
||||
"exportToCSV": "Muat turun CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Pilihan",
|
||||
"selectionZoom": "Zum Pilihan",
|
||||
"zoomIn": "Zoom Masuk",
|
||||
"zoomOut": "Zoom Keluar",
|
||||
"pan": "Pemusingan",
|
||||
"reset": "Tetapkan Semula Zum"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "nb",
|
||||
"options": {
|
||||
"months": [
|
||||
"Januar",
|
||||
"Februar",
|
||||
"Mars",
|
||||
"April",
|
||||
"Mai",
|
||||
"Juni",
|
||||
"Juli",
|
||||
"August",
|
||||
"September",
|
||||
"Oktober",
|
||||
"November",
|
||||
"Desember"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Jan",
|
||||
"Feb",
|
||||
"Mar",
|
||||
"Apr",
|
||||
"Mai",
|
||||
"Jun",
|
||||
"Jul",
|
||||
"Aug",
|
||||
"Sep",
|
||||
"Okt",
|
||||
"Nov",
|
||||
"Des"
|
||||
],
|
||||
"days": [
|
||||
"Søndag",
|
||||
"Mandag",
|
||||
"Tirsdag",
|
||||
"Onsdag",
|
||||
"Torsdag",
|
||||
"Fredag",
|
||||
"Lørdag"
|
||||
],
|
||||
"shortDays": ["Sø", "Ma", "Ti", "On", "To", "Fr", "Lø"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Last ned SVG",
|
||||
"exportToPNG": "Last ned PNG",
|
||||
"exportToCSV": "Last ned CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Velg",
|
||||
"selectionZoom": "Zoom: Velg",
|
||||
"zoomIn": "Zoome inn",
|
||||
"zoomOut": "Zoome ut",
|
||||
"pan": "Skyving",
|
||||
"reset": "Start på nytt"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "nl",
|
||||
"options": {
|
||||
"months": [
|
||||
"Januari",
|
||||
"Februari",
|
||||
"Maart",
|
||||
"April",
|
||||
"Mei",
|
||||
"Juni",
|
||||
"Juli",
|
||||
"Augustus",
|
||||
"September",
|
||||
"Oktober",
|
||||
"November",
|
||||
"December"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Jan",
|
||||
"Feb",
|
||||
"Mrt",
|
||||
"Apr",
|
||||
"Mei",
|
||||
"Jun",
|
||||
"Jul",
|
||||
"Aug",
|
||||
"Sep",
|
||||
"Okt",
|
||||
"Nov",
|
||||
"Dec"
|
||||
],
|
||||
"days": [
|
||||
"Zondag",
|
||||
"Maandag",
|
||||
"Dinsdag",
|
||||
"Woensdag",
|
||||
"Donderdag",
|
||||
"Vrijdag",
|
||||
"Zaterdag"
|
||||
],
|
||||
"shortDays": ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Download SVG",
|
||||
"exportToPNG": "Download PNG",
|
||||
"exportToCSV": "Download CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Selectie",
|
||||
"selectionZoom": "Zoom selectie",
|
||||
"zoomIn": "Zoom in",
|
||||
"zoomOut": "Zoom out",
|
||||
"pan": "Verplaatsen",
|
||||
"reset": "Standaardwaarden"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "pl",
|
||||
"options": {
|
||||
"months": [
|
||||
"Styczeń",
|
||||
"Luty",
|
||||
"Marzec",
|
||||
"Kwiecień",
|
||||
"Maj",
|
||||
"Czerwiec",
|
||||
"Lipiec",
|
||||
"Sierpień",
|
||||
"Wrzesień",
|
||||
"Październik",
|
||||
"Listopad",
|
||||
"Grudzień"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Sty",
|
||||
"Lut",
|
||||
"Mar",
|
||||
"Kwi",
|
||||
"Maj",
|
||||
"Cze",
|
||||
"Lip",
|
||||
"Sie",
|
||||
"Wrz",
|
||||
"Paź",
|
||||
"Lis",
|
||||
"Gru"
|
||||
],
|
||||
"days": [
|
||||
"Niedziela",
|
||||
"Poniedziałek",
|
||||
"Wtorek",
|
||||
"Środa",
|
||||
"Czwartek",
|
||||
"Piątek",
|
||||
"Sobota"
|
||||
],
|
||||
"shortDays": ["Nd", "Pn", "Wt", "Śr", "Cz", "Pt", "Sb"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Pobierz SVG",
|
||||
"exportToPNG": "Pobierz PNG",
|
||||
"exportToCSV": "Pobierz CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Wybieranie",
|
||||
"selectionZoom": "Zoom: Wybieranie",
|
||||
"zoomIn": "Zoom: Przybliż",
|
||||
"zoomOut": "Zoom: Oddal",
|
||||
"pan": "Przesuwanie",
|
||||
"reset": "Resetuj"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "pt-br",
|
||||
"options": {
|
||||
"months": [
|
||||
"Janeiro",
|
||||
"Fevereiro",
|
||||
"Março",
|
||||
"Abril",
|
||||
"Maio",
|
||||
"Junho",
|
||||
"Julho",
|
||||
"Agosto",
|
||||
"Setembro",
|
||||
"Outubro",
|
||||
"Novembro",
|
||||
"Dezembro"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Jan",
|
||||
"Fev",
|
||||
"Mar",
|
||||
"Abr",
|
||||
"Mai",
|
||||
"Jun",
|
||||
"Jul",
|
||||
"Ago",
|
||||
"Set",
|
||||
"Out",
|
||||
"Nov",
|
||||
"Dez"
|
||||
],
|
||||
"days": [
|
||||
"Domingo",
|
||||
"Segunda",
|
||||
"Terça",
|
||||
"Quarta",
|
||||
"Quinta",
|
||||
"Sexta",
|
||||
"Sábado"
|
||||
],
|
||||
"shortDays": ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Baixar SVG",
|
||||
"exportToPNG": "Baixar PNG",
|
||||
"exportToCSV": "Baixar CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Selecionar",
|
||||
"selectionZoom": "Selecionar Zoom",
|
||||
"zoomIn": "Aumentar",
|
||||
"zoomOut": "Diminuir",
|
||||
"pan": "Navegação",
|
||||
"reset": "Reiniciar Zoom"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "pt",
|
||||
"options": {
|
||||
"months": [
|
||||
"Janeiro",
|
||||
"Fevereiro",
|
||||
"Março",
|
||||
"Abril",
|
||||
"Maio",
|
||||
"Junho",
|
||||
"Julho",
|
||||
"Agosto",
|
||||
"Setembro",
|
||||
"Outubro",
|
||||
"Novembro",
|
||||
"Dezembro"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Jan",
|
||||
"Fev",
|
||||
"Mar",
|
||||
"Abr",
|
||||
"Mai",
|
||||
"Jun",
|
||||
"Jul",
|
||||
"Ag",
|
||||
"Set",
|
||||
"Out",
|
||||
"Nov",
|
||||
"Dez"
|
||||
],
|
||||
"days": [
|
||||
"Domingo",
|
||||
"Segunda-feira",
|
||||
"Terça-feira",
|
||||
"Quarta-feira",
|
||||
"Quinta-feira",
|
||||
"Sexta-feira",
|
||||
"Sábado"
|
||||
],
|
||||
"shortDays": ["Do", "Se", "Te", "Qa", "Qi", "Sx", "Sa"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Transferir SVG",
|
||||
"exportToPNG": "Transferir PNG",
|
||||
"exportToCSV": "Transferir CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Selecionar",
|
||||
"selectionZoom": "Zoom: Selecionar",
|
||||
"zoomIn": "Zoom: Aumentar",
|
||||
"zoomOut": "Zoom: Diminuir",
|
||||
"pan": "Deslocamento",
|
||||
"reset": "Redefinir"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "rs",
|
||||
"options": {
|
||||
"months": [
|
||||
"Januar",
|
||||
"Februar",
|
||||
"Mart",
|
||||
"April",
|
||||
"Maj",
|
||||
"Jun",
|
||||
"Jul",
|
||||
"Avgust",
|
||||
"Septembar",
|
||||
"Oktobar",
|
||||
"Novembar",
|
||||
"Decembar"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Jan",
|
||||
"Feb",
|
||||
"Mar",
|
||||
"Apr",
|
||||
"Maj",
|
||||
"Jun",
|
||||
"Jul",
|
||||
"Avg",
|
||||
"Sep",
|
||||
"Okt",
|
||||
"Nov",
|
||||
"Dec"
|
||||
],
|
||||
"days": [
|
||||
"Nedelja",
|
||||
"Ponedeljak",
|
||||
"Utorak",
|
||||
"Sreda",
|
||||
"Četvrtak",
|
||||
"Petak",
|
||||
"Subota"
|
||||
],
|
||||
"shortDays": ["Ned", "Pon", "Uto", "Sre", "Čet", "Pet", "Sub"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Preuzmi SVG",
|
||||
"exportToPNG": "Preuzmi PNG",
|
||||
"exportToCSV": "Preuzmi CSV",
|
||||
"menu": "Meni",
|
||||
"selection": "Odabir",
|
||||
"selectionZoom": "Odabirno povećanje",
|
||||
"zoomIn": "Uvećajte prikaz",
|
||||
"zoomOut": "Umanjite prikaz",
|
||||
"pan": "Pomeranje",
|
||||
"reset": "Resetuj prikaz"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "ru",
|
||||
"options": {
|
||||
"months": [
|
||||
"Январь",
|
||||
"Февраль",
|
||||
"Март",
|
||||
"Апрель",
|
||||
"Май",
|
||||
"Июнь",
|
||||
"Июль",
|
||||
"Август",
|
||||
"Сентябрь",
|
||||
"Октябрь",
|
||||
"Ноябрь",
|
||||
"Декабрь"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Янв",
|
||||
"Фев",
|
||||
"Мар",
|
||||
"Апр",
|
||||
"Май",
|
||||
"Июн",
|
||||
"Июл",
|
||||
"Авг",
|
||||
"Сен",
|
||||
"Окт",
|
||||
"Ноя",
|
||||
"Дек"
|
||||
],
|
||||
"days": [
|
||||
"Воскресенье",
|
||||
"Понедельник",
|
||||
"Вторник",
|
||||
"Среда",
|
||||
"Четверг",
|
||||
"Пятница",
|
||||
"Суббота"
|
||||
],
|
||||
"shortDays": ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Сохранить SVG",
|
||||
"exportToPNG": "Сохранить PNG",
|
||||
"exportToCSV": "Сохранить CSV",
|
||||
"menu": "Меню",
|
||||
"selection": "Выбор",
|
||||
"selectionZoom": "Выбор с увеличением",
|
||||
"zoomIn": "Увеличить",
|
||||
"zoomOut": "Уменьшить",
|
||||
"pan": "Перемещение",
|
||||
"reset": "Сбросить увеличение"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "se",
|
||||
"options": {
|
||||
"months": [
|
||||
"Januari",
|
||||
"Februari",
|
||||
"Mars",
|
||||
"April",
|
||||
"Maj",
|
||||
"Juni",
|
||||
"Juli",
|
||||
"Augusti",
|
||||
"September",
|
||||
"Oktober",
|
||||
"November",
|
||||
"December"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Jan",
|
||||
"Feb",
|
||||
"Mar",
|
||||
"Apr",
|
||||
"Maj",
|
||||
"Juni",
|
||||
"Juli",
|
||||
"Aug",
|
||||
"Sep",
|
||||
"Okt",
|
||||
"Nov",
|
||||
"Dec"
|
||||
],
|
||||
"days": [
|
||||
"Söndag",
|
||||
"Måndag",
|
||||
"Tisdag",
|
||||
"Onsdag",
|
||||
"Torsdag",
|
||||
"Fredag",
|
||||
"Lördag"
|
||||
],
|
||||
"shortDays": ["Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Ladda SVG",
|
||||
"exportToPNG": "Ladda PNG",
|
||||
"exportToCSV": "Ladda CSV",
|
||||
"menu": "Meny",
|
||||
"selection": "Selektion",
|
||||
"selectionZoom": "Val av zoom",
|
||||
"zoomIn": "Zooma in",
|
||||
"zoomOut": "Zooma ut",
|
||||
"pan": "Panorering",
|
||||
"reset": "Återställ zoomning"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "sk",
|
||||
"options": {
|
||||
"months": [
|
||||
"Január",
|
||||
"Február",
|
||||
"Marec",
|
||||
"Apríl",
|
||||
"Máj",
|
||||
"Jún",
|
||||
"Júl",
|
||||
"August",
|
||||
"September",
|
||||
"Október",
|
||||
"November",
|
||||
"December"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Jan",
|
||||
"Feb",
|
||||
"Mar",
|
||||
"Apr",
|
||||
"Máj",
|
||||
"Jún",
|
||||
"Júl",
|
||||
"Aug",
|
||||
"Sep",
|
||||
"Okt",
|
||||
"Nov",
|
||||
"Dec"
|
||||
],
|
||||
"days": [
|
||||
"Nedeľa",
|
||||
"Pondelok",
|
||||
"Utorok",
|
||||
"Streda",
|
||||
"Štvrtok",
|
||||
"Piatok",
|
||||
"Sobota"
|
||||
],
|
||||
"shortDays": ["Ne", "Po", "Ut", "St", "Št", "Pi", "So"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Stiahnuť SVG",
|
||||
"exportToPNG": "Stiahnuť PNG",
|
||||
"exportToCSV": "Stiahnuť CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Vyberanie",
|
||||
"selectionZoom": "Zoom: Vyberanie",
|
||||
"zoomIn": "Zoom: Priblížiť",
|
||||
"zoomOut": "Zoom: Vzdialiť",
|
||||
"pan": "Presúvanie",
|
||||
"reset": "Resetovať"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "sl",
|
||||
"options": {
|
||||
"months": [
|
||||
"Januar",
|
||||
"Februar",
|
||||
"Marec",
|
||||
"April",
|
||||
"Maj",
|
||||
"Junij",
|
||||
"Julij",
|
||||
"Avgust",
|
||||
"Septemer",
|
||||
"Oktober",
|
||||
"November",
|
||||
"December"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Jan",
|
||||
"Feb",
|
||||
"Mar",
|
||||
"Apr",
|
||||
"Maj",
|
||||
"Jun",
|
||||
"Jul",
|
||||
"Avg",
|
||||
"Sep",
|
||||
"Okt",
|
||||
"Nov",
|
||||
"Dec"
|
||||
],
|
||||
"days": [
|
||||
"Nedelja",
|
||||
"Ponedeljek",
|
||||
"Torek",
|
||||
"Sreda",
|
||||
"Četrtek",
|
||||
"Petek",
|
||||
"Sobota"
|
||||
],
|
||||
"shortDays": ["Ne", "Po", "To", "Sr", "Če", "Pe", "So"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Prenesi SVG",
|
||||
"exportToPNG": "Prenesi PNG",
|
||||
"exportToCSV": "Prenesi CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Izbiranje",
|
||||
"selectionZoom": "Zoom: Izbira",
|
||||
"zoomIn": "Zoom: Približaj",
|
||||
"zoomOut": "Zoom: Oddalji",
|
||||
"pan": "Pomikanje",
|
||||
"reset": "Resetiraj"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "sq",
|
||||
"options": {
|
||||
"months": [
|
||||
"Janar",
|
||||
"Shkurt",
|
||||
"Mars",
|
||||
"Prill",
|
||||
"Maj",
|
||||
"Qershor",
|
||||
"Korrik",
|
||||
"Gusht",
|
||||
"Shtator",
|
||||
"Tetor",
|
||||
"Nëntor",
|
||||
"Dhjetor"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Jan",
|
||||
"Shk",
|
||||
"Mar",
|
||||
"Pr",
|
||||
"Maj",
|
||||
"Qer",
|
||||
"Korr",
|
||||
"Gush",
|
||||
"Sht",
|
||||
"Tet",
|
||||
"Nën",
|
||||
"Dhj"
|
||||
],
|
||||
"days": [
|
||||
"e Dielë",
|
||||
"e Hënë",
|
||||
"e Martë",
|
||||
"e Mërkurë",
|
||||
"e Enjte",
|
||||
"e Premte",
|
||||
"e Shtunë"
|
||||
],
|
||||
"shortDays": ["Die", "Hën", "Mar", "Mër", "Enj", "Pre", "Sht"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Shkarko SVG",
|
||||
"exportToPNG": "Shkarko PNG",
|
||||
"exportToCSV": "Shkarko CSV",
|
||||
"menu": "Menu",
|
||||
"selection": "Seleksiono",
|
||||
"selectionZoom": "Seleksiono Zmadhim",
|
||||
"zoomIn": "Zmadho",
|
||||
"zoomOut": "Zvogëlo",
|
||||
"pan": "Spostoje",
|
||||
"reset": "Rikthe dimensionin"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "th",
|
||||
"options": {
|
||||
"months": [
|
||||
"มกราคม",
|
||||
"กุมภาพันธ์",
|
||||
"มีนาคม",
|
||||
"เมษายน",
|
||||
"พฤษภาคม",
|
||||
"มิถุนายน",
|
||||
"กรกฎาคม",
|
||||
"สิงหาคม",
|
||||
"กันยายน",
|
||||
"ตุลาคม",
|
||||
"พฤศจิกายน",
|
||||
"ธันวาคม"
|
||||
],
|
||||
"shortMonths": [
|
||||
"ม.ค.",
|
||||
"ก.พ.",
|
||||
"มี.ค.",
|
||||
"เม.ย.",
|
||||
"พ.ค.",
|
||||
"มิ.ย.",
|
||||
"ก.ค.",
|
||||
"ส.ค.",
|
||||
"ก.ย.",
|
||||
"ต.ค.",
|
||||
"พ.ย.",
|
||||
"ธ.ค."
|
||||
],
|
||||
"days": [
|
||||
"อาทิตย์",
|
||||
"จันทร์",
|
||||
"อังคาร",
|
||||
"พุธ",
|
||||
"พฤหัสบดี",
|
||||
"ศุกร์",
|
||||
"เสาร์"
|
||||
],
|
||||
"shortDays": ["อา", "จ", "อ", "พ", "พฤ", "ศ", "ส"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "ดาวน์โหลด SVG",
|
||||
"exportToPNG": "ดาวน์โหลด PNG",
|
||||
"exportToCSV": "ดาวน์โหลด CSV",
|
||||
"menu": "เมนู",
|
||||
"selection": "เลือก",
|
||||
"selectionZoom": "เลือกจุดที่จะซูม",
|
||||
"zoomIn": "ซูมเข้า",
|
||||
"zoomOut": "ซูมออก",
|
||||
"pan": "ปรากฎว่า",
|
||||
"reset": "รีเซ็ตการซูม"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "tr",
|
||||
"options": {
|
||||
"months": [
|
||||
"Ocak",
|
||||
"Şubat",
|
||||
"Mart",
|
||||
"Nisan",
|
||||
"Mayıs",
|
||||
"Haziran",
|
||||
"Temmuz",
|
||||
"Ağustos",
|
||||
"Eylül",
|
||||
"Ekim",
|
||||
"Kasım",
|
||||
"Aralık"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Oca",
|
||||
"Şub",
|
||||
"Mar",
|
||||
"Nis",
|
||||
"May",
|
||||
"Haz",
|
||||
"Tem",
|
||||
"Ağu",
|
||||
"Eyl",
|
||||
"Eki",
|
||||
"Kas",
|
||||
"Ara"
|
||||
],
|
||||
"days": [
|
||||
"Pazar",
|
||||
"Pazartesi",
|
||||
"Salı",
|
||||
"Çarşamba",
|
||||
"Perşembe",
|
||||
"Cuma",
|
||||
"Cumartesi"
|
||||
],
|
||||
"shortDays": ["Paz", "Pzt", "Sal", "Çar", "Per", "Cum", "Cmt"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "SVG İndir",
|
||||
"exportToPNG": "PNG İndir",
|
||||
"exportToCSV": "CSV İndir",
|
||||
"menu": "Menü",
|
||||
"selection": "Seçim",
|
||||
"selectionZoom": "Seçim Yakınlaştır",
|
||||
"zoomIn": "Yakınlaştır",
|
||||
"zoomOut": "Uzaklaştır",
|
||||
"pan": "Kaydır",
|
||||
"reset": "Yakınlaştırmayı Sıfırla"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "ua",
|
||||
"options": {
|
||||
"months": [
|
||||
"Січень",
|
||||
"Лютий",
|
||||
"Березень",
|
||||
"Квітень",
|
||||
"Травень",
|
||||
"Червень",
|
||||
"Липень",
|
||||
"Серпень",
|
||||
"Вересень",
|
||||
"Жовтень",
|
||||
"Листопад",
|
||||
"Грудень"
|
||||
],
|
||||
"shortMonths": [
|
||||
"Січ",
|
||||
"Лют",
|
||||
"Бер",
|
||||
"Кві",
|
||||
"Тра",
|
||||
"Чер",
|
||||
"Лип",
|
||||
"Сер",
|
||||
"Вер",
|
||||
"Жов",
|
||||
"Лис",
|
||||
"Гру"
|
||||
],
|
||||
"days": [
|
||||
"Неділя",
|
||||
"Понеділок",
|
||||
"Вівторок",
|
||||
"Середа",
|
||||
"Четвер",
|
||||
"П'ятниця",
|
||||
"Субота"
|
||||
],
|
||||
"shortDays": ["Нд", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "Зберегти SVG",
|
||||
"exportToPNG": "Зберегти PNG",
|
||||
"exportToCSV": "Зберегти CSV",
|
||||
"menu": "Меню",
|
||||
"selection": "Вибір",
|
||||
"selectionZoom": "Вибір із збільшенням",
|
||||
"zoomIn": "Збільшити",
|
||||
"zoomOut": "Зменшити",
|
||||
"pan": "Переміщення",
|
||||
"reset": "Скинути збільшення"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "zh-cn",
|
||||
"options": {
|
||||
"months": [
|
||||
"一月",
|
||||
"二月",
|
||||
"三月",
|
||||
"四月",
|
||||
"五月",
|
||||
"六月",
|
||||
"七月",
|
||||
"八月",
|
||||
"九月",
|
||||
"十月",
|
||||
"十一月",
|
||||
"十二月"
|
||||
],
|
||||
"shortMonths": [
|
||||
"一月",
|
||||
"二月",
|
||||
"三月",
|
||||
"四月",
|
||||
"五月",
|
||||
"六月",
|
||||
"七月",
|
||||
"八月",
|
||||
"九月",
|
||||
"十月",
|
||||
"十一月",
|
||||
"十二月"
|
||||
],
|
||||
"days": [
|
||||
"星期天",
|
||||
"星期一",
|
||||
"星期二",
|
||||
"星期三",
|
||||
"星期四",
|
||||
"星期五",
|
||||
"星期六"
|
||||
],
|
||||
"shortDays": ["周日", "周一", "周二", "周三", "周四", "周五", "周六"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "下载 SVG",
|
||||
"exportToPNG": "下载 PNG",
|
||||
"exportToCSV": "下载 CSV",
|
||||
"menu": "菜单",
|
||||
"selection": "选择",
|
||||
"selectionZoom": "选择缩放",
|
||||
"zoomIn": "放大",
|
||||
"zoomOut": "缩小",
|
||||
"pan": "平移",
|
||||
"reset": "重置缩放"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
{
|
||||
"name": "zh-tw",
|
||||
"options": {
|
||||
"months": [
|
||||
"一月",
|
||||
"二月",
|
||||
"三月",
|
||||
"四月",
|
||||
"五月",
|
||||
"六月",
|
||||
"七月",
|
||||
"八月",
|
||||
"九月",
|
||||
"十月",
|
||||
"十一月",
|
||||
"十二月"
|
||||
],
|
||||
"shortMonths": [
|
||||
"一月",
|
||||
"二月",
|
||||
"三月",
|
||||
"四月",
|
||||
"五月",
|
||||
"六月",
|
||||
"七月",
|
||||
"八月",
|
||||
"九月",
|
||||
"十月",
|
||||
"十一月",
|
||||
"十二月"
|
||||
],
|
||||
"days": [
|
||||
"星期日",
|
||||
"星期一",
|
||||
"星期二",
|
||||
"星期三",
|
||||
"星期四",
|
||||
"星期五",
|
||||
"星期六"
|
||||
],
|
||||
"shortDays": ["週日", "週一", "週二", "週三", "週四", "週五", "週六"],
|
||||
"toolbar": {
|
||||
"exportToSVG": "下載 SVG",
|
||||
"exportToPNG": "下載 PNG",
|
||||
"exportToCSV": "下載 CSV",
|
||||
"menu": "菜單",
|
||||
"selection": "選擇",
|
||||
"selectionZoom": "選擇縮放",
|
||||
"zoomIn": "放大",
|
||||
"zoomOut": "縮小",
|
||||
"pan": "平移",
|
||||
"reset": "重置縮放"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,108 +0,0 @@
|
||||
{
|
||||
"name": "apexcharts",
|
||||
"version": "3.46.0",
|
||||
"description": "A JavaScript Chart Library",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/apexcharts/apexcharts.js.git"
|
||||
},
|
||||
"main": "dist/apexcharts.common.js",
|
||||
"unpkg": "dist/apexcharts.js",
|
||||
"jsdelivr": "dist/apexcharts.js",
|
||||
"typings": "types/apexcharts.d.ts",
|
||||
"files": [
|
||||
"src",
|
||||
"dist/*.js",
|
||||
"dist/*.css",
|
||||
"dist/locales/*.json",
|
||||
"types/*.d.ts"
|
||||
],
|
||||
"scripts": {
|
||||
"dev": "rollup -w -c build/config.js --environment TARGET:web-umd-dev",
|
||||
"dev:cjs": "rollup -w -c build/config.js --environment TARGET:web-cjs",
|
||||
"bundle": "node build/build.js",
|
||||
"build": "npm run bundle && webpack",
|
||||
"build:umd": "rollup -w -c build/config.js --environment TARGET:web-umd-dev",
|
||||
"build:amd": "webpack",
|
||||
"lint": "eslint .",
|
||||
"lint:fix": "eslint . --fix",
|
||||
"test": "npm run e2e && npm run unit",
|
||||
"unit": "jest tests/unit/",
|
||||
"e2e": "node tests/e2e/samples.js test",
|
||||
"e2e:update": "node tests/e2e/samples.js update",
|
||||
"build:samples": "node samples/source/index.js generate"
|
||||
},
|
||||
"dependencies": {
|
||||
"@yr/monotone-cubic-spline": "^1.0.3",
|
||||
"svg.draggable.js": "^2.2.2",
|
||||
"svg.easing.js": "^2.0.0",
|
||||
"svg.filter.js": "^2.0.2",
|
||||
"svg.pathmorphing.js": "^0.1.3",
|
||||
"svg.resize.js": "^1.4.3",
|
||||
"svg.select.js": "^3.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.8.7",
|
||||
"@babel/plugin-proposal-class-properties": "^7.8.3",
|
||||
"@babel/preset-env": "^7.8.7",
|
||||
"@rollup/plugin-babel": "^5.2.1",
|
||||
"@rollup/plugin-json": "4.0.1",
|
||||
"@rollup/plugin-node-resolve": "6.0.0",
|
||||
"@rollup/plugin-replace": "2.3.0",
|
||||
"@rollup/plugin-strip": "1.3.1",
|
||||
"babel-eslint": "10.0.3",
|
||||
"babel-jest": "27.3.1",
|
||||
"babel-loader": "8.0.6",
|
||||
"babel-plugin-istanbul": "6.0.0",
|
||||
"chalk": "3.0.0",
|
||||
"css-loader": "6.10.0",
|
||||
"eslint": "8.36.0",
|
||||
"eslint-config-prettier": "8.8.0",
|
||||
"eslint-loader": "3.0.3",
|
||||
"eslint-plugin-import": "^2.27.5",
|
||||
"eslint-plugin-prettier": "3.1.2",
|
||||
"eslint-plugin-promise": "4.2.1",
|
||||
"eslint-webpack-plugin": "4.0.0",
|
||||
"fs-extra": "8.1.0",
|
||||
"jest": "27.3.1",
|
||||
"nunjucks": "3.2.4",
|
||||
"nyc": "15.0.0",
|
||||
"pixelmatch": "5.1.0",
|
||||
"pngjs": "3.4.0",
|
||||
"postcss": "^8.4.21",
|
||||
"prettier": "2.8.5",
|
||||
"puppeteer": "2.0.0",
|
||||
"puppeteer-cluster": "0.18.0",
|
||||
"rollup": "3.20.0",
|
||||
"rollup-plugin-babel": "4.4.0",
|
||||
"rollup-plugin-copy-glob": "0.3.2",
|
||||
"rollup-plugin-postcss": "4.0.2",
|
||||
"rollup-plugin-svgo": "2.0.0",
|
||||
"rollup-plugin-terser": "7.0.2",
|
||||
"style-loader": "1.1.2",
|
||||
"svg-inline-loader": "0.8.2",
|
||||
"terser": "5.16.6",
|
||||
"tslint": "6.1.3",
|
||||
"typescript": "5.0.2",
|
||||
"webpack": "5.76.0",
|
||||
"webpack-bundle-analyzer": "4.8.0",
|
||||
"webpack-cli": "5.0.1"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/apexcharts/apexcharts.js/issues"
|
||||
},
|
||||
"license": "MIT",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT",
|
||||
"url": "http://www.opensource.org/licenses/mit-license.php"
|
||||
}
|
||||
],
|
||||
"homepage": "https://apexcharts.com",
|
||||
"keywords": [
|
||||
"charts",
|
||||
"graphs",
|
||||
"visualizations",
|
||||
"data"
|
||||
]
|
||||
}
|
||||
@@ -1,779 +0,0 @@
|
||||
import Annotations from './modules/annotations/Annotations'
|
||||
import Base from './modules/Base'
|
||||
import CoreUtils from './modules/CoreUtils'
|
||||
import DataLabels from './modules/DataLabels'
|
||||
import Defaults from './modules/settings/Defaults'
|
||||
import Exports from './modules/Exports'
|
||||
import Grid from './modules/axes/Grid'
|
||||
import Markers from './modules/Markers'
|
||||
import Range from './modules/Range'
|
||||
import Utils from './utils/Utils'
|
||||
import XAxis from './modules/axes/XAxis'
|
||||
import YAxis from './modules/axes/YAxis'
|
||||
import InitCtxVariables from './modules/helpers/InitCtxVariables'
|
||||
import Destroy from './modules/helpers/Destroy'
|
||||
import { addResizeListener, removeResizeListener } from './utils/Resize'
|
||||
import apexCSS from './assets/apexcharts.css'
|
||||
|
||||
/**
|
||||
*
|
||||
* @module ApexCharts
|
||||
**/
|
||||
|
||||
export default class ApexCharts {
|
||||
constructor(el, opts) {
|
||||
this.opts = opts
|
||||
this.ctx = this
|
||||
|
||||
// Pass the user supplied options to the Base Class where these options will be extended with defaults. The returned object from Base Class will become the config object in the entire codebase.
|
||||
this.w = new Base(opts).init()
|
||||
|
||||
this.el = el
|
||||
|
||||
this.w.globals.cuid = Utils.randomId()
|
||||
this.w.globals.chartID = this.w.config.chart.id
|
||||
? Utils.escapeString(this.w.config.chart.id)
|
||||
: this.w.globals.cuid
|
||||
|
||||
const initCtx = new InitCtxVariables(this)
|
||||
initCtx.initModules()
|
||||
|
||||
this.create = Utils.bind(this.create, this)
|
||||
this.windowResizeHandler = this._windowResizeHandler.bind(this)
|
||||
this.parentResizeHandler = this._parentResizeCallback.bind(this)
|
||||
}
|
||||
|
||||
/**
|
||||
* The primary method user will call to render the chart.
|
||||
*/
|
||||
render() {
|
||||
// main method
|
||||
return new Promise((resolve, reject) => {
|
||||
// only draw chart, if element found
|
||||
if (this.el !== null) {
|
||||
if (typeof Apex._chartInstances === 'undefined') {
|
||||
Apex._chartInstances = []
|
||||
}
|
||||
if (this.w.config.chart.id) {
|
||||
Apex._chartInstances.push({
|
||||
id: this.w.globals.chartID,
|
||||
group: this.w.config.chart.group,
|
||||
chart: this,
|
||||
})
|
||||
}
|
||||
|
||||
// set the locale here
|
||||
this.setLocale(this.w.config.chart.defaultLocale)
|
||||
const beforeMount = this.w.config.chart.events.beforeMount
|
||||
if (typeof beforeMount === 'function') {
|
||||
beforeMount(this, this.w)
|
||||
}
|
||||
|
||||
this.events.fireEvent('beforeMount', [this, this.w])
|
||||
window.addEventListener('resize', this.windowResizeHandler)
|
||||
addResizeListener(this.el.parentNode, this.parentResizeHandler)
|
||||
|
||||
// Add CSS if not already added
|
||||
if (!this.css) {
|
||||
let rootNode = this.el.getRootNode && this.el.getRootNode()
|
||||
let inShadowRoot = Utils.is('ShadowRoot', rootNode)
|
||||
let doc = this.el.ownerDocument
|
||||
let globalCSS = doc.getElementById('apexcharts-css')
|
||||
|
||||
if (inShadowRoot || !globalCSS) {
|
||||
this.css = document.createElement('style')
|
||||
this.css.id = 'apexcharts-css'
|
||||
this.css.textContent = apexCSS
|
||||
const nonce = this.opts.chart?.nonce || this.w.config.chart.nonce;
|
||||
if (nonce) {
|
||||
this.css.setAttribute('nonce', nonce);
|
||||
}
|
||||
|
||||
if (inShadowRoot) {
|
||||
// We are in Shadow DOM, add to shadow root
|
||||
rootNode.prepend(this.css)
|
||||
} else {
|
||||
// Add to <head> of element's document
|
||||
doc.head.appendChild(this.css)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let graphData = this.create(this.w.config.series, {})
|
||||
if (!graphData) return resolve(this)
|
||||
this.mount(graphData)
|
||||
.then(() => {
|
||||
if (typeof this.w.config.chart.events.mounted === 'function') {
|
||||
this.w.config.chart.events.mounted(this, this.w)
|
||||
}
|
||||
|
||||
this.events.fireEvent('mounted', [this, this.w])
|
||||
resolve(graphData)
|
||||
})
|
||||
.catch((e) => {
|
||||
reject(e)
|
||||
// handle error in case no data or element not found
|
||||
})
|
||||
} else {
|
||||
reject(new Error('Element not found'))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
create(ser, opts) {
|
||||
let w = this.w
|
||||
|
||||
const initCtx = new InitCtxVariables(this)
|
||||
initCtx.initModules()
|
||||
let gl = this.w.globals
|
||||
|
||||
gl.noData = false
|
||||
gl.animationEnded = false
|
||||
|
||||
this.responsive.checkResponsiveConfig(opts)
|
||||
|
||||
if (w.config.xaxis.convertedCatToNumeric) {
|
||||
const defaults = new Defaults(w.config)
|
||||
defaults.convertCatToNumericXaxis(w.config, this.ctx)
|
||||
}
|
||||
|
||||
if (this.el === null) {
|
||||
gl.animationEnded = true
|
||||
return null
|
||||
}
|
||||
|
||||
this.core.setupElements()
|
||||
|
||||
if (w.config.chart.type === 'treemap') {
|
||||
w.config.grid.show = false
|
||||
w.config.yaxis[0].show = false
|
||||
}
|
||||
|
||||
if (gl.svgWidth === 0) {
|
||||
// if the element is hidden, skip drawing
|
||||
gl.animationEnded = true
|
||||
return null
|
||||
}
|
||||
|
||||
const combo = CoreUtils.checkComboSeries(ser)
|
||||
gl.comboCharts = combo.comboCharts
|
||||
gl.comboBarCount = combo.comboBarCount
|
||||
|
||||
const allSeriesAreEmpty = ser.every((s) => s.data && s.data.length === 0)
|
||||
|
||||
if (ser.length === 0 || allSeriesAreEmpty) {
|
||||
this.series.handleNoData()
|
||||
}
|
||||
|
||||
this.events.setupEventHandlers()
|
||||
|
||||
// Handle the data inputted by user and set some of the global variables (for eg, if data is datetime / numeric / category). Don't calculate the range / min / max at this time
|
||||
this.data.parseData(ser)
|
||||
|
||||
// this is a good time to set theme colors first
|
||||
this.theme.init()
|
||||
|
||||
// as markers accepts array, we need to setup global markers for easier access
|
||||
const markers = new Markers(this)
|
||||
markers.setGlobalMarkerSize()
|
||||
|
||||
// labelFormatters should be called before dimensions as in dimensions we need text labels width
|
||||
this.formatters.setLabelFormatters()
|
||||
this.titleSubtitle.draw()
|
||||
|
||||
// legend is calculated here before coreCalculations because it affects the plottable area
|
||||
// if there is some data to show or user collapsed all series, then proceed drawing legend
|
||||
if (
|
||||
!gl.noData ||
|
||||
gl.collapsedSeries.length === gl.series.length ||
|
||||
w.config.legend.showForSingleSeries
|
||||
) {
|
||||
this.legend.init()
|
||||
}
|
||||
|
||||
// check whether in multiple series, all series share the same X
|
||||
this.series.hasAllSeriesEqualX()
|
||||
|
||||
// coreCalculations will give the min/max range and yaxis/axis values. It should be called here to set series variable from config to globals
|
||||
if (gl.axisCharts) {
|
||||
this.core.coreCalculations()
|
||||
if (w.config.xaxis.type !== 'category') {
|
||||
// as we have minX and maxX values, determine the default DateTimeFormat for time series
|
||||
this.formatters.setLabelFormatters()
|
||||
}
|
||||
this.ctx.toolbar.minX = w.globals.minX
|
||||
this.ctx.toolbar.maxX = w.globals.maxX
|
||||
}
|
||||
|
||||
// we need to generate yaxis for heatmap separately as we are not showing numerics there, but seriesNames. There are some tweaks which are required for heatmap to align labels correctly which are done in below function
|
||||
// Also we need to do this before calculating Dimensions plotCoords() method of Dimensions
|
||||
this.formatters.heatmapLabelFormatters()
|
||||
|
||||
// get the largest marker size which will be needed in dimensions calc
|
||||
const coreUtils = new CoreUtils(this)
|
||||
coreUtils.getLargestMarkerSize()
|
||||
|
||||
// We got plottable area here, next task would be to calculate axis areas
|
||||
this.dimensions.plotCoords()
|
||||
|
||||
const xyRatios = this.core.xySettings()
|
||||
|
||||
this.grid.createGridMask()
|
||||
|
||||
const elGraph = this.core.plotChartType(ser, xyRatios)
|
||||
|
||||
const dataLabels = new DataLabels(this)
|
||||
dataLabels.bringForward()
|
||||
if (w.config.dataLabels.background.enabled) {
|
||||
dataLabels.dataLabelsBackground()
|
||||
}
|
||||
|
||||
// after all the drawing calculations, shift the graphical area (actual charts/bars) excluding legends
|
||||
this.core.shiftGraphPosition()
|
||||
|
||||
const dim = {
|
||||
plot: {
|
||||
left: w.globals.translateX,
|
||||
top: w.globals.translateY,
|
||||
width: w.globals.gridWidth,
|
||||
height: w.globals.gridHeight,
|
||||
},
|
||||
}
|
||||
|
||||
return {
|
||||
elGraph,
|
||||
xyRatios,
|
||||
dimensions: dim,
|
||||
}
|
||||
}
|
||||
|
||||
mount(graphData = null) {
|
||||
let me = this
|
||||
let w = me.w
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
// no data to display
|
||||
if (me.el === null) {
|
||||
return reject(
|
||||
new Error('Not enough data to display or target element not found')
|
||||
)
|
||||
} else if (graphData === null || w.globals.allSeriesCollapsed) {
|
||||
me.series.handleNoData()
|
||||
}
|
||||
|
||||
me.grid = new Grid(me)
|
||||
let elgrid = me.grid.drawGrid()
|
||||
|
||||
me.annotations = new Annotations(me)
|
||||
me.annotations.drawImageAnnos()
|
||||
me.annotations.drawTextAnnos()
|
||||
|
||||
if (w.config.grid.position === 'back') {
|
||||
if (elgrid) {
|
||||
w.globals.dom.elGraphical.add(elgrid.el)
|
||||
}
|
||||
if (elgrid?.elGridBorders?.node) {
|
||||
w.globals.dom.elGraphical.add(elgrid.elGridBorders)
|
||||
}
|
||||
}
|
||||
|
||||
if (Array.isArray(graphData.elGraph)) {
|
||||
for (let g = 0; g < graphData.elGraph.length; g++) {
|
||||
w.globals.dom.elGraphical.add(graphData.elGraph[g])
|
||||
}
|
||||
} else {
|
||||
w.globals.dom.elGraphical.add(graphData.elGraph)
|
||||
}
|
||||
|
||||
if (w.config.grid.position === 'front') {
|
||||
if (elgrid) {
|
||||
w.globals.dom.elGraphical.add(elgrid.el)
|
||||
}
|
||||
if (elgrid?.elGridBorders?.node) {
|
||||
w.globals.dom.elGraphical.add(elgrid.elGridBorders)
|
||||
}
|
||||
}
|
||||
|
||||
if (w.config.xaxis.crosshairs.position === 'front') {
|
||||
me.crosshairs.drawXCrosshairs()
|
||||
}
|
||||
|
||||
if (w.config.yaxis[0].crosshairs.position === 'front') {
|
||||
me.crosshairs.drawYCrosshairs()
|
||||
}
|
||||
|
||||
if (w.config.chart.type !== 'treemap') {
|
||||
me.axes.drawAxis(w.config.chart.type, elgrid)
|
||||
}
|
||||
|
||||
let xAxis = new XAxis(this.ctx, elgrid)
|
||||
let yaxis = new YAxis(this.ctx, elgrid)
|
||||
if (elgrid !== null) {
|
||||
xAxis.xAxisLabelCorrections(elgrid.xAxisTickWidth)
|
||||
yaxis.setYAxisTextAlignments()
|
||||
|
||||
w.config.yaxis.map((yaxe, index) => {
|
||||
if (w.globals.ignoreYAxisIndexes.indexOf(index) === -1) {
|
||||
yaxis.yAxisTitleRotate(index, yaxe.opposite)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
me.annotations.drawAxesAnnotations()
|
||||
|
||||
if (!w.globals.noData) {
|
||||
// draw tooltips at the end
|
||||
if (w.config.tooltip.enabled && !w.globals.noData) {
|
||||
me.w.globals.tooltip.drawTooltip(graphData.xyRatios)
|
||||
}
|
||||
|
||||
if (
|
||||
w.globals.axisCharts &&
|
||||
(w.globals.isXNumeric ||
|
||||
w.config.xaxis.convertedCatToNumeric ||
|
||||
w.globals.isRangeBar)
|
||||
) {
|
||||
if (
|
||||
w.config.chart.zoom.enabled ||
|
||||
(w.config.chart.selection && w.config.chart.selection.enabled) ||
|
||||
(w.config.chart.pan && w.config.chart.pan.enabled)
|
||||
) {
|
||||
me.zoomPanSelection.init({
|
||||
xyRatios: graphData.xyRatios,
|
||||
})
|
||||
}
|
||||
} else {
|
||||
const tools = w.config.chart.toolbar.tools
|
||||
let toolsArr = [
|
||||
'zoom',
|
||||
'zoomin',
|
||||
'zoomout',
|
||||
'selection',
|
||||
'pan',
|
||||
'reset',
|
||||
]
|
||||
toolsArr.forEach((t) => {
|
||||
tools[t] = false
|
||||
})
|
||||
}
|
||||
|
||||
if (w.config.chart.toolbar.show && !w.globals.allSeriesCollapsed) {
|
||||
me.toolbar.createToolbar()
|
||||
}
|
||||
}
|
||||
|
||||
if (w.globals.memory.methodsToExec.length > 0) {
|
||||
w.globals.memory.methodsToExec.forEach((fn) => {
|
||||
fn.method(fn.params, false, fn.context)
|
||||
})
|
||||
}
|
||||
|
||||
if (!w.globals.axisCharts && !w.globals.noData) {
|
||||
me.core.resizeNonAxisCharts()
|
||||
}
|
||||
resolve(me)
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroy the chart instance by removing all elements which also clean up event listeners on those elements.
|
||||
*/
|
||||
destroy() {
|
||||
window.removeEventListener('resize', this.windowResizeHandler)
|
||||
|
||||
removeResizeListener(this.el.parentNode, this.parentResizeHandler)
|
||||
// remove the chart's instance from the global Apex._chartInstances
|
||||
const chartID = this.w.config.chart.id
|
||||
if (chartID) {
|
||||
Apex._chartInstances.forEach((c, i) => {
|
||||
if (c.id === Utils.escapeString(chartID)) {
|
||||
Apex._chartInstances.splice(i, 1)
|
||||
}
|
||||
})
|
||||
}
|
||||
new Destroy(this.ctx).clear({ isUpdating: false })
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows users to update Options after the chart has rendered.
|
||||
*
|
||||
* @param {object} options - A new config object can be passed which will be merged with the existing config object
|
||||
* @param {boolean} redraw - should redraw from beginning or should use existing paths and redraw from there
|
||||
* @param {boolean} animate - should animate or not on updating Options
|
||||
*/
|
||||
updateOptions(
|
||||
options,
|
||||
redraw = false,
|
||||
animate = true,
|
||||
updateSyncedCharts = true,
|
||||
overwriteInitialConfig = true
|
||||
) {
|
||||
const w = this.w
|
||||
|
||||
// when called externally, clear some global variables
|
||||
// fixes apexcharts.js#1488
|
||||
w.globals.selection = undefined
|
||||
|
||||
if (options.series) {
|
||||
this.series.resetSeries(false, true, false)
|
||||
if (options.series.length && options.series[0].data) {
|
||||
options.series = options.series.map((s, i) => {
|
||||
return this.updateHelpers._extendSeries(s, i)
|
||||
})
|
||||
}
|
||||
|
||||
// user updated the series via updateOptions() function.
|
||||
// Hence, we need to reset axis min/max to avoid zooming issues
|
||||
this.updateHelpers.revertDefaultAxisMinMax()
|
||||
}
|
||||
// user has set x-axis min/max externally - hence we need to forcefully set the xaxis min/max
|
||||
if (options.xaxis) {
|
||||
options = this.updateHelpers.forceXAxisUpdate(options)
|
||||
}
|
||||
if (options.yaxis) {
|
||||
options = this.updateHelpers.forceYAxisUpdate(options)
|
||||
}
|
||||
if (w.globals.collapsedSeriesIndices.length > 0) {
|
||||
this.series.clearPreviousPaths()
|
||||
}
|
||||
/* update theme mode#459 */
|
||||
if (options.theme) {
|
||||
options = this.theme.updateThemeOptions(options)
|
||||
}
|
||||
return this.updateHelpers._updateOptions(
|
||||
options,
|
||||
redraw,
|
||||
animate,
|
||||
updateSyncedCharts,
|
||||
overwriteInitialConfig
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows users to update Series after the chart has rendered.
|
||||
*
|
||||
* @param {array} series - New series which will override the existing
|
||||
*/
|
||||
updateSeries(newSeries = [], animate = true, overwriteInitialSeries = true) {
|
||||
this.series.resetSeries(false)
|
||||
this.updateHelpers.revertDefaultAxisMinMax()
|
||||
return this.updateHelpers._updateSeries(
|
||||
newSeries,
|
||||
animate,
|
||||
overwriteInitialSeries
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows users to append a new series after the chart has rendered.
|
||||
*
|
||||
* @param {array} newSerie - New serie which will be appended to the existing series
|
||||
*/
|
||||
appendSeries(newSerie, animate = true, overwriteInitialSeries = true) {
|
||||
const newSeries = this.w.config.series.slice()
|
||||
newSeries.push(newSerie)
|
||||
this.series.resetSeries(false)
|
||||
this.updateHelpers.revertDefaultAxisMinMax()
|
||||
return this.updateHelpers._updateSeries(
|
||||
newSeries,
|
||||
animate,
|
||||
overwriteInitialSeries
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows users to append Data to series.
|
||||
*
|
||||
* @param {array} newData - New data in the same format as series
|
||||
*/
|
||||
appendData(newData, overwriteInitialSeries = true) {
|
||||
let me = this
|
||||
|
||||
me.w.globals.dataChanged = true
|
||||
|
||||
me.series.getPreviousPaths()
|
||||
|
||||
let newSeries = me.w.config.series.slice()
|
||||
|
||||
for (let i = 0; i < newSeries.length; i++) {
|
||||
if (newData[i] !== null && typeof newData[i] !== 'undefined') {
|
||||
for (let j = 0; j < newData[i].data.length; j++) {
|
||||
newSeries[i].data.push(newData[i].data[j])
|
||||
}
|
||||
}
|
||||
}
|
||||
me.w.config.series = newSeries
|
||||
if (overwriteInitialSeries) {
|
||||
me.w.globals.initialSeries = Utils.clone(me.w.config.series)
|
||||
}
|
||||
|
||||
return this.update()
|
||||
}
|
||||
|
||||
update(options) {
|
||||
return new Promise((resolve, reject) => {
|
||||
new Destroy(this.ctx).clear({ isUpdating: true })
|
||||
|
||||
const graphData = this.create(this.w.config.series, options)
|
||||
if (!graphData) return resolve(this)
|
||||
this.mount(graphData)
|
||||
.then(() => {
|
||||
if (typeof this.w.config.chart.events.updated === 'function') {
|
||||
this.w.config.chart.events.updated(this, this.w)
|
||||
}
|
||||
this.events.fireEvent('updated', [this, this.w])
|
||||
|
||||
this.w.globals.isDirty = true
|
||||
|
||||
resolve(this)
|
||||
})
|
||||
.catch((e) => {
|
||||
reject(e)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all charts in the same "group" (including the instance which is called upon) to sync them when user zooms in/out or pan.
|
||||
*/
|
||||
getSyncedCharts() {
|
||||
const chartGroups = this.getGroupedCharts()
|
||||
let allCharts = [this]
|
||||
if (chartGroups.length) {
|
||||
allCharts = []
|
||||
chartGroups.forEach((ch) => {
|
||||
allCharts.push(ch)
|
||||
})
|
||||
}
|
||||
|
||||
return allCharts
|
||||
}
|
||||
|
||||
/**
|
||||
* Get charts in the same "group" (excluding the instance which is called upon) to perform operations on the other charts of the same group (eg., tooltip hovering)
|
||||
*/
|
||||
getGroupedCharts() {
|
||||
return Apex._chartInstances
|
||||
.filter((ch) => {
|
||||
if (ch.group) {
|
||||
return true
|
||||
}
|
||||
})
|
||||
.map((ch) => (this.w.config.chart.group === ch.group ? ch.chart : this))
|
||||
}
|
||||
|
||||
static getChartByID(id) {
|
||||
const chartId = Utils.escapeString(id)
|
||||
if (!Apex._chartInstances) return undefined
|
||||
|
||||
const c = Apex._chartInstances.filter((ch) => ch.id === chartId)[0]
|
||||
return c && c.chart
|
||||
}
|
||||
|
||||
/**
|
||||
* Allows the user to provide data attrs in the element and the chart will render automatically when this method is called by searching for the elements containing 'data-apexcharts' attribute
|
||||
*/
|
||||
static initOnLoad() {
|
||||
const els = document.querySelectorAll('[data-apexcharts]')
|
||||
|
||||
for (let i = 0; i < els.length; i++) {
|
||||
const el = els[i]
|
||||
const options = JSON.parse(els[i].getAttribute('data-options'))
|
||||
const apexChart = new ApexCharts(el, options)
|
||||
apexChart.render()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This static method allows users to call chart methods without necessarily from the
|
||||
* instance of the chart in case user has assigned chartID to the targeted chart.
|
||||
* The chartID is used for mapping the instance stored in Apex._chartInstances global variable
|
||||
*
|
||||
* This is helpful in cases when you don't have reference of the chart instance
|
||||
* easily and need to call the method from anywhere.
|
||||
* For eg, in React/Vue applications when you have many parent/child components,
|
||||
* and need easy reference to other charts for performing dynamic operations
|
||||
*
|
||||
* @param {string} chartID - The unique identifier which will be used to call methods
|
||||
* on that chart instance
|
||||
* @param {function} fn - The method name to call
|
||||
* @param {object} opts - The parameters which are accepted in the original method will be passed here in the same order.
|
||||
*/
|
||||
static exec(chartID, fn, ...opts) {
|
||||
const chart = this.getChartByID(chartID)
|
||||
if (!chart) return
|
||||
|
||||
// turn on the global exec flag to indicate this method was called
|
||||
chart.w.globals.isExecCalled = true
|
||||
|
||||
let ret = null
|
||||
if (chart.publicMethods.indexOf(fn) !== -1) {
|
||||
ret = chart[fn](...opts)
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
static merge(target, source) {
|
||||
return Utils.extend(target, source)
|
||||
}
|
||||
|
||||
toggleSeries(seriesName) {
|
||||
return this.series.toggleSeries(seriesName)
|
||||
}
|
||||
|
||||
highlightSeriesOnLegendHover(e, targetElement) {
|
||||
return this.series.toggleSeriesOnHover(e, targetElement)
|
||||
}
|
||||
|
||||
showSeries(seriesName) {
|
||||
this.series.showSeries(seriesName)
|
||||
}
|
||||
|
||||
hideSeries(seriesName) {
|
||||
this.series.hideSeries(seriesName)
|
||||
}
|
||||
|
||||
isSeriesHidden(seriesName) {
|
||||
this.series.isSeriesHidden(seriesName);
|
||||
}
|
||||
|
||||
resetSeries(shouldUpdateChart = true, shouldResetZoom = true) {
|
||||
this.series.resetSeries(shouldUpdateChart, shouldResetZoom)
|
||||
}
|
||||
|
||||
// Public method to add event listener on chart context
|
||||
addEventListener(name, handler) {
|
||||
this.events.addEventListener(name, handler)
|
||||
}
|
||||
|
||||
// Public method to remove event listener on chart context
|
||||
removeEventListener(name, handler) {
|
||||
this.events.removeEventListener(name, handler)
|
||||
}
|
||||
|
||||
addXaxisAnnotation(opts, pushToMemory = true, context = undefined) {
|
||||
let me = this
|
||||
if (context) {
|
||||
me = context
|
||||
}
|
||||
me.annotations.addXaxisAnnotationExternal(opts, pushToMemory, me)
|
||||
}
|
||||
|
||||
addYaxisAnnotation(opts, pushToMemory = true, context = undefined) {
|
||||
let me = this
|
||||
if (context) {
|
||||
me = context
|
||||
}
|
||||
me.annotations.addYaxisAnnotationExternal(opts, pushToMemory, me)
|
||||
}
|
||||
|
||||
addPointAnnotation(opts, pushToMemory = true, context = undefined) {
|
||||
let me = this
|
||||
if (context) {
|
||||
me = context
|
||||
}
|
||||
me.annotations.addPointAnnotationExternal(opts, pushToMemory, me)
|
||||
}
|
||||
|
||||
clearAnnotations(context = undefined) {
|
||||
let me = this
|
||||
if (context) {
|
||||
me = context
|
||||
}
|
||||
me.annotations.clearAnnotations(me)
|
||||
}
|
||||
|
||||
removeAnnotation(id, context = undefined) {
|
||||
let me = this
|
||||
if (context) {
|
||||
me = context
|
||||
}
|
||||
me.annotations.removeAnnotation(me, id)
|
||||
}
|
||||
|
||||
getChartArea() {
|
||||
const el = this.w.globals.dom.baseEl.querySelector('.apexcharts-inner')
|
||||
|
||||
return el
|
||||
}
|
||||
|
||||
getSeriesTotalXRange(minX, maxX) {
|
||||
return this.coreUtils.getSeriesTotalsXRange(minX, maxX)
|
||||
}
|
||||
|
||||
getHighestValueInSeries(seriesIndex = 0) {
|
||||
const range = new Range(this.ctx)
|
||||
return range.getMinYMaxY(seriesIndex).highestY
|
||||
}
|
||||
|
||||
getLowestValueInSeries(seriesIndex = 0) {
|
||||
const range = new Range(this.ctx)
|
||||
return range.getMinYMaxY(seriesIndex).lowestY
|
||||
}
|
||||
|
||||
getSeriesTotal() {
|
||||
return this.w.globals.seriesTotals
|
||||
}
|
||||
|
||||
toggleDataPointSelection(seriesIndex, dataPointIndex) {
|
||||
return this.updateHelpers.toggleDataPointSelection(
|
||||
seriesIndex,
|
||||
dataPointIndex
|
||||
)
|
||||
}
|
||||
|
||||
zoomX(min, max) {
|
||||
this.ctx.toolbar.zoomUpdateOptions(min, max)
|
||||
}
|
||||
|
||||
setLocale(localeName) {
|
||||
this.localization.setCurrentLocaleValues(localeName)
|
||||
}
|
||||
|
||||
dataURI(options) {
|
||||
const exp = new Exports(this.ctx)
|
||||
return exp.dataURI(options)
|
||||
}
|
||||
|
||||
exportToCSV(options = {}) {
|
||||
const exp = new Exports(this.ctx)
|
||||
return exp.exportToCSV(options)
|
||||
}
|
||||
|
||||
paper() {
|
||||
return this.w.globals.dom.Paper
|
||||
}
|
||||
|
||||
_parentResizeCallback() {
|
||||
if (
|
||||
this.w.globals.animationEnded &&
|
||||
this.w.config.chart.redrawOnParentResize
|
||||
) {
|
||||
this._windowResize()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle window resize and re-draw the whole chart.
|
||||
*/
|
||||
_windowResize() {
|
||||
clearTimeout(this.w.globals.resizeTimer)
|
||||
this.w.globals.resizeTimer = window.setTimeout(() => {
|
||||
this.w.globals.resized = true
|
||||
this.w.globals.dataChanged = false
|
||||
|
||||
// we need to redraw the whole chart on window resize (with a small delay).
|
||||
this.ctx.update()
|
||||
}, 150)
|
||||
}
|
||||
|
||||
_windowResizeHandler() {
|
||||
let { redrawOnWindowResize: redraw } = this.w.config.chart
|
||||
|
||||
if (typeof redraw === 'function') {
|
||||
redraw = redraw()
|
||||
}
|
||||
|
||||
redraw && this._windowResize()
|
||||
}
|
||||
}
|
||||
@@ -1,601 +0,0 @@
|
||||
@keyframes opaque {
|
||||
0% {
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
to {
|
||||
opacity: 1
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes resizeanim {
|
||||
0%,to {
|
||||
opacity: 0
|
||||
}
|
||||
}
|
||||
|
||||
.apexcharts-canvas {
|
||||
position: relative;
|
||||
user-select: none
|
||||
}
|
||||
|
||||
.apexcharts-canvas ::-webkit-scrollbar {
|
||||
-webkit-appearance: none;
|
||||
width: 6px
|
||||
}
|
||||
|
||||
.apexcharts-canvas ::-webkit-scrollbar-thumb {
|
||||
border-radius: 4px;
|
||||
background-color: rgba(0,0,0,.5);
|
||||
box-shadow: 0 0 1px rgba(255,255,255,.5);
|
||||
-webkit-box-shadow: 0 0 1px rgba(255,255,255,.5)
|
||||
}
|
||||
|
||||
.apexcharts-inner {
|
||||
position: relative
|
||||
}
|
||||
|
||||
.apexcharts-text tspan {
|
||||
font-family: inherit
|
||||
}
|
||||
|
||||
.legend-mouseover-inactive {
|
||||
transition: .15s ease all;
|
||||
opacity: .2
|
||||
}
|
||||
|
||||
.apexcharts-legend-text {
|
||||
padding-left: 15px;
|
||||
margin-left: -15px;
|
||||
}
|
||||
|
||||
.apexcharts-series-collapsed {
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
.apexcharts-tooltip {
|
||||
border-radius: 5px;
|
||||
box-shadow: 2px 2px 6px -4px #999;
|
||||
cursor: default;
|
||||
font-size: 14px;
|
||||
left: 62px;
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
z-index: 12;
|
||||
transition: .15s ease all
|
||||
}
|
||||
|
||||
.apexcharts-tooltip.apexcharts-active {
|
||||
opacity: 1;
|
||||
transition: .15s ease all
|
||||
}
|
||||
|
||||
.apexcharts-tooltip.apexcharts-theme-light {
|
||||
border: 1px solid #e3e3e3;
|
||||
background: rgba(255,255,255,.96)
|
||||
}
|
||||
|
||||
.apexcharts-tooltip.apexcharts-theme-dark {
|
||||
color: #fff;
|
||||
background: rgba(30,30,30,.8)
|
||||
}
|
||||
|
||||
.apexcharts-tooltip * {
|
||||
font-family: inherit
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-title {
|
||||
padding: 6px;
|
||||
font-size: 15px;
|
||||
margin-bottom: 4px
|
||||
}
|
||||
|
||||
.apexcharts-tooltip.apexcharts-theme-light .apexcharts-tooltip-title {
|
||||
background: #eceff1;
|
||||
border-bottom: 1px solid #ddd
|
||||
}
|
||||
|
||||
.apexcharts-tooltip.apexcharts-theme-dark .apexcharts-tooltip-title {
|
||||
background: rgba(0,0,0,.7);
|
||||
border-bottom: 1px solid #333
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-text-goals-value,.apexcharts-tooltip-text-y-value,.apexcharts-tooltip-text-z-value {
|
||||
display: inline-block;
|
||||
margin-left: 5px;
|
||||
font-weight: 600
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-text-goals-label:empty,.apexcharts-tooltip-text-goals-value:empty,.apexcharts-tooltip-text-y-label:empty,.apexcharts-tooltip-text-y-value:empty,.apexcharts-tooltip-text-z-value:empty,.apexcharts-tooltip-title:empty {
|
||||
display: none
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-text-goals-label,.apexcharts-tooltip-text-goals-value {
|
||||
padding: 6px 0 5px
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-goals-group,.apexcharts-tooltip-text-goals-label,.apexcharts-tooltip-text-goals-value {
|
||||
display: flex
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-text-goals-label:not(:empty),.apexcharts-tooltip-text-goals-value:not(:empty) {
|
||||
margin-top: -6px
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-marker {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
position: relative;
|
||||
top: 0;
|
||||
margin-right: 10px;
|
||||
border-radius: 50%
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-series-group {
|
||||
padding: 0 10px;
|
||||
display: none;
|
||||
text-align: left;
|
||||
justify-content: left;
|
||||
align-items: center
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-series-group.apexcharts-active .apexcharts-tooltip-marker {
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-series-group.apexcharts-active,.apexcharts-tooltip-series-group:last-child {
|
||||
padding-bottom: 4px
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-series-group-hidden {
|
||||
opacity: 0;
|
||||
height: 0;
|
||||
line-height: 0;
|
||||
padding: 0!important
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-y-group {
|
||||
padding: 6px 0 5px
|
||||
}
|
||||
|
||||
.apexcharts-custom-tooltip,.apexcharts-tooltip-box {
|
||||
padding: 4px 8px
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-boxPlot {
|
||||
display: flex;
|
||||
flex-direction: column-reverse
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-box>div {
|
||||
margin: 4px 0
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-box span.value {
|
||||
font-weight: 700
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-rangebar {
|
||||
padding: 5px 8px
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-rangebar .category {
|
||||
font-weight: 600;
|
||||
color: #777
|
||||
}
|
||||
|
||||
.apexcharts-tooltip-rangebar .series-name {
|
||||
font-weight: 700;
|
||||
display: block;
|
||||
margin-bottom: 5px
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip,.apexcharts-yaxistooltip {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
color: #373d3f;
|
||||
font-size: 13px;
|
||||
text-align: center;
|
||||
border-radius: 2px;
|
||||
position: absolute;
|
||||
z-index: 10;
|
||||
background: #eceff1;
|
||||
border: 1px solid #90a4ae
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip {
|
||||
padding: 9px 10px;
|
||||
transition: .15s ease all
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip.apexcharts-theme-dark {
|
||||
background: rgba(0,0,0,.7);
|
||||
border: 1px solid rgba(0,0,0,.5);
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip:after,.apexcharts-xaxistooltip:before {
|
||||
left: 50%;
|
||||
border: solid transparent;
|
||||
content: " ";
|
||||
height: 0;
|
||||
width: 0;
|
||||
position: absolute;
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip:after {
|
||||
border-color: transparent;
|
||||
border-width: 6px;
|
||||
margin-left: -6px
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip:before {
|
||||
border-color: transparent;
|
||||
border-width: 7px;
|
||||
margin-left: -7px
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip-bottom:after,.apexcharts-xaxistooltip-bottom:before {
|
||||
bottom: 100%
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip-top:after,.apexcharts-xaxistooltip-top:before {
|
||||
top: 100%
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip-bottom:after {
|
||||
border-bottom-color: #eceff1
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip-bottom:before {
|
||||
border-bottom-color: #90a4ae
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip-bottom.apexcharts-theme-dark:after,.apexcharts-xaxistooltip-bottom.apexcharts-theme-dark:before {
|
||||
border-bottom-color: rgba(0,0,0,.5)
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip-top:after {
|
||||
border-top-color: #eceff1
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip-top:before {
|
||||
border-top-color: #90a4ae
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip-top.apexcharts-theme-dark:after,.apexcharts-xaxistooltip-top.apexcharts-theme-dark:before {
|
||||
border-top-color: rgba(0,0,0,.5)
|
||||
}
|
||||
|
||||
.apexcharts-xaxistooltip.apexcharts-active {
|
||||
opacity: 1;
|
||||
transition: .15s ease all
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip {
|
||||
padding: 4px 10px
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip.apexcharts-theme-dark {
|
||||
background: rgba(0,0,0,.7);
|
||||
border: 1px solid rgba(0,0,0,.5);
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip:after,.apexcharts-yaxistooltip:before {
|
||||
top: 50%;
|
||||
border: solid transparent;
|
||||
content: " ";
|
||||
height: 0;
|
||||
width: 0;
|
||||
position: absolute;
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip:after {
|
||||
border-color: transparent;
|
||||
border-width: 6px;
|
||||
margin-top: -6px
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip:before {
|
||||
border-color: transparent;
|
||||
border-width: 7px;
|
||||
margin-top: -7px
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-left:after,.apexcharts-yaxistooltip-left:before {
|
||||
left: 100%
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-right:after,.apexcharts-yaxistooltip-right:before {
|
||||
right: 100%
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-left:after {
|
||||
border-left-color: #eceff1
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-left:before {
|
||||
border-left-color: #90a4ae
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-left.apexcharts-theme-dark:after,.apexcharts-yaxistooltip-left.apexcharts-theme-dark:before {
|
||||
border-left-color: rgba(0,0,0,.5)
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-right:after {
|
||||
border-right-color: #eceff1
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-right:before {
|
||||
border-right-color: #90a4ae
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-right.apexcharts-theme-dark:after,.apexcharts-yaxistooltip-right.apexcharts-theme-dark:before {
|
||||
border-right-color: rgba(0,0,0,.5)
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip.apexcharts-active {
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
.apexcharts-yaxistooltip-hidden {
|
||||
display: none
|
||||
}
|
||||
|
||||
.apexcharts-xcrosshairs,.apexcharts-ycrosshairs {
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
transition: .15s ease all
|
||||
}
|
||||
|
||||
.apexcharts-xcrosshairs.apexcharts-active,.apexcharts-ycrosshairs.apexcharts-active {
|
||||
opacity: 1;
|
||||
transition: .15s ease all
|
||||
}
|
||||
|
||||
.apexcharts-ycrosshairs-hidden {
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
.apexcharts-selection-rect {
|
||||
cursor: move
|
||||
}
|
||||
|
||||
.svg_select_boundingRect,.svg_select_points_rot {
|
||||
pointer-events: none;
|
||||
opacity: 0;
|
||||
visibility: hidden
|
||||
}
|
||||
|
||||
.apexcharts-selection-rect+g .svg_select_boundingRect,.apexcharts-selection-rect+g .svg_select_points_rot {
|
||||
opacity: 0;
|
||||
visibility: hidden
|
||||
}
|
||||
|
||||
.apexcharts-selection-rect+g .svg_select_points_l,.apexcharts-selection-rect+g .svg_select_points_r {
|
||||
cursor: ew-resize;
|
||||
opacity: 1;
|
||||
visibility: visible
|
||||
}
|
||||
|
||||
.svg_select_points {
|
||||
fill: #efefef;
|
||||
stroke: #333;
|
||||
rx: 2
|
||||
}
|
||||
|
||||
.apexcharts-svg.apexcharts-zoomable.hovering-zoom {
|
||||
cursor: crosshair
|
||||
}
|
||||
|
||||
.apexcharts-svg.apexcharts-zoomable.hovering-pan {
|
||||
cursor: move
|
||||
}
|
||||
|
||||
.apexcharts-menu-icon,.apexcharts-pan-icon,.apexcharts-reset-icon,.apexcharts-selection-icon,.apexcharts-toolbar-custom-icon,.apexcharts-zoom-icon,.apexcharts-zoomin-icon,.apexcharts-zoomout-icon {
|
||||
cursor: pointer;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
line-height: 24px;
|
||||
color: #6e8192;
|
||||
text-align: center
|
||||
}
|
||||
|
||||
.apexcharts-menu-icon svg,.apexcharts-reset-icon svg,.apexcharts-zoom-icon svg,.apexcharts-zoomin-icon svg,.apexcharts-zoomout-icon svg {
|
||||
fill: #6e8192
|
||||
}
|
||||
|
||||
.apexcharts-selection-icon svg {
|
||||
fill: #444;
|
||||
transform: scale(.76)
|
||||
}
|
||||
|
||||
.apexcharts-theme-dark .apexcharts-menu-icon svg,.apexcharts-theme-dark .apexcharts-pan-icon svg,.apexcharts-theme-dark .apexcharts-reset-icon svg,.apexcharts-theme-dark .apexcharts-selection-icon svg,.apexcharts-theme-dark .apexcharts-toolbar-custom-icon svg,.apexcharts-theme-dark .apexcharts-zoom-icon svg,.apexcharts-theme-dark .apexcharts-zoomin-icon svg,.apexcharts-theme-dark .apexcharts-zoomout-icon svg {
|
||||
fill: #f3f4f5
|
||||
}
|
||||
|
||||
.apexcharts-canvas .apexcharts-reset-zoom-icon.apexcharts-selected svg,.apexcharts-canvas .apexcharts-selection-icon.apexcharts-selected svg,.apexcharts-canvas .apexcharts-zoom-icon.apexcharts-selected svg {
|
||||
fill: #008ffb
|
||||
}
|
||||
|
||||
.apexcharts-theme-light .apexcharts-menu-icon:hover svg,.apexcharts-theme-light .apexcharts-reset-icon:hover svg,.apexcharts-theme-light .apexcharts-selection-icon:not(.apexcharts-selected):hover svg,.apexcharts-theme-light .apexcharts-zoom-icon:not(.apexcharts-selected):hover svg,.apexcharts-theme-light .apexcharts-zoomin-icon:hover svg,.apexcharts-theme-light .apexcharts-zoomout-icon:hover svg {
|
||||
fill: #333
|
||||
}
|
||||
|
||||
.apexcharts-menu-icon,.apexcharts-selection-icon {
|
||||
position: relative
|
||||
}
|
||||
|
||||
.apexcharts-reset-icon {
|
||||
margin-left: 5px
|
||||
}
|
||||
|
||||
.apexcharts-menu-icon,.apexcharts-reset-icon,.apexcharts-zoom-icon {
|
||||
transform: scale(.85)
|
||||
}
|
||||
|
||||
.apexcharts-zoomin-icon,.apexcharts-zoomout-icon {
|
||||
transform: scale(.7)
|
||||
}
|
||||
|
||||
.apexcharts-zoomout-icon {
|
||||
margin-right: 3px
|
||||
}
|
||||
|
||||
.apexcharts-pan-icon {
|
||||
transform: scale(.62);
|
||||
position: relative;
|
||||
left: 1px;
|
||||
top: 0
|
||||
}
|
||||
|
||||
.apexcharts-pan-icon svg {
|
||||
fill: #fff;
|
||||
stroke: #6e8192;
|
||||
stroke-width: 2
|
||||
}
|
||||
|
||||
.apexcharts-pan-icon.apexcharts-selected svg {
|
||||
stroke: #008ffb
|
||||
}
|
||||
|
||||
.apexcharts-pan-icon:not(.apexcharts-selected):hover svg {
|
||||
stroke: #333
|
||||
}
|
||||
|
||||
.apexcharts-toolbar {
|
||||
position: absolute;
|
||||
z-index: 11;
|
||||
max-width: 176px;
|
||||
text-align: right;
|
||||
border-radius: 3px;
|
||||
padding: 0 6px 2px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center
|
||||
}
|
||||
|
||||
.apexcharts-menu {
|
||||
background: #fff;
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 3px;
|
||||
padding: 3px;
|
||||
right: 10px;
|
||||
opacity: 0;
|
||||
min-width: 110px;
|
||||
transition: .15s ease all;
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.apexcharts-menu.apexcharts-menu-open {
|
||||
opacity: 1;
|
||||
pointer-events: all;
|
||||
transition: .15s ease all
|
||||
}
|
||||
|
||||
.apexcharts-menu-item {
|
||||
padding: 6px 7px;
|
||||
font-size: 12px;
|
||||
cursor: pointer
|
||||
}
|
||||
|
||||
.apexcharts-theme-light .apexcharts-menu-item:hover {
|
||||
background: #eee
|
||||
}
|
||||
|
||||
.apexcharts-theme-dark .apexcharts-menu {
|
||||
background: rgba(0,0,0,.7);
|
||||
color: #fff
|
||||
}
|
||||
|
||||
@media screen and (min-width:768px) {
|
||||
.apexcharts-canvas:hover .apexcharts-toolbar {
|
||||
opacity: 1
|
||||
}
|
||||
}
|
||||
|
||||
.apexcharts-canvas .apexcharts-element-hidden,.apexcharts-datalabel.apexcharts-element-hidden,.apexcharts-hide .apexcharts-series-points {
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
.apexcharts-hidden-element-shown {
|
||||
opacity: 1;
|
||||
transition: 0.25s ease all;
|
||||
}
|
||||
.apexcharts-datalabel,.apexcharts-datalabel-label,.apexcharts-datalabel-value,.apexcharts-datalabels,.apexcharts-pie-label {
|
||||
cursor: default;
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.apexcharts-pie-label-delay {
|
||||
opacity: 0;
|
||||
animation-name: opaque;
|
||||
animation-duration: .3s;
|
||||
animation-fill-mode: forwards;
|
||||
animation-timing-function: ease
|
||||
}
|
||||
|
||||
.apexcharts-radialbar-label {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.apexcharts-annotation-rect,.apexcharts-area-series .apexcharts-area,.apexcharts-area-series .apexcharts-series-markers .apexcharts-marker.no-pointer-events,.apexcharts-gridline,.apexcharts-line,.apexcharts-line-series .apexcharts-series-markers .apexcharts-marker.no-pointer-events,.apexcharts-point-annotation-label,.apexcharts-radar-series path,.apexcharts-radar-series polygon,.apexcharts-toolbar svg,.apexcharts-tooltip .apexcharts-marker,.apexcharts-xaxis-annotation-label,.apexcharts-yaxis-annotation-label,.apexcharts-zoom-rect {
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.apexcharts-marker {
|
||||
transition: .15s ease all
|
||||
}
|
||||
|
||||
.resize-triggers {
|
||||
animation: 1ms resizeanim;
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
overflow: hidden
|
||||
}
|
||||
|
||||
.contract-trigger:before,.resize-triggers,.resize-triggers>div {
|
||||
content: " ";
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0
|
||||
}
|
||||
|
||||
.resize-triggers>div {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
background: #eee;
|
||||
overflow: auto
|
||||
}
|
||||
|
||||
.contract-trigger:before {
|
||||
overflow: hidden;
|
||||
width: 200%;
|
||||
height: 200%
|
||||
}
|
||||
|
||||
.apexcharts-bar-goals-markers{
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.apexcharts-bar-shadows{
|
||||
pointer-events: none
|
||||
}
|
||||
|
||||
.apexcharts-rangebar-goals-markers{
|
||||
pointer-events: none
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||
<circle cx="12" cy="12" r="3.2"/>
|
||||
<path d="M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z"/>
|
||||
<path d="M0 0h24v24H0z" fill="none"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 355 B |
@@ -1,4 +0,0 @@
|
||||
<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z"/>
|
||||
<path d="M0 0h24v24H0z" fill="none"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 199 B |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/></svg>
|
||||
|
Before Width: | Height: | Size: 185 B |
@@ -1,9 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24">
|
||||
<defs>
|
||||
<path id="a" d="M0 0h24v24H0z"/>
|
||||
</defs>
|
||||
<clipPath id="b">
|
||||
<use xlink:href="#a" overflow="visible"/>
|
||||
</clipPath>
|
||||
<path clip-path="url(#b)" d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10H7v-2h10v2z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 416 B |
@@ -1,4 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||||
<path d="M0 0h24v24H0z" fill="none"/>
|
||||
<path d="M7 11v2h10v-2H7zm5-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 289 B |
@@ -1,9 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="#000000" height="24" viewBox="0 0 24 24" width="24">
|
||||
<defs>
|
||||
<path d="M0 0h24v24H0z" id="a"/>
|
||||
</defs>
|
||||
<clipPath id="b">
|
||||
<use overflow="visible" xlink:href="#a"/>
|
||||
</clipPath>
|
||||
<path clip-path="url(#b)" d="M23 5.5V20c0 2.2-1.8 4-4 4h-7.3c-1.08 0-2.1-.43-2.85-1.19L1 14.83s1.26-1.23 1.3-1.25c.22-.19.49-.29.79-.29.22 0 .42.06.6.16.04.01 4.31 2.46 4.31 2.46V4c0-.83.67-1.5 1.5-1.5S11 3.17 11 4v7h1V1.5c0-.83.67-1.5 1.5-1.5S15 .67 15 1.5V11h1V2.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5V11h1V5.5c0-.83.67-1.5 1.5-1.5s1.5.67 1.5 1.5z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 656 B |
@@ -1,4 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="#000000" height="24" viewBox="0 0 24 24" width="24">
|
||||
<path d="M10 9h4V6h3l-5-5-5 5h3v3zm-1 1H6V7l-5 5 5 5v-3h3v-4zm14 2l-5-5v3h-3v4h3v3l5-5zm-9 3h-4v3H7l5 5 5-5h-3v-3z"/>
|
||||
<path d="M0 0h24v24H0z" fill="none"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 269 B |
@@ -1,4 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||||
<path d="M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10h-4v4h-2v-4H7v-2h4V7h2v4h4v2z"/>
|
||||
<path d="M0 0h24v24H0z" fill="none"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 263 B |
@@ -1,4 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||||
<path d="M0 0h24v24H0z" fill="none"/>
|
||||
<path d="M13 7h-2v4H7v2h4v4h2v-4h4v-2h-4V7zm-1-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 308 B |