From fb8ebb92202e59b902d3976e75ddae7ad2e60cb8 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期三, 26 八月 2026 09:03:40 +0800
Subject: [PATCH] feat(erp): 销售订单列表支持打印/导出详情单据,供企业盖章留存

---
 src/api/erp/sale/order/index.ts            |    5 
 src/views/erp/sale/order/index.vue         |   17 +
 src/views/erp/sale/order/modules/print.vue |  459 +++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 480 insertions(+), 1 deletions(-)

diff --git a/src/api/erp/sale/order/index.ts b/src/api/erp/sale/order/index.ts
index 5468cab..1e6366c 100644
--- a/src/api/erp/sale/order/index.ts
+++ b/src/api/erp/sale/order/index.ts
@@ -10,6 +10,7 @@
     customerId: number; // 瀹㈡埛缂栧彿
     customerName?: string; // 瀹㈡埛鍚嶇О
     accountId?: number; // 鏀舵璐︽埛缂栧彿
+    saleUserId?: number; // 閿�鍞汉鍛樼紪鍙�
     orderTime: Date; // 璁㈠崟鏃堕棿
     totalCount: number; // 鍚堣鏁伴噺
     totalPrice: number; // 鍚堣閲戦锛屽崟浣嶏細鍏�
@@ -31,6 +32,9 @@
     productionFinishTime?: Date; // 鐢熶骇瀹屾垚鏃堕棿
     hasSalesNotice?: boolean; // 鏄惁宸茬敓鎴愬彂璐ч�氱煡鍗�
     canCreateSalesNotice?: boolean; // 鏄惁鍙互鐢熸垚鍙戣揣閫氱煡鍗�
+    creator?: string; // 鍒涘缓浜虹紪鍙凤紙瀛楃涓诧級
+    creatorName?: string; // 鍒涘缓浜哄悕绉�
+    createTime?: Date; // 鍒涘缓鏃堕棿
     items?: SaleOrderItem[]; // 閿�鍞鍗曚骇鍝佹槑缁嗗垪琛�
   }
 
@@ -53,6 +57,7 @@
     totalTaxPrice?: number; // 鍚◣鎬讳环锛屽崟浣嶏細鍏�
     remark?: string; // 澶囨敞
     stockCount?: number; // 搴撳瓨鏁伴噺锛堟樉绀哄瓧娈碉級
+    productSpecification?: string; // 瑙勬牸鍨嬪彿锛堟樉绀哄瓧娈碉級
     needProduction?: number; // 鏄惁闇�瑕佺敓浜э細0-涓嶉渶瑕侊紝1-闇�瑕�
     mpsId?: number; // MPS缂栧彿
     batchCode?: string; // 鎵规鍙�
diff --git a/src/views/erp/sale/order/index.vue b/src/views/erp/sale/order/index.vue
index 7071c8e..6124ec7 100644
--- a/src/views/erp/sale/order/index.vue
+++ b/src/views/erp/sale/order/index.vue
@@ -24,6 +24,7 @@
 
 import { useGridColumns, useGridFormSchema } from './data';
 import Form from './modules/form.vue';
+import SaleOrderPrint from './modules/print.vue';
 import SalesNoticeForm from '#/views/wls/salesnotice/modules/form.vue';
 
 /** ERP 閿�鍞鍗曞垪琛� */
@@ -140,6 +141,12 @@
   formModalApi.setData({ formType: 'detail', id: row.id }).open();
 }
 
+/** 鎵撳嵃/瀵煎嚭閿�鍞鍗曡鎯咃紝渚涗紒涓氱洊绔犵暀瀛� */
+const printRef = ref<InstanceType<typeof SaleOrderPrint>>();
+function handlePrint(row: ErpSaleOrderApi.SaleOrder) {
+  printRef.value?.print(row.id!);
+}
+
 /** 鏌ョ湅鍏宠仈鍚堝悓 */
 function handleViewContract(row: ErpSaleOrderApi.SaleOrder) {
   if (row.contractId) {
@@ -220,6 +227,7 @@
   <Page auto-content-height>
     <FormModal @success="handleRefresh" />
     <SalesNoticeFormModal />
+    <SaleOrderPrint ref="printRef" />
     <Grid table-title="閿�鍞鍗曞垪琛�">
       <template #toolbar-tools>
         <TableAction
@@ -304,6 +312,13 @@
               onClick: handleDetail.bind(null, row),
             },
             {
+              label: '鎵撳嵃',
+              type: 'link',
+              icon: 'lucide:printer',
+              auth: ['erp:sale-order:query'],
+              onClick: handlePrint.bind(null, row),
+            },
+            {
               label: $t('common.edit'),
               type: 'link',
               icon: ACTION_ICON.EDIT,
@@ -360,7 +375,7 @@
               type: 'link',
               icon: 'ant-design:file-protect-outlined',
               auth: ['mes:wm-sales-notice:create'],
-              ifShow: () => row.status === 20 && row.canCreateSalesNotice,
+              ifShow: () => row.status === 20 && !!row.canCreateSalesNotice,
               onClick: handleGenerateNotice.bind(null, row),
             },
             {
diff --git a/src/views/erp/sale/order/modules/print.vue b/src/views/erp/sale/order/modules/print.vue
new file mode 100644
index 0000000..12e3cc5
--- /dev/null
+++ b/src/views/erp/sale/order/modules/print.vue
@@ -0,0 +1,459 @@
+<script lang="ts" setup>
+import type { ErpSaleOrderApi } from '#/api/erp/sale/order';
+
+import { computed, nextTick, ref } from 'vue';
+
+import { Barcode, BarcodeFormatEnum } from '@vben/common-ui';
+import { DICT_TYPE } from '@vben/constants';
+import { getDictLabel } from '@vben/hooks';
+import { useUserStore } from '@vben/stores';
+import { erpPriceMultiply, formatDateTime } from '@vben/utils';
+
+import { getCustomerSimpleList } from '#/api/crm/customer';
+import { getAccountSimpleList } from '#/api/erp/finance/account';
+import { getSaleOrder } from '#/api/erp/sale/order';
+import { getSimpleUserList } from '#/api/system/user';
+
+/**
+ * 閿�鍞鍗曟墦鍗扮粍浠�
+ *
+ * 鐢ㄤ簬瀵煎嚭/鎵撳嵃閿�鍞鍗曡缁嗕俊鎭紝渚涗紒涓氱洊绔犵暀瀛樸��
+ * 鎵撳嵃鏍峰紡鍙傝�� WMS 鍑哄簱鍗曟墦鍗帮紙wms/order/shipment/modules/print.vue锛夈��
+ */
+defineOptions({ name: 'ErpSaleOrderPrint' });
+
+const userStore = useUserStore();
+
+const printData = ref<Partial<ErpSaleOrderApi.SaleOrder>>({});
+/** 閿�鍞汉鍛樻樀绉版槧灏� */
+const saleUserMap = ref<Map<number, string>>(new Map());
+/** 缁撶畻璐︽埛鍚嶇О鏄犲皠 */
+const accountMap = ref<Map<number, string>>(new Map());
+/** 瀹㈡埛鍚嶇О鏄犲皠锛堣鎯呮帴鍙d笉杩斿洖瀹㈡埛鍚嶇О锛岄渶鎸夊鎴风紪鍙疯В鏋愶級 */
+const customerMap = ref<Map<number, string>>(new Map());
+/** 鎵撳嵃鏃堕棿 */
+const printTime = ref('');
+
+/** 璁㈠崟鐘舵�佹枃妗堬紙status 涓虹┖鏃朵笉璋冪敤 getDictLabel锛岄伩鍏嶅唴閮ㄥ undefined 鎵ц toString 鎶ラ敊锛� */
+const statusText = computed(() => {
+  if (printData.value.status == null) {
+    return '-';
+  }
+  const label = getDictLabel(DICT_TYPE.ERP_AUDIT_STATUS, printData.value.status);
+  return label || '-';
+});
+
+/** 鍑哄簱鐘舵�佹枃妗� */
+const outStatusText = computed(() => {
+  switch (printData.value.outStatus) {
+    case 0:
+      return '鏈嚭搴�';
+    case 1:
+      return '宸查鐣�';
+    case 2:
+      return '閮ㄥ垎鍑哄簱';
+    case 3:
+      return '鍏ㄩ儴鍑哄簱';
+    default:
+      return '-';
+  }
+});
+
+/** 鐢熶骇鐘舵�佹枃妗� */
+const productionStatusText = computed(() => {
+  if (printData.value.needProduction !== 1) {
+    return '鏃犻渶鐢熶骇';
+  }
+  return printData.value.productionStatus === 1 ? '宸插畬鎴�' : '鏈畬鎴�';
+});
+
+/** 閿�鍞汉鍛樺悕绉� */
+const saleUserName = computed(
+  () => saleUserMap.value.get(printData.value.saleUserId!) || '-',
+);
+
+/** 缁撶畻璐︽埛鍚嶇О */
+const accountName = computed(
+  () => accountMap.value.get(printData.value.accountId!) || '-',
+);
+
+/** 瀹㈡埛鍚嶇О锛氫紭鍏堝彇璇︽儏杩斿洖鐨勫鎴峰悕绉帮紝鍚﹀垯鎸夊鎴风紪鍙疯В鏋� */
+const customerName = computed(
+  () =>
+    printData.value.customerName ||
+    customerMap.value.get(printData.value.customerId!) ||
+    '-',
+);
+
+/** 鍒涘缓浜哄悕绉帮細璇︽儏鎺ュ彛涓嶈繑鍥炲垱寤轰汉鍚嶇О锛屾寜鍒涘缓浜虹紪鍙疯В鏋� */
+const creatorName = computed(
+  () =>
+    printData.value.creatorName ||
+    saleUserMap.value.get(Number(printData.value.creator)) ||
+    '-',
+);
+
+/** 鍗曚环 脳 鏁伴噺锛堜换涓�涓虹┖杩斿洖 undefined锛� */
+function multiplyPrice(price?: number, count?: number) {
+  return price == null || count == null ? undefined : erpPriceMultiply(price, count);
+}
+
+/**
+ * 鏄庣粏琛岋紙鍚庣涓嶈繑鍥炴槑缁嗚鐨� totalProductPrice/totalPrice锛岄渶鎸夊崟浠访楁暟閲忚绠楋細
+ * 閲戦 = 鍗曚环 脳 鏁伴噺锛涚◣棰� = 閲戦 脳 绋庣巼锛涘惈绋庨噾棰� = 閲戦 + 绋庨锛�
+ */
+const printRows = computed(() =>
+  (printData.value.items || []).map((item) => {
+    const totalProductPrice =
+      item.totalProductPrice ?? multiplyPrice(item.productPrice, item.count) ?? 0;
+    const taxPrice =
+      item.taxPrice ?? multiplyPrice(totalProductPrice, (item.taxPercent ?? 0) / 100) ?? 0;
+    const totalPrice = item.totalPrice ?? totalProductPrice + taxPrice;
+    return { ...item, totalProductPrice, taxPrice, totalPrice };
+  }),
+);
+
+/** 鏄庣粏鍚堣锛氭暟閲�/閲戦浼樺厛鍙栬鍗曞ご锛堝悗绔潈濞佸�硷級锛岀◣棰濅笌鍚◣閲戦鎸夋槑缁嗙疮鍔狅紙璁㈠崟澶� totalPrice 涓轰紭鎯犲悗閲戦锛屽彟鍦ㄩ噾棰濅俊鎭尯灞曠ず锛� */
+const summaries = computed(() => {
+  const rows = printRows.value;
+  const count = rows.reduce((sum, item) => sum + (item.count || 0), 0);
+  const totalProductPrice = rows.reduce(
+    (sum, item) => sum + (item.totalProductPrice || 0),
+    0,
+  );
+  const taxPrice = rows.reduce((sum, item) => sum + (item.taxPrice || 0), 0);
+  const totalPrice = rows.reduce((sum, item) => sum + (item.totalPrice || 0), 0);
+  return {
+    count: printData.value.totalCount ?? count,
+    totalProductPrice: printData.value.totalProductPrice ?? totalProductPrice,
+    taxPrice,
+    totalPrice,
+  };
+});
+
+/** 淇濈暀涓や綅灏忔暟锛堥噾棰濆睍绀猴級 */
+function formatPrice(value?: number | null) {
+  return value === undefined || value === null || Number.isNaN(Number(value))
+    ? '-'
+    : Number(value).toFixed(2);
+}
+
+/** 淇濈暀涓変綅灏忔暟锛堟暟閲忓睍绀猴級 */
+function formatCount(value?: number | null) {
+  return value === undefined || value === null || Number.isNaN(Number(value))
+    ? '-'
+    : Number(value).toFixed(3);
+}
+
+/** 绛夊緟鏉$爜鍜屾墦鍗� DOM 瀹屾垚缁樺埗锛岄伩鍏嶆祻瑙堝櫒鎵撳嵃鍒版棫鍐呭 */
+function waitForPaint() {
+  return new Promise<void>((resolve) => {
+    requestAnimationFrame(() => {
+      requestAnimationFrame(() => resolve());
+    });
+  });
+}
+
+/** 閫�鍑烘墦鍗版ā寮忥紝鎭㈠褰撳墠椤甸潰鏄剧ず */
+function removePrintMode() {
+  document.body.classList.remove('erp-sale-order-printing');
+}
+
+/** 鎵撳嵃閿�鍞鍗曪細鍔犺浇鏁版嵁鍚庡彧灞曠ず鎵撳嵃鍖哄煙锛屽啀璋冪敤娴忚鍣ㄦ墦鍗� */
+async function print(id: number) {
+  const [order, userList, accountList, customerList] = await Promise.all([
+    getSaleOrder(id),
+    getSimpleUserList(),
+    getAccountSimpleList(),
+    getCustomerSimpleList(),
+  ]);
+  printData.value = order;
+  saleUserMap.value = new Map(
+    userList.map((item) => [Number(item.id), item.nickname || item.username]),
+  );
+  accountMap.value = new Map(
+    accountList.map((item) => [Number(item.id), item.name]),
+  );
+  customerMap.value = new Map(
+    customerList.map((item) => [Number(item.id), item.name]),
+  );
+  printTime.value = formatDateTime(new Date());
+  await nextTick();
+  await waitForPaint();
+  document.body.classList.add('erp-sale-order-printing');
+  window.addEventListener('afterprint', removePrintMode, { once: true });
+  window.print();
+}
+
+defineExpose({ print });
+</script>
+
+<template>
+  <Teleport to="body">
+    <div
+      id="erpSaleOrderPrint"
+      class="erp-sale-order-print pointer-events-none fixed left-0 top-0 z-[-1] w-full bg-white text-[#303133] opacity-0"
+    >
+      <div class="relative mb-2">
+        <h2 class="m-0 text-center text-[1.6em] font-bold leading-[1.2]">
+          閿�鍞鍗�
+        </h2>
+        <div v-if="printData.no" class="absolute right-0 top-0">
+          <Barcode
+            :content="printData.no"
+            :display-value="false"
+            :format="BarcodeFormatEnum.CODE39"
+            :height="40"
+            :width="180"
+          />
+        </div>
+      </div>
+
+      <!-- 鍩烘湰淇℃伅 -->
+      <div
+        class="mb-3 grid grid-cols-3 gap-x-6 gap-y-2 border border-solid border-[#dcdfe6] p-3 text-sm leading-[1.6]"
+      >
+        <div>璁㈠崟鍗曞彿锛歿{ printData.no || '-' }}</div>
+        <div>
+          璁㈠崟鏃堕棿锛歿{
+            formatDateTime(printData.orderTime) || '-'
+          }}
+        </div>
+        <div>瀹㈡埛锛歿{ customerName }}</div>
+        <div>閿�鍞汉鍛橈細{{ saleUserName }}</div>
+        <div>鍏宠仈鍚堝悓锛歿{ printData.contractNo || '-' }}</div>
+        <div>缁撶畻璐︽埛锛歿{ accountName }}</div>
+        <div>璁㈠崟鐘舵�侊細{{ statusText }}</div>
+        <div>鍑哄簱鐘舵�侊細{{ outStatusText }}</div>
+        <div>鐢熶骇鐘舵�侊細{{ productionStatusText }}</div>
+        <div>鍒涘缓浜猴細{{ creatorName }}</div>
+        <div>
+          鍒涘缓鏃堕棿锛歿{
+            formatDateTime(printData.createTime) || '-'
+          }}
+        </div>
+        <div class="col-span-3">澶囨敞锛歿{ printData.remark || '-' }}</div>
+      </div>
+
+      <!-- 浜у搧鏄庣粏 -->
+      <table class="w-full border-collapse text-[13px] leading-[1.5]">
+        <thead>
+          <tr>
+            <th
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2 text-center font-bold"
+            >
+              搴忓彿
+            </th>
+            <th
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2 text-left font-bold"
+            >
+              浜у搧鍚嶇О鍙婅鏍�
+            </th>
+            <th
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2 text-center font-bold"
+            >
+              鍗曚綅
+            </th>
+            <th
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2 text-right font-bold"
+            >
+              鏁伴噺
+            </th>
+            <th
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2 text-right font-bold"
+            >
+              浜у搧鍗曚环(鍏�)
+            </th>
+            <th
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2 text-right font-bold"
+            >
+              閲戦(鍏�)
+            </th>
+            <th
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2 text-right font-bold"
+            >
+              绋庣巼(%)
+            </th>
+            <th
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2 text-right font-bold"
+            >
+              绋庨(鍏�)
+            </th>
+            <th
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2 text-right font-bold"
+            >
+              鍚◣閲戦(鍏�)
+            </th>
+            <th
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2 text-left font-bold"
+            >
+              澶囨敞
+            </th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr v-for="(item, index) in printRows" :key="item.id || index">
+            <td class="border border-solid border-[#dcdfe6] p-2 text-center">
+              {{ index + 1 }}
+            </td>
+            <td class="border border-solid border-[#dcdfe6] p-2">
+              <div>{{ item.productName || '-' }}</div>
+              <div v-if="item.productSpecification" class="text-xs">
+                {{ item.productSpecification }}
+              </div>
+            </td>
+            <td class="border border-solid border-[#dcdfe6] p-2 text-center">
+              {{ item.productUnitName || '-' }}
+            </td>
+            <td class="border border-solid border-[#dcdfe6] p-2 text-right">
+              {{ formatCount(item.count) }}
+            </td>
+            <td class="border border-solid border-[#dcdfe6] p-2 text-right">
+              {{ formatPrice(item.productPrice) }}
+            </td>
+            <td class="border border-solid border-[#dcdfe6] p-2 text-right">
+              {{ formatPrice(item.totalProductPrice) }}
+            </td>
+            <td class="border border-solid border-[#dcdfe6] p-2 text-right">
+              {{ formatPrice(item.taxPercent) }}
+            </td>
+            <td class="border border-solid border-[#dcdfe6] p-2 text-right">
+              {{ formatPrice(item.taxPrice) }}
+            </td>
+            <td class="border border-solid border-[#dcdfe6] p-2 text-right">
+              {{ formatPrice(item.totalPrice) }}
+            </td>
+            <td class="border border-solid border-[#dcdfe6] p-2">
+              {{ item.remark || '-' }}
+            </td>
+          </tr>
+          <tr v-if="printData.items && printData.items.length > 0">
+            <td
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2 text-center"
+            >
+              鍚堣
+            </td>
+            <td
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2"
+            ></td>
+            <td
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2"
+            ></td>
+            <td
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2 text-right"
+            >
+              {{ formatCount(summaries.count) }}
+            </td>
+            <td
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2"
+            ></td>
+            <td
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2 text-right"
+            >
+              {{ formatPrice(summaries.totalProductPrice) }}
+            </td>
+            <td
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2"
+            ></td>
+            <td
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2 text-right"
+            >
+              {{ formatPrice(summaries.taxPrice) }}
+            </td>
+            <td
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2 text-right"
+            >
+              {{ formatPrice(summaries.totalPrice) }}
+            </td>
+            <td
+              class="border border-solid border-[#dcdfe6] bg-[#f5f7fa] p-2"
+            ></td>
+          </tr>
+          <tr v-if="printRows.length === 0">
+            <td
+              class="border border-solid border-[#dcdfe6] p-2 text-center"
+              colspan="10"
+            >
+              鏆傛棤鏄庣粏
+            </td>
+          </tr>
+        </tbody>
+      </table>
+
+      <!-- 閲戦淇℃伅 -->
+      <div
+        class="mt-3 grid grid-cols-4 gap-x-6 gap-y-2 border border-solid border-[#dcdfe6] p-3 text-sm leading-[1.6]"
+      >
+        <div>浼樻儬鐜�(%)锛歿{ formatPrice(printData.discountPercent) }}</div>
+        <div>浠樻浼樻儬(鍏�)锛歿{ formatPrice(printData.discountPrice) }}</div>
+        <div>浼樻儬鍚庨噾棰�(鍏�)锛歿{ formatPrice(printData.totalPrice) }}</div>
+        <div>鏀跺彇璁㈤噾(鍏�)锛歿{ formatPrice(printData.depositPrice) }}</div>
+      </div>
+
+      <!-- 鐩栫珷鏍� -->
+      <div
+        class="mt-6 grid grid-cols-2 gap-x-10 gap-y-4 border border-dashed border-[#dcdfe6] p-4 text-sm leading-[1.8]"
+      >
+        <div>
+          瀹㈡埛鐩栫珷/绛惧瓧锛�<span class="inline-block w-36 border-b border-solid border-[#303133]"></span>
+        </div>
+        <div>
+          鍏徃鐩栫珷/绛惧瓧锛�<span class="inline-block w-36 border-b border-solid border-[#303133]"></span>
+        </div>
+        <div>
+          鏃ユ湡锛�<span class="inline-block w-36 border-b border-solid border-[#303133]"></span>
+        </div>
+        <div>
+          鏃ユ湡锛�<span class="inline-block w-36 border-b border-solid border-[#303133]"></span>
+        </div>
+      </div>
+
+      <!-- 鎵撳嵃淇℃伅 -->
+      <div
+        class="mt-4 flex justify-between text-xs text-[#909399]"
+      >
+        <div>
+          鎵撳嵃浜哄憳锛歿{ userStore.userInfo?.nickname || '-' }}
+        </div>
+        <div>鎵撳嵃鏃堕棿锛歿{ printTime || '-' }}</div>
+      </div>
+    </div>
+  </Teleport>
+</template>
+
+<style scoped>
+@page {
+  margin: 8mm 10mm;
+}
+
+@media print {
+  :global(body.erp-sale-order-printing) {
+    padding: 0 !important;
+    margin: 0 !important;
+    -webkit-print-color-adjust: exact;
+    print-color-adjust: exact;
+  }
+
+  :global(body.erp-sale-order-printing *) {
+    visibility: hidden !important;
+  }
+
+  :global(body.erp-sale-order-printing .erp-sale-order-print),
+  :global(body.erp-sale-order-printing .erp-sale-order-print *) {
+    visibility: visible !important;
+  }
+
+  :global(body.erp-sale-order-printing .erp-sale-order-print) {
+    position: absolute;
+    top: 0;
+    left: 0;
+    z-index: auto;
+    box-sizing: border-box;
+    width: 100%;
+    padding: 0 !important;
+    margin: 0 !important;
+    pointer-events: auto;
+    opacity: 1;
+  }
+}
+</style>

--
Gitblit v1.9.3