This commit is contained in:
2025-12-08 14:35:28 +07:00
parent ac2717b077
commit 0068d20a12
12 changed files with 58 additions and 438 deletions

View File

@@ -1,51 +0,0 @@
/**
* Created by Glee on 03-Nov-2020.
*/
const Checkbox = function (deleteItemCb) {
const INPUT_CHECKBOX_CLASS = '.js-checkbox-id';
let _deleteItemCb = deleteItemCb;
return {
setAllChecked,
getCheckedIds,
deleteSelected
}
function setAllChecked() {
var all_checkboxes = $(INPUT_CHECKBOX_CLASS);
if ($(this).is(':checked')) {
all_checkboxes.each(function (index, item) {
$(item).prop("checked", true);
})
} else {
all_checkboxes.each(function (index, item) {
$(item).prop("checked", false);
})
}
}
function deleteSelected() {
if (!confirm('Bạn chắc chắn muốn xóa ?')) {
return;
}
$(INPUT_CHECKBOX_CLASS).each(function (index, item) {
if ($(item).is(':checked')) {
//delete_deal(item.value, false);
_deleteItemCb(item.value)
}
});
}
function getCheckedIds() {
let list_ids = [];
$(INPUT_CHECKBOX_CLASS).each(function (index, item) {
if ($(item).is(':checked')) list_ids.push(item.value);
});
return list_ids;
}
};

View File

@@ -1,21 +0,0 @@
const o = /* @__PURE__ */ (() => {
function a(t) {
const s = $("#status_" + t);
s.html('<span class="loading loading-bars loading-sm"></span><span class="ml-[3px]">Processing...</span>'), setTimeout(() => {
s.html("");
}, 1e3);
}
function n(t) {
const s = $("#js-status-hottype-" + t);
s.html('<span class="loading loading-bars loading-sm"></span><span class="ml-[3px]">Processing...</span>'), setTimeout(() => {
s.html("");
}, 1e3);
}
return {
addProductToCategory: a,
markProductAsHot: n
};
})();
export {
o as default
};

View File

@@ -1,8 +1,4 @@
/*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */
@import "https://fonts.googleapis.com/css2?family=DM+Sans:wght@100;200;300;400;500;600;700;800;900;1000&display=swap";
@import "https://fonts.googleapis.com/css2?family=Wix+Madefor+Text:wght@400;500;600;700;800;1000&display=swap";
@import "https://fonts.googleapis.com/css2?family=Inclusive+Sans:wght@400;500;600;700;800;900;1000&display=swap";
@import "https://fonts.googleapis.com/css2?family=AR+One+Sans:wght@400;500;600;700;800;1000&display=swap";
@layer properties;
@layer theme, base, components, utilities;
@layer theme {
@@ -11,6 +7,7 @@
"Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
"Courier New", monospace;
--color-red-200: oklch(88.5% 0.062 18.334);
--color-red-400: oklch(70.4% 0.191 22.216);
--color-red-500: oklch(63.7% 0.237 25.331);
--color-red-600: oklch(57.7% 0.245 27.325);
@@ -45,7 +42,6 @@
--color-purple-500: oklch(62.7% 0.265 303.9);
--color-purple-600: oklch(55.8% 0.288 302.321);
--color-fuchsia-500: oklch(66.7% 0.295 322.15);
--color-gray-50: oklch(98.5% 0.002 247.839);
--color-gray-100: oklch(96.7% 0.003 264.542);
--color-gray-200: oklch(92.8% 0.006 264.531);
--color-gray-400: oklch(70.7% 0.022 261.325);
@@ -3886,9 +3882,6 @@
.w-3 {
width: calc(var(--spacing) * 3);
}
.w-4 {
width: calc(var(--spacing) * 4);
}
.w-6 {
width: calc(var(--spacing) * 6);
}
@@ -5176,6 +5169,16 @@
}
}
}
.select-sm {
@layer daisyui.l1.l2 {
--size: calc(var(--size-field, 0.25rem) * 8);
font-size: 0.75rem;
option {
padding-inline: calc(0.25rem * 2.5);
padding-block: calc(0.25rem * 1);
}
}
}
.table-md {
@layer daisyui.l1.l2 {
:not(thead, tfoot) tr {
@@ -5788,9 +5791,6 @@
.text-error {
color: var(--color-error);
}
.text-gray-50 {
color: var(--color-gray-50);
}
.text-gray-500 {
color: var(--color-gray-500);
}
@@ -5812,6 +5812,9 @@
.text-primary-content {
color: var(--color-primary-content);
}
.text-red-200 {
color: var(--color-red-200);
}
.text-red-500 {
color: var(--color-red-500);
}
@@ -6745,182 +6748,6 @@
}
}
}
@layer properties {
:root {
--font-sans: "Inclusive Sans", sans-serif;
--text-base: 16px;
--color-hura: #0041e8;
--color-header: #002bb5;
--text-base--line-height: 1.5;
--color-black: #000;
--color-white: #fff;
--spacing: 0.25rem;
--layout-topbar-background: #fff;
--menu-active: #e9f2ff;
--menu-text: #177bff;
--menu-sub-bg: #fff;
}
}
@layer base {
html, body {
font-family: var(--font-sans);
font-size: var(--text-base);
line-height: var(--text-base--line-height);
}
*, *::before, *::after {
box-sizing: border-box;
}
}
@layer components {
.bg-menu {
background-color: var(--color-header);
}
.menu {
--menu-active-bg: #e9f2ff;
}
.menu-horizontal {
display: inline-flex;
flex-direction: row;
}
.menu-horizontal li {
position: relative;
}
.menu-horizontal li.active {
background: var(--menu-active);
}
.menu-horizontal li.active .grow, .menu-horizontal li.active svg {
color: var(--menu-text);
}
.menu-horizontal li.active ul li.active {
background: var(--color-hura);
}
.menu-horizontal li.active ul li.active a {
color: #fff;
}
.menu-horizontal li:hover {
background: var(--menu-active);
}
.menu-horizontal li:hover .grow, .menu-horizontal li:hover svg {
color: var(--color-hura);
}
.menu-horizontal li::before {
content: "";
position: absolute;
left: 0;
bottom: -18px;
width: 100%;
height: 30px;
display: none;
}
.menu-horizontal li:hover::before {
display: block;
}
.menu-horizontal li .submenu {
position: absolute !important;
top: 125%;
left: 0;
background: var(--menu-sub-bg);
margin-left: 0 !important;
padding: 0.5rem;
z-index: 999;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
max-height: 500px;
overflow-y: auto;
overflow-x: hidden;
display: none;
}
.menu-horizontal > li:not(.menu-title) > details > ul {
margin-top: 1rem;
padding-inline-end: 0.5rem;
}
.menu-horizontal li:hover .submenu, .menu-horizontal li:hover > details > ul {
display: block;
}
.menu-horizontal > li > details > ul:before {
content: none;
}
.menu-horizontal li ul li:hover {
background: var(--color-hura);
}
.menu-horizontal li ul li:hover a {
color: #fff;
}
.menu-horizontal li ul li:hover::before {
display: none;
}
.menu-horizontal .grow {
font-weight: 500;
}
.tw-qna {
gap: calc(var(--spacing) * 0.5);
}
.tw-zy {
align-items: center;
}
.tw-uba {
display: inline-flex;
}
.tw-usa {
width: calc(var(--spacing) * 5);
height: calc(var(--spacing) * 5);
}
.tw-sla {
width: calc(var(--spacing) * 4.5);
height: calc(var(--spacing) * 4.5);
}
.menu-icon-color {
color: #838383;
}
.card-body {
padding: calc(var(--spacing) * 4);
}
.-mt-25 {
margin-top: calc(var(--spacing) * -25);
}
}
#layout-topbar {
background: var(--layout-topbar-background);
top: calc(var(--spacing) * 0);
z-index: 10;
transition-property: top, margin, border-radius;
transition-timing-function: var( --tw-ease, var(--default-transition-timing-function) );
transition-duration: var(--tw-duration, var(--default-transition-duration));
--tw-duration: 0.3s;
transition-duration: 0.3s;
position: sticky;
border-bottom-style: solid;
border-bottom-width: 1px;
border-color: var(--color-base-300);
}
#layout-content {
padding: calc(var(--spacing) * 6);
transition-property: all;
transition-timing-function: var( --tw-ease, var(--default-transition-timing-function) );
transition-duration: var(--tw-duration, var(--default-transition-duration));
flex-grow: 1;
}
@layer utilities {
.btn-active {
--btn-bg: var(--color-hura);
--btn-fg: #ffffff;
--btn-border: var(--color-hura);
color: var(--color-white);
}
.btn-active:hover {
--btn-bg: #002bb5;
--btn-border: #002bb5;
}
.btn-view {
background: #f5f7ff;
color: var(--color-hura);
border: 1px solid var(--color-hura);
}
.btn-view:hover {
background: var(--color-hura);
color: #fff;
}
}
@layer base {
:where(:root),:root:has(input.theme-controller[value=light]:checked),[data-theme=light] {
color-scheme: light;

View File

@@ -6,9 +6,6 @@
@import "https://fonts.googleapis.com/css2?family=Inclusive+Sans:wght@400;500;600;700;800;900;1000&display=swap";
@import "https://fonts.googleapis.com/css2?family=AR+One+Sans:wght@400;500;600;700;800;1000&display=swap";
@import "tailwindcss";
@plugin "daisyui";
@layer properties {
:root {
--font-sans: "Inclusive Sans", sans-serif;

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
@import "tailwindcss";
@plugin "daisyui";

View File

@@ -1,40 +1,21 @@
"use strict";
const AdminFunction = (() => {
function capNhatTrangThaiMenu(e) {
!1 === e ? $("#js-admin-content-container").addClass("show-large-menu") : $("#js-admin-content-container").removeClass("show-large-menu"), $("#js-menu-big").toggleClass("hidden", e), $("#js-menu-small").toggleClass("hidden", !e), $("#js-form-search").toggleClass("menu-hide", e), localStorage.setItem(e ? "menu_big" : "menu_small", "hidden"), localStorage.removeItem(e ? "menu_small" : "menu_big");
const o = /* @__PURE__ */ (() => {
function a(t) {
const s = $("#status_" + t);
s.html('<span class="loading loading-bars loading-sm"></span><span class="ml-[3px]">Processing...</span>'), setTimeout(() => {
s.html("");
}, 1e3);
}
function e(e) {
let t = null;
return function (...n) {
const o = this, a = function () {
t = null, n.length > 0 && !e && func.apply(o, n);
}, i = e && !t;
clearTimeout(t), t = setTimeout(a, wait), i && func.apply(o, n);
function n(t) {
const s = $("#js-status-hottype-" + t);
s.html('<span class="loading loading-bars loading-sm"></span><span class="ml-[3px]">Processing...</span>'), setTimeout(() => {
s.html("");
}, 1e3);
}
return {
addProductToCategory: a,
markProductAsHot: n
};
}
function t(t) {
$("#status_" + t).html('<span class="loading loading-bars loading-sm"></span><span class="ml-[3px]">Đang xử lý..</span>'), setTimeout(() => {
$("#status_" + t).html("");
}, 1e3);
}
function n(e) {
$(e).keyup((() => {
$("#js-show-search").show();
}));
$("body").click((() => {
$("#js-show-search").hide();
}));
}
function o(e) {
$("#js-status-hottype-" + e).html('<span class="loading loading-bars loading-sm"></span><span class="ml-[3px]">Đang xử lý..</span>'), setTimeout(() => {
$("#js-status-hottype-" + e).html("");
}, 1e3);
}
function i(e) {
$("#overlay").addClass("active"), $(".status-notificatiom").addClass("active"), !0 === e ? $(".status-notificatiom .content").html('<i class="fa fa-check"></i> <b>Cập nhật thành công</b>\n <p>Đơn hàng #000-368 đã được cập nhật thành công</p>') : $(".status-notificatiom .content").html('<i class="fa-solid fa-triangle-exclamation"></i> <b>Lỗi cập nhật</b><p>Có một số vấn đề với hoạt động của bạn.</p>');
}
function r() {
$("#overlay").removeClass("active"), $(".status-notificatiom").removeClass("active");
}
return { capNhatTrangThaiMenu: capNhatTrangThaiMenu, add_product_to_category: t, run_search: n, update_product_hot: o, checkForm: i, closeForm: r };
})();
export {
o as default
};

View File

@@ -4,8 +4,8 @@
"main": "index.js",
"scripts": {
"build:js": "vite build",
"build:css": "tailwindcss -i ./assets/script/hura.global.css -o ./assets/script/hura-lib.css",
"watch:css": "tailwindcss -i ./assets/script/hura.global.css -o ./assets/script/hura-lib.css --watch",
"build:css": "tailwindcss -i ./assets/script/tailwind-daisyui.css -o ./assets/script/hura-lib.css",
"watch:css": "tailwindcss -i ./assets/script/tailwind-daisyui.css -o ./assets/script/hura-lib.css --watch",
"build": "npm run build:js && npm run build:css",
"test": "echo \"Error: no test specified\" && exit 1"
},

View File

@@ -2,7 +2,7 @@
const initCustomerAcquisitionChart = () => {
const chartOptions = {
chart: {
height: 350,
height: 363,
sparkline: {
enabled: false,
},
@@ -59,7 +59,7 @@
const initRevenueStatisticsChart = () => {
const chartOptions = {
chart: {
height: 292,
height: 295,
type: "bar",
stacked: true,
background: "transparent",

View File

@@ -18,7 +18,7 @@
Tổng số mặc cả giá nhận được: <b> 1.458 </b>
</p>
<div class="mt-5 overflow-x-auto whitespace-nowrap border border-base-200 rounded-[4px]">
<div class="mt-5 overflow-x-auto whitespace-nowrap border border-base-200 rounded-sm">
<table class="table table-pin-rows table-pin-cols">
<thead>
<tr class="bg-base-200 text-black">

View File

@@ -42,15 +42,15 @@
</div>
<div class="btn-right flex items-center mb-3 gap-3">
<a href="/admin/product/form" class="btn btn-sm btn-outline btn-view">
<i class="iconify lucide--plus"></i>
<i data-lucide="plus" class="size-4"></i>
<span>Thêm sản phẩm mới</span>
</a>
<a href="" class="btn btn-outline btn-sm btn-view">
<i class="iconify lucide--file-pdf"></i>
<i data-lucide="file-text" class="size-4"></i>
<span class="ml-1">Danh sách cập nhật</span>
</a>
<a href="" class="btn btn-outline btn-sm btn-view">
<i class="iconify lucide--file-x"></i>
<i data-lucide="file-x" class="size-4"></i>
<span class="ml-1">Cập nhật Excel</span>
</a>
</div>
@@ -58,13 +58,13 @@
<div class="overflow-x-auto mt-5 border border-base-200 rounded-sm">
<table class="table">
<thead>
<tr class="bg-base-200 text-black">
<tr class="bg-base-300 text-black font-bold">
<th>STT</th>
<th>Ảnh</th>
<th>Sản phẩm (Tổng số: {{page.total}})</th>
<th>Thông tin bán hàng</th>
<th>
<select id="" class="select" onchange="location.href=this.value">
<select id="" class="select select-sm" onchange="location.href=this.value">
<option value="/admin/product?">Lọc sản phẩm</option>
<option value="/admin/product?hotType=new">Mới</option>
<option value="/admin/product?hotType=hot">HOT (hỏi nhiều)</option>
@@ -80,7 +80,7 @@
{% assign counter = 0 %}
{% for item in page.item_list %}
{% increment counter %}
<tr>
<tr class="hover:bg-base-300">
<td>{{ counter }}</td>
<td>
<img class="block mx-auto my-0 w-[70px] h-[50px]" src="{{item.image.thumb}}" alt="">
@@ -99,7 +99,7 @@
<div class="flex items-center my-1 gap-2">
<span>Mã kho</span>
<b class="px-2">{{item.sku}}</b>
<span class="text-black font-[500]">|</span>
<span class="text-black font-500">|</span>
<span class="px-2">Hãng</span>
<p class="link-primary">{{item.model}}</p>
</div>
@@ -143,7 +143,7 @@
<label class="cursor-pointer flex items-center mb-2 gap-2"
onclick="AdminFunction.update_product_hot('{{item.id}}')">
<input type="checkbox" name="new" {% if item.hot_type=="new" %}checked="checked" {% endif %}
class="checkbox checkbox-success checkbox-sm" />
class="checkbox checkbox-active checkbox-sm" />
<span class="label-text whitespace-nowrap">Mới Hot (Hỏi nhiều)</span>
</label>
@@ -151,14 +151,14 @@
<label class="cursor-pointer flex items-center mb-2 gap-2"
onclick="AdminFunction.update_product_hot('{{item.id}}')">
<input type="checkbox" name="hot" {% if item.hot_type=="hot" %}checked="checked" {% endif %}
class="checkbox checkbox-success checkbox-sm" />
class="checkbox checkbox-active checkbox-sm" />
<span class="label-text whitespace-nowrap">Hot (Hỏi nhiều)</span>
</label>
<label class="cursor-pointer flex items-center mb-2 gap-2"
onclick="AdminFunction.update_product_hot('{{item.id}}')">
<input type="checkbox" name="bestsale" {% if item.hot_type=="bestsale" %}checked="checked"
{% endif %} class="checkbox checkbox-success checkbox-sm" />
{% endif %} class="checkbox checkbox-active checkbox-sm" />
<span class="label-text whitespace-nowrap">Bán
chạy</span>
</label>
@@ -166,7 +166,7 @@
<label class="cursor-pointer flex items-center mb-2 gap-2"
onclick="AdminFunction.update_product_hot('{{item.id}}')">
<input type="checkbox" name="saleoff" {% if item.hot_type=="saleoff" %}checked="checked" {%
endif %} class="checkbox checkbox-success checkbox-sm" />
endif %} class="checkbox checkbox-active checkbox-sm" />
<span class="label-text whitespace-nowrap">Xả
hàng (sale-off)</span>
</label>
@@ -174,7 +174,7 @@
<label class="cursor-pointer flex items-center mb-2 gap-2"
onclick="AdminFunction.update_product_hot('{{item.id}}')">
<input type="checkbox" name="online-only" {% if item.hot_type=="online-only"
%}checked="checked" {% endif %} class="checkbox checkbox-success checkbox-sm" />
%}checked="checked" {% endif %} class="checkbox checkbox-active checkbox-sm" />
<span class="label-text whitespace-nowrap">Chỉ bán online</span>
</label>
@@ -210,7 +210,6 @@
</tbody>
</table>
</div>
<div class="join mt-5 justify-center flex items-center">
{% for paging in page.pagination.collection %}
{% if paging.name == 'next' %}
@@ -229,12 +228,8 @@
{% endif %}
{% endfor %}
</div>
</div>
<dialog id="js_list_category" class="modal">
<div class="modal-box w-11/12 max-w-5xl">
<form method="dialog">

View File

@@ -7,9 +7,13 @@
<title> Admin Hura Pc </title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- lib hura css -->
<!-- library tailwindcss + daisyui css -->
<link rel="stylesheet" href="{{ 'hura-lib.css' | asset_url }}" />
<!-- hura global css -->
<link rel="stylesheet" href="{{ 'hura.global.css' | asset_url }}" />
<!-- page-specific CSS -->
{% include module_css/index %}