Compare commits
39 Commits
11a8c3e932
...
0.2
| Author | SHA1 | Date | |
|---|---|---|---|
| a1751e4b99 | |||
| 07e29c32aa | |||
| 3c5617b403 | |||
| 50c2203ebf | |||
| 3273072fb3 | |||
| d9e651fe72 | |||
| 08b339e0cd | |||
| a81967ddbd | |||
| 1afb90f3ba | |||
| 21a3ec6198 | |||
| c5fc2469d7 | |||
| 8fe243356e | |||
| 83a7c67439 | |||
| 36174834a8 | |||
| f087e4aa61 | |||
| 7998312785 | |||
| 37d0b928ec | |||
| 5f8da12363 | |||
| f16b3e3678 | |||
| ad1c99c3e9 | |||
| 7722cc16ff | |||
| 35ca33315d | |||
| 8154473d1a | |||
| c235a138ee | |||
| 1b79aa9d14 | |||
| 095b310109 | |||
| f92fa65133 | |||
| d81b99fd7d | |||
| f900649724 | |||
| 0bb9da198b | |||
| 5baac4fdb7 | |||
| b66976b7c4 | |||
| bfd07ebe90 | |||
| 50b24a7282 | |||
| 27f936d4a9 | |||
| 63ca92e470 | |||
| bbd761508e | |||
| 88e50525bd | |||
| e44bc74b90 |
+4223
File diff suppressed because it is too large
Load Diff
+8045
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,351 @@
|
||||
using DocumentFormat.OpenXml.Office2010.Excel;
|
||||
using DocumentFormat.OpenXml.Wordprocessing;
|
||||
using MINOM.COM.Utility;
|
||||
using Model;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.SqlClient;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Web;
|
||||
using System.Web.Http.ModelBinding;
|
||||
|
||||
/// <summary>
|
||||
/// StyleDataAccess 的摘要描述
|
||||
/// </summary>
|
||||
public class StyleDataAccess
|
||||
{
|
||||
LogUtility log=new LogUtility();
|
||||
object[] obj = new object[] { "Y", "" ,null};
|
||||
public StyleDataAccess()
|
||||
{
|
||||
//
|
||||
// TODO: 在這裡新增建構函式邏輯
|
||||
//
|
||||
}
|
||||
|
||||
public object[] AddTabletPaper(TabletPaperSize tps)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var context = new ezEntities())
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var sp = new List<SqlParameter>();
|
||||
sb.Append("insert into TabletPaperSize (PaperID,PaperName,Width,Height,CUser,CDate,CTime,UUser,UDate,UTime ) ");
|
||||
sb.Append("values (@PaperID,@PaperName,@Width,@Height,@CUser,@CDate,@CTime,@UUser,@UDate,@UTime )");
|
||||
sp.Add(new SqlParameter("@PaperID",tps.PaperID));
|
||||
sp.Add(new SqlParameter("@PaperName", tps.PaperName));
|
||||
sp.Add(new SqlParameter("@Width", tps.Width));
|
||||
sp.Add(new SqlParameter("@Height", tps.Height));
|
||||
sp.Add(new SqlParameter("@CUser", tps.CUser));
|
||||
sp.Add(new SqlParameter("@CDate", tps.CDate));
|
||||
sp.Add(new SqlParameter("@CTime", tps.CTime));
|
||||
sp.Add(new SqlParameter("@UUser", tps.UUser));
|
||||
sp.Add(new SqlParameter("@UDate", tps.UDate));
|
||||
sp.Add(new SqlParameter("@UTime", tps.UTime));
|
||||
context.Database.ExecuteSqlCommand(sb.ToString(),sp.ToArray());
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.writeErrorPath("AddTabletPaper:" + ex.Message + ex.StackTrace);
|
||||
obj[0] = "N";
|
||||
obj[1] = ex.Message;
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
public object[] GetTabletPaper(string paperID, string name)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var context = new ezEntities())
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var sp = new List<SqlParameter>();
|
||||
|
||||
sb.Append("select * from TabletPaperSize where 1=1 ");
|
||||
if (!string.IsNullOrEmpty(paperID))
|
||||
{
|
||||
sb.Append("and PaperID=@PaperID ");
|
||||
sp.Add(new SqlParameter("@PaperID", paperID));
|
||||
}
|
||||
if (!string.IsNullOrEmpty(name))
|
||||
{
|
||||
sb.Append("and Name=@Name ");
|
||||
sp.Add(new SqlParameter("@Name", name));
|
||||
}
|
||||
var data = context.Database.SqlQuery<TabletPaperSize>(sb.ToString(), sp.ToArray()).ToList();
|
||||
obj[2] = data;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.writeErrorPath("GetTabletElement:" + ex.Message + ex.StackTrace);
|
||||
obj[0] = "N";
|
||||
obj[1] = ex.Message;
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
|
||||
public object[] GetTabletElement(string elementID ,string name)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var context = new ezEntities())
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var sp = new List<SqlParameter>();
|
||||
|
||||
sb.Append("select * from TabletElement where 1=1 ");
|
||||
if (!string.IsNullOrEmpty(elementID))
|
||||
{
|
||||
sb.Append("and ElementID=@ElementID ");
|
||||
sp.Add(new SqlParameter("@ElementID", elementID));
|
||||
}
|
||||
if (!string.IsNullOrEmpty(name))
|
||||
{
|
||||
sb.Append("and Name=@Name ");
|
||||
sp.Add(new SqlParameter("@Name", name));
|
||||
}
|
||||
var data = context.Database.SqlQuery<TabletElement>(sb.ToString(), sp.ToArray()).ToList();
|
||||
obj[2] = data;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.writeErrorPath("GetTabletElement:" + ex.Message + ex.StackTrace);
|
||||
obj[0] = "N";
|
||||
obj[1] = ex.Message;
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
public object[] GetStyleDetail(string styleID,string elementID)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var context = new ezEntities())
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var sp = new List<SqlParameter>();
|
||||
|
||||
sb.Append("select * from TabletStyleDetail where 1=1 ");
|
||||
if (!string.IsNullOrEmpty(styleID))
|
||||
{
|
||||
sb.Append("and StyleID=@StyleID ");
|
||||
sp.Add(new SqlParameter("@StyleID", styleID));
|
||||
}
|
||||
if (!string.IsNullOrEmpty(elementID))
|
||||
{
|
||||
sb.Append("and ElementID=@ElementID ");
|
||||
sp.Add(new SqlParameter("@ElementID", elementID));
|
||||
}
|
||||
var data = context.Database.SqlQuery<TabletStyleDetail>(sb.ToString(), sp.ToArray()).ToList();
|
||||
obj[2] = data;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.writeErrorPath("GetStyleDetail:" + ex.Message + ex.StackTrace);
|
||||
obj[0] = "N";
|
||||
obj[1] = ex.Message;
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
public object[] GetStyle(string id,string name)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var context = new ezEntities())
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var sp = new List<SqlParameter>();
|
||||
|
||||
sb.Append("select * from TabletStyle where 1=1 ");
|
||||
if (!string.IsNullOrEmpty(id))
|
||||
{
|
||||
sb.Append("and StyleID=@StyleID ");
|
||||
sp.Add(new SqlParameter( "@StyleID",id));
|
||||
}
|
||||
if (!string.IsNullOrEmpty(name))
|
||||
{
|
||||
sb.Append("and Name=@Name ");
|
||||
sp.Add(new SqlParameter("@Name", name));
|
||||
}
|
||||
var data= context.Database.SqlQuery<TabletStyle>(sb.ToString(), sp.ToArray()).ToList();
|
||||
obj[2]= data;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.writeErrorPath("GetStyle:" + ex.Message + ex.StackTrace);
|
||||
obj[0] = "N";
|
||||
obj[1] = ex.Message;
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
public object[] AddStyle(TabletStyle ts, List<TabletStyleDetail> list)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var context = new ezEntities())
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
SqlParameter[] sp = new SqlParameter[] {
|
||||
new SqlParameter("@StyleID",ts.StyleID),
|
||||
new SqlParameter("@Name",ts.Name),
|
||||
new SqlParameter("@Descr",ts.Descr),
|
||||
new SqlParameter("@PaperSize",ts.PaperSize),
|
||||
new SqlParameter("@BackendImg",ts.BackendImg),
|
||||
new SqlParameter("@PrintSize",ts.PrintSize),
|
||||
new SqlParameter("@PrintMode",ts.PrintMode),
|
||||
new SqlParameter("@Orientation",ts.Orientation),
|
||||
new SqlParameter("@PrintPageCount",ts.PrintPageCount),
|
||||
new SqlParameter("@RosterLimit",ts.RosterLimit),
|
||||
new SqlParameter("@CUser",""),
|
||||
new SqlParameter("@CDate",""),
|
||||
new SqlParameter("@CTime",""),
|
||||
new SqlParameter("@UUser",""),
|
||||
new SqlParameter("@UDate",""),
|
||||
new SqlParameter("@UTime",""),
|
||||
};
|
||||
|
||||
sb.Append("insert into TabletStyle (StyleID,Name,Descr,PaperSize,BackendImg,PrintSize,PrintMode,Orientation,PrintPageCount,RosterLimit");
|
||||
sb.Append(",CUser,CDate,CTime,UUser,UDate,UTime ) ");
|
||||
sb.Append("values(@StyleID,@Name,@Descr,@PaperSize,@BackendImg,@PrintSize,@PrintMode,@Orientation,@PrintPageCount,@RosterLimit");
|
||||
sb.Append(",@CUser,@CDate,@CTime,@UUser,@UDate,@UTime ) ");
|
||||
context.Database.ExecuteSqlCommand(sb.ToString(), sp);
|
||||
|
||||
sb.Clear();
|
||||
sb.Append("insert into TabletStyleDetail(StyleID,Name,Descr,ElementID,StartX,StartY,FontSize,BreakLen,FontFamily,TwoOffset,");
|
||||
sb.Append("ThreeOffset,FourOffSet,IsActive,Width,Height,TextWidth,TextHeight,CUser,CDate,CTime,UUser,UDate,UTime) ");
|
||||
sb.Append("values (@StyleID,@Name,@Descr,@ElementID,@StartX,@StartY,@FontSize,@BreakLen,@FontFamily,@TwoOffset,");
|
||||
sb.Append("@ThreeOffset,@FourOffSet,@IsActive,@Width,@Height,@TextWidth,@TextHeight,@CUser,@CDate,@CTime,@UUser,@UDate,@UTime) ");
|
||||
foreach (var item in list)
|
||||
{
|
||||
SqlParameter[] sp1 = new SqlParameter[] {
|
||||
new SqlParameter("@StyleID",item.StyleID),
|
||||
new SqlParameter("@Name",item.Name),
|
||||
new SqlParameter("@Descr",item.Descr),
|
||||
new SqlParameter("@ElementID",item.ElementID),
|
||||
new SqlParameter("@StartX",item.StartX),
|
||||
new SqlParameter("@StartY",item.StartY),
|
||||
new SqlParameter("@FontSize",item.FontSize),
|
||||
new SqlParameter("@BreakLen",item.BreakLen),
|
||||
new SqlParameter("@FontFamily",item.FontFamily),
|
||||
new SqlParameter("@TwoOffset",item.TwoOffset),
|
||||
new SqlParameter("@ThreeOffset",item.ThreeOffset),
|
||||
new SqlParameter("@FourOffset",item.FourOffset),
|
||||
new SqlParameter("@IsActive",item.IsActive),
|
||||
new SqlParameter("@Width",item.Width),
|
||||
new SqlParameter("@Height",item.Height),
|
||||
new SqlParameter("@TextWidth",item.TextWidth),
|
||||
new SqlParameter("@TextHeight",item.TextHeight),
|
||||
new SqlParameter("@CUser",""),
|
||||
new SqlParameter("@CDate",""),
|
||||
new SqlParameter("@CTime",""),
|
||||
new SqlParameter("@UUser",""),
|
||||
new SqlParameter("@UDate",""),
|
||||
new SqlParameter("@UTime",""),
|
||||
};
|
||||
context.Database.ExecuteSqlCommand(sb.ToString(), sp1.ToArray());
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.writeErrorPath("AddStyle:" + ex.Message+ex.StackTrace);
|
||||
obj[0] = "N";
|
||||
obj[1] = ex.Message;
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
public object[] UpdateStyle(TabletStyle ts, List<TabletStyleDetail> list)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var context = new ezEntities())
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
SqlParameter[] sp = new SqlParameter[] {
|
||||
new SqlParameter("@StyleID",ts.StyleID),
|
||||
new SqlParameter("@Name",ts.Name),
|
||||
new SqlParameter("@Descr",ts.Descr),
|
||||
new SqlParameter("@PaperSize",ts.PaperSize),
|
||||
new SqlParameter("@BackendImg",ts.BackendImg),
|
||||
new SqlParameter("@PrintSize",ts.PrintSize),
|
||||
new SqlParameter("@PrintMode",ts.PrintMode),
|
||||
new SqlParameter("@Orientation",ts.Orientation),
|
||||
new SqlParameter("@PrintPageCount",ts.PrintPageCount),
|
||||
new SqlParameter("@RosterLimit",ts.RosterLimit),
|
||||
new SqlParameter("@CUser",""),
|
||||
new SqlParameter("@CDate",""),
|
||||
new SqlParameter("@CTime",""),
|
||||
new SqlParameter("@UUser",""),
|
||||
new SqlParameter("@UDate",""),
|
||||
new SqlParameter("@UTime",""),
|
||||
};
|
||||
|
||||
sb.Append("update TabletStyle set Descr=@Descr,PaperSize=@PaperSize,BackendImg=@BackendImg,PrintSize=@PrintSize,");
|
||||
sb.Append("PrintMode=@PrintMode,Orientation=@Orientation,PrintPageCount=@PrintPageCount,RosterLimit=@RosterLimit,");
|
||||
sb.Append("CUser=@CUser,CDate=@CDate,CTime=@CTime,UUser=@UUSer,UDate=@UDate,UTime=@UTime ");
|
||||
sb.Append("where StyleID=@StyleID ");
|
||||
|
||||
context.Database.ExecuteSqlCommand(sb.ToString(), sp.ToArray());
|
||||
|
||||
sb.Clear();
|
||||
sb.Append("update TabletStyleDetail set Descr=@Descr,StartX=@StartX,StartY=@StartY,FontSize=@FontSize,BreakLen=@BreakLen,");
|
||||
sb.Append("FontFamily=@FontFamily,TwoOffset=@TwoOffset,ThreeOffset=@ThreeOffset,FourOffset=@FourOffset,IsActive=@IsActive,");
|
||||
sb.Append("Width=@Width,Height=@Height,TextWidth=@TextWidth,TextHeight=@TextHeight,UUser=@UUser,UDate=@UDate,UTime=@UTime ");
|
||||
sb.Append("where StyleID=@StyleID and ElementID=@ElementID ");
|
||||
//sb.Append("insert into TabletStyleDetail(StyleID,Name,Descr,ElementID,StartX,StartY,FontSize,BreakLen,FontFamily,TwoOffset,");
|
||||
//sb.Append("ThreeOffset,FourOffSet,IsActive,Width,Height,TextWidth,TextHeight,CUser,CDate,CTime,UUser,UDate,UTime) ");
|
||||
//sb.Append("values (@StyleID,@Name,@Descr,@ElementID,@StartX,@StartY,@FontSize,@BreakLen,@FontFamily,@TwoOffset,");
|
||||
//sb.Append("@ThreeOffset,@FourOffSet,@IsActive,@Width,@Height,@TextWidth,@TextHeight,@CUser,@CDate,@CTime,@UUser,@UDate,@UTime) ");
|
||||
foreach (var item in list)
|
||||
{
|
||||
SqlParameter[] sp1 = new SqlParameter[] {
|
||||
new SqlParameter("@StyleID",item.StyleID),
|
||||
new SqlParameter("@Name",item.Name),
|
||||
new SqlParameter("@Descr",item.Descr),
|
||||
new SqlParameter("@ElementID",item.ElementID),
|
||||
new SqlParameter("@StartX",item.StartX),
|
||||
new SqlParameter("@StartY",item.StartY),
|
||||
new SqlParameter("@FontSize",item.FontSize),
|
||||
new SqlParameter("@BreakLen",item.BreakLen),
|
||||
new SqlParameter("@FontFamily",item.FontFamily),
|
||||
new SqlParameter("@TwoOffset",item.TwoOffset),
|
||||
new SqlParameter("@ThreeOffset",item.ThreeOffset),
|
||||
new SqlParameter("@FourOffset",item.FourOffset),
|
||||
new SqlParameter("@IsActive",item.IsActive),
|
||||
new SqlParameter("@Width",item.Width),
|
||||
new SqlParameter("@Height",item.Height),
|
||||
new SqlParameter("@TextWidth",item.TextWidth),
|
||||
new SqlParameter("@TextHeight",item.TextHeight),
|
||||
new SqlParameter("@CUser",""),
|
||||
new SqlParameter("@CDate",""),
|
||||
new SqlParameter("@CTime",""),
|
||||
new SqlParameter("@UUser",""),
|
||||
new SqlParameter("@UDate",""),
|
||||
new SqlParameter("@UTime",""),
|
||||
};
|
||||
context.Database.ExecuteSqlCommand(sb.ToString(), sp1.ToArray());
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.writeErrorPath("UpdateStyle:" + ex.Message + ex.StackTrace);
|
||||
obj[0] = "N";
|
||||
obj[1] = ex.Message;
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
|
||||
/// <summary>
|
||||
/// Style 的摘要描述
|
||||
/// </summary>
|
||||
public class TabletStyle
|
||||
{
|
||||
public TabletStyle()
|
||||
{
|
||||
//
|
||||
// TODO: 在這裡新增建構函式邏輯
|
||||
//
|
||||
}
|
||||
|
||||
public string StyleID { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Descr { get; set; }
|
||||
public string PaperSize { get; set; }
|
||||
public string BackendImg { get; set; }
|
||||
public string PrintSize { get; set; }
|
||||
public string PrintMode { get; set; }
|
||||
public string Orientation { get; set; }
|
||||
public string PrintPageCount { get; set; }
|
||||
public string RosterLimit { get; set; }
|
||||
public string CUser { get; set; }
|
||||
public string CDate { get; set; }
|
||||
public string CTime { get; set; }
|
||||
public string UUser { get; set; }
|
||||
public string UDate { get; set; }
|
||||
public string UTime { get; set; }
|
||||
}
|
||||
|
||||
public class TabletStyleDetail
|
||||
{
|
||||
public TabletStyleDetail() { }
|
||||
public string StyleID { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Descr { get; set; }
|
||||
public string ElementID { get; set; }
|
||||
public string StartX { get; set; }
|
||||
public string StartY { get; set; }
|
||||
public string FontSize { get; set; }
|
||||
public string FontFamily { get; set; }
|
||||
public string TwoOffset { get; set; }
|
||||
public string ThreeOffset { get; set; }
|
||||
public string FourOffset { get; set; }
|
||||
public string IsActive { get; set; }
|
||||
public string Width { get; set; }
|
||||
public string Height { get; set; }
|
||||
public string TextWidth { get; set; }
|
||||
public string TextHeight { get; set; }
|
||||
public string BreakLen { get; set; }
|
||||
public string CUser { get; set; }
|
||||
public string CDate { get; set; }
|
||||
public string CTime { get; set; }
|
||||
public string UUser { get; set; }
|
||||
public string UDate { get; set; }
|
||||
public string UTime { get; set; }
|
||||
}
|
||||
|
||||
public class TabletElement
|
||||
{
|
||||
public TabletElement() { }
|
||||
public string ElementID { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string ElementType { get; set; }
|
||||
public string SampleContent { get; set; }
|
||||
public string CUser { get; set; }
|
||||
public string CDate { get; set; }
|
||||
public string CTime { get; set; }
|
||||
public string UUser { get; set; }
|
||||
public string UDate { get; set; }
|
||||
public string UTime { get; set; }
|
||||
}
|
||||
|
||||
public class TabletPaperSize
|
||||
{
|
||||
public TabletPaperSize() { }
|
||||
public string PaperID { get; set; }
|
||||
public string PaperName { get; set; }
|
||||
public string Width { get; set; }
|
||||
public string Height { get; set; }
|
||||
public string CUser { get; set; }
|
||||
public string CDate { get; set; }
|
||||
public string CTime { get; set; }
|
||||
public string UUser { get; set; }
|
||||
public string UDate { get; set; }
|
||||
public string UTime { get; set; }
|
||||
}
|
||||
Generated
+1
-1
@@ -1,4 +1,4 @@
|
||||
// 已啟用模型 'E:\17168ERP\web\App_Code\Model\Model.edmx' 的 T4 程式碼產生。
|
||||
// 已啟用模型 'D:\17168ERP\web\App_Code\Model\Model.edmx' 的 T4 程式碼產生。
|
||||
// 若要啟用舊版程式碼產生,請將 [程式碼產生策略] 設計工具屬性的值
|
||||
//變更為 [舊版 ObjectContext]。當模型在設計工具中開啟時,這個屬性便可
|
||||
//以在 [屬性] 視窗中使用。
|
||||
|
||||
@@ -184,6 +184,9 @@ namespace Model
|
||||
public string partno { get; set; }
|
||||
public string print_init { get; set; }
|
||||
public string is_reconcile { get; set; }
|
||||
public string pageSize { get; set; }
|
||||
public string printSize { get; set; }
|
||||
public string defaultStyle { get; set; }
|
||||
public Nullable<int> sort_order { get; set; }
|
||||
|
||||
public virtual actItem_kind actItem_kind { get; set; }
|
||||
@@ -1390,6 +1393,7 @@ namespace Model
|
||||
public Nullable<int> parent_num { get; set; }
|
||||
public string print_id { get; set; }
|
||||
public Nullable<System.DateTime> UpdateTime { get; set; }
|
||||
public string style { get; set; }
|
||||
|
||||
public virtual actItem actItem { get; set; }
|
||||
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
|
||||
|
||||
@@ -91,6 +91,9 @@
|
||||
<Property Name="customize_data" Type="nvarchar(max)" />
|
||||
<Property Name="reg_time" Type="datetime" />
|
||||
<Property Name="is_reconcile" Type="nvarchar" MaxLength="1" />
|
||||
<Property Name="pageSize" Type="varchar" MaxLength="50" />
|
||||
<Property Name="printSize" Type="varchar" MaxLength="50" />
|
||||
<Property Name="defaultStyle" Type="varchar" MaxLength="50" />
|
||||
<Property Name="sort_order" Type="int" />
|
||||
</EntityType>
|
||||
<EntityType Name="actItem_files">
|
||||
@@ -725,6 +728,7 @@
|
||||
<Property Name="customize_data" Type="nvarchar(max)" />
|
||||
<Property Name="printed_files" Type="nvarchar(max)" />
|
||||
<Property Name="UpdateTime" Type="datetime2" Precision="7" />
|
||||
<Property Name="style" Type="varchar" MaxLength="50" />
|
||||
</EntityType>
|
||||
<EntityType Name="pro_order_record">
|
||||
<Key>
|
||||
@@ -2608,7 +2612,10 @@
|
||||
<Property Name="print_init" Type="String" MaxLength="100" FixedLength="false" Unicode="true" />
|
||||
<NavigationProperty Name="transfer_register" Relationship="Model.FK_transfer_register_actItem" FromRole="actItem" ToRole="transfer_register" />
|
||||
<Property Name="is_reconcile" Type="String" MaxLength="1" FixedLength="false" Unicode="true" />
|
||||
<Property Name="sort_order" Type="Int32" />
|
||||
<Property Name="pageSize" Type="String" MaxLength="50" FixedLength="false" Unicode="false" />
|
||||
<Property Name="printSize" Type="String" MaxLength="50" FixedLength="false" Unicode="false" />
|
||||
<Property Name="defaultStyle" Type="String" MaxLength="50" FixedLength="false" Unicode="false" />
|
||||
<Property Name="sort_order" Type="Int32" ConcurrencyMode="None" />
|
||||
</EntityType>
|
||||
<EntityType Name="actItem_files">
|
||||
<Key>
|
||||
@@ -3184,6 +3191,7 @@
|
||||
<Property Name="UpdateTime" Type="DateTime" Precision="7" />
|
||||
<NavigationProperty Name="accountings" Relationship="Model.FK_accounting_pro_order_detail" FromRole="pro_order_detail" ToRole="accounting" />
|
||||
<NavigationProperty Name="transfer_register" Relationship="Model.FK_transfer_register_pro_order_detail" FromRole="pro_order_detail" ToRole="transfer_register" />
|
||||
<Property Name="style" Type="String" Unicode="false" FixedLength="false" MaxLength="50" Nullable="true" />
|
||||
</EntityType>
|
||||
<EntityType Name="pro_order_record">
|
||||
<Key>
|
||||
@@ -5331,6 +5339,9 @@
|
||||
<EntityTypeMapping TypeName="Model.actItem">
|
||||
<MappingFragment StoreEntitySet="actItem">
|
||||
<ScalarProperty Name="sort_order" ColumnName="sort_order" />
|
||||
<ScalarProperty Name="defaultStyle" ColumnName="defaultStyle" />
|
||||
<ScalarProperty Name="printSize" ColumnName="printSize" />
|
||||
<ScalarProperty Name="pageSize" ColumnName="pageSize" />
|
||||
<ScalarProperty Name="is_reconcile" ColumnName="is_reconcile" />
|
||||
<ScalarProperty Name="print_init" ColumnName="print_init" />
|
||||
<ScalarProperty Name="partno" ColumnName="partno" />
|
||||
@@ -5860,6 +5871,7 @@
|
||||
<ScalarProperty Name="demo" ColumnName="demo" />
|
||||
<ScalarProperty Name="customize_data" ColumnName="customize_data" />
|
||||
<ScalarProperty Name="printed_files" ColumnName="printed_files" />
|
||||
<ScalarProperty Name="style" ColumnName="style" />
|
||||
</MappingFragment>
|
||||
</EntityTypeMapping>
|
||||
</EntitySetMapping>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<edmx:Designer xmlns="http://schemas.microsoft.com/ado/2009/11/edmx">
|
||||
<!-- Diagram content (shape and connector positions) -->
|
||||
<edmx:Diagrams>
|
||||
<Diagram DiagramId="b267a343dc0c4bf0ae194b775754b108" Name="Diagram1" ZoomLevel="78">
|
||||
<Diagram DiagramId="b267a343dc0c4bf0ae194b775754b108" Name="Diagram1" ZoomLevel="116">
|
||||
<EntityTypeShape EntityType="Model.accounting" Width="1.5" PointX="22.5" PointY="22.125" IsExpanded="true" />
|
||||
<EntityTypeShape EntityType="Model.accounting_files" Width="1.5" PointX="15.75" PointY="27.75" IsExpanded="true" />
|
||||
<EntityTypeShape EntityType="Model.accounting_kind" Width="1.5" PointX="11.25" PointY="27.625" IsExpanded="true" />
|
||||
@@ -17,7 +17,7 @@
|
||||
<EntityTypeShape EntityType="Model.activity_check" Width="1.5" PointX="5.25" PointY="18.5" IsExpanded="true" />
|
||||
<EntityTypeShape EntityType="Model.activity_kind" Width="1.5" PointX="0.75" PointY="11.625" IsExpanded="true" />
|
||||
<EntityTypeShape EntityType="Model.activity_kind_detail" Width="1.5" PointX="13.5" PointY="3.875" IsExpanded="true" />
|
||||
<EntityTypeShape EntityType="Model.activity_relating" Width="1.5" PointX="10.5" PointY="9.875" IsExpanded="true" />
|
||||
<EntityTypeShape EntityType="Model.activity_relating" Width="1.5" PointX="11.25" PointY="9.875" IsExpanded="true" />
|
||||
<EntityTypeShape EntityType="Model.activity_spares" Width="1.5" PointX="13.5" PointY="7.75" IsExpanded="true" />
|
||||
<EntityTypeShape EntityType="Model.admin" Width="1.5" PointX="6" PointY="1.375" IsExpanded="true" />
|
||||
<EntityTypeShape EntityType="Model.admin_group" Width="1.5" PointX="3.75" PointY="3.625" IsExpanded="true" />
|
||||
|
||||
@@ -298,6 +298,7 @@ public class activityController : ApiController
|
||||
|
||||
var count = qry.Count(); //pageSize = count;//一次取回??
|
||||
var qryList = (pageSize > 0) ? qry.ToPagedList(page, pageSize).ToList() : qry.ToList();
|
||||
|
||||
var ret = new
|
||||
{
|
||||
list = qryList.Select(x => new
|
||||
@@ -317,11 +318,12 @@ public class activityController : ApiController
|
||||
startDate_lunar = x.startDate_lunar,
|
||||
endDate_lunar = x.endDate_lunar,
|
||||
dueDate = x.dueDate,
|
||||
orderCounts= _db.pro_order.Where(y => y.activity_num == x.num).Count(),
|
||||
}),
|
||||
count = count,
|
||||
|
||||
}),
|
||||
count = count
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
|
||||
|
||||
@@ -0,0 +1,302 @@
|
||||
using Microsoft.Ajax.Utilities;
|
||||
using MINOM.COM.Utility;
|
||||
using Model;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Web;
|
||||
using System.Web.Http;
|
||||
|
||||
/// <summary>
|
||||
/// designerController 的摘要描述
|
||||
/// </summary>
|
||||
public class designerController : ApiController
|
||||
{
|
||||
private Model.ezEntities _db = new Model.ezEntities();
|
||||
public designerController()
|
||||
{
|
||||
//
|
||||
// TODO: 在這裡新增建構函式邏輯
|
||||
//
|
||||
}
|
||||
|
||||
|
||||
[HttpPost]
|
||||
[Route("api/tablet/GetActItem")]
|
||||
public IHttpActionResult GetActItem([FromBody] dynamic data)
|
||||
{
|
||||
LogUtility log = new LogUtility();
|
||||
var json = data;
|
||||
string itemNum = (json == null || json.itemNum == null) ? "" : (string)json.itemNum;
|
||||
int num = int.Parse(itemNum);
|
||||
var item=_db.actItems.AsQueryable().Where(x => x.num == num).FirstOrDefault();
|
||||
return Ok(new { result = "Y", data =item});
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[Route("api/tablet/GetTabletElement")]
|
||||
public IHttpActionResult GetTabletElement([FromBody] dynamic data)
|
||||
{
|
||||
LogUtility log = new LogUtility();
|
||||
var json = data;
|
||||
string elementID = (json == null || json.elementID == null) ? "" : (string)json.elementID;
|
||||
object[] obj = new StyleDataAccess().GetTabletElement(elementID, "");
|
||||
if (obj[0].ToString() == "Y")
|
||||
{
|
||||
return Ok(new { result = "Y", data = obj[2] });
|
||||
}
|
||||
else
|
||||
{
|
||||
return Ok(new { result = "N", message = obj[1] });
|
||||
//throw new HttpResponseException(HttpStatusCode.NotFound);
|
||||
}
|
||||
//return Ok(data);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[Route("api/tablet/GetStyleDetailData")]
|
||||
public IHttpActionResult GetStyleDetailData([FromBody] dynamic data)
|
||||
{
|
||||
LogUtility log = new LogUtility();
|
||||
var json = data;
|
||||
string styleID = (json == null || json.styleID == null) ? "" : (string)json.styleID;
|
||||
object[] obj = new StyleDataAccess().GetStyleDetail(styleID, "");
|
||||
if (obj[0].ToString() == "Y")
|
||||
{
|
||||
return Ok(new { result = "Y", data = obj[2] });
|
||||
}
|
||||
else
|
||||
{
|
||||
return Ok(new { result = "N", message = obj[1] });
|
||||
//throw new HttpResponseException(HttpStatusCode.NotFound);
|
||||
}
|
||||
//return Ok(data);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[Route("api/tablet/saveFamily")]
|
||||
public IHttpActionResult saveFamily([FromBody] family_members familyMember)
|
||||
{
|
||||
LogUtility log = new LogUtility();
|
||||
_db.family_members.Add(familyMember);
|
||||
_db.SaveChanges();
|
||||
return Ok(new { result = "Y", data= familyMember });
|
||||
|
||||
//object[] obj = new StyleDataAccess().GetStyle("", "");
|
||||
//if (obj[0].ToString() == "Y")
|
||||
//{
|
||||
// return Ok(new { result = "Y", data = obj[2] });
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// return Ok(new { result = "N", message = obj[1] });
|
||||
// //throw new HttpResponseException(HttpStatusCode.NotFound);
|
||||
//}
|
||||
//return Ok(data);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[Route("api/tablet/GetStyleData")]
|
||||
public IHttpActionResult GetStyleData([FromBody] dynamic data)
|
||||
{
|
||||
LogUtility log = new LogUtility();
|
||||
|
||||
object[] obj = new StyleDataAccess().GetStyle("", "");
|
||||
if (obj[0].ToString() == "Y")
|
||||
{
|
||||
return Ok(new { result = "Y", data = obj[2] });
|
||||
}
|
||||
else
|
||||
{
|
||||
return Ok(new { result = "N", message = obj[1] });
|
||||
//throw new HttpResponseException(HttpStatusCode.NotFound);
|
||||
}
|
||||
//return Ok(data);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[Route("api/tablet/SavDegignerData")]
|
||||
public IHttpActionResult SavDegignerData([FromBody] dynamic data)
|
||||
{
|
||||
LogUtility log = new LogUtility();
|
||||
var json = data;
|
||||
//json.detail.Children<JObject>()
|
||||
log.writeLogPath((string)json.styleName);
|
||||
TabletStyle ts = new TabletStyle();
|
||||
List<TabletStyleDetail> list = new List<TabletStyleDetail>();
|
||||
ts.StyleID = (json == null || json.styleID == null) ? "" : (string)json.styleID;
|
||||
string mode = "edit";
|
||||
if (string.IsNullOrEmpty(ts.StyleID))
|
||||
{
|
||||
ts.StyleID = DateTime.Now.ToString("yyyyMMddHHmmss");
|
||||
mode = "add";
|
||||
}
|
||||
ts.Name = (json == null || json.styleName == null) ? "" : (string)json.styleName;
|
||||
ts.Descr = (json == null || json.descr == null) ? "" : (string)json.descr;
|
||||
ts.PaperSize = (json == null || json.paperSize == null) ? "" : (string)json.paperSize;
|
||||
ts.BackendImg = (json == null || json.backendImg == null) ? "" : (string)json.backendImg;
|
||||
ts.PrintSize = (json == null || json.printSize == null) ? "" : (string)json.printSize;
|
||||
ts.Orientation = (json == null || json.orientation == null) ? "" : (string)json.orientation;
|
||||
ts.PrintPageCount = (json == null || json.printPageCount == null) ? "" : (string)json.printPageCount;
|
||||
ts.PrintMode = (json == null || json.printMode == null) ? "" : (string)json.printMode;
|
||||
ts.RosterLimit=(json == null || json.rosterLimit == null) ? "" : (string)json.rosterLimit;
|
||||
foreach (var item in json.detail.Children<JObject>())
|
||||
{
|
||||
TabletStyleDetail tsd = new TabletStyleDetail();
|
||||
tsd.StyleID = ts.StyleID;
|
||||
tsd.Name = item.name == null ? "" : (string)item.name;
|
||||
tsd.Descr = item.descr == null ? "" : (string)item.descr;
|
||||
tsd.ElementID = item.elementID == null ? "" : (string)item.elementID;
|
||||
tsd.StartX = item.startX == null ? "" : (string)item.startX;
|
||||
tsd.StartY = item.startY == null ? "" : (string)item.startY;
|
||||
tsd.FontSize = item.fontSize == null ? "" : (string)item.fontSize;
|
||||
tsd.FontFamily = item.fontFamily == null ? "" : (string)item.fontFamily;
|
||||
tsd.BreakLen = item.breakLen == null ? "" : (string)item.breakLen;
|
||||
tsd.Width = item.width == null ? "" : (string)item.width;
|
||||
tsd.Height = item.height == null ? "" : (string)item.height;
|
||||
tsd.TextWidth = item.textWidth == null ? "" : (string)item.textWidth;
|
||||
tsd.TextHeight = item.textHeight == null ? "" : (string)item.textHeight;
|
||||
tsd.TwoOffset = item.twoOffset == null ? "" : (string)item.twoOffset;
|
||||
tsd.ThreeOffset = item.threeOffset == null ? "" : (string)item.threeOffset;
|
||||
tsd.FourOffset = item.fourOffset == null ? "" : (string)item.fourOffset;
|
||||
tsd.IsActive = item.isActive == null ? "" : (string)item.isActive;
|
||||
list.Add(tsd);
|
||||
}
|
||||
if (mode == "add")
|
||||
{
|
||||
object[] obj = new StyleDataAccess().AddStyle(ts, list);
|
||||
if (obj[0].ToString() == "Y")
|
||||
{
|
||||
return Ok(new { result = "Y" });
|
||||
}
|
||||
else
|
||||
{
|
||||
return Ok(new { result = "N" });
|
||||
}
|
||||
}
|
||||
return Ok();
|
||||
}
|
||||
|
||||
|
||||
|
||||
[HttpPost]
|
||||
[Route("api/tablet/UpdateDegignerData")]
|
||||
public IHttpActionResult UpdateDegignerData([FromBody] dynamic data)
|
||||
{
|
||||
LogUtility log = new LogUtility();
|
||||
var json = data;
|
||||
//json.detail.Children<JObject>()
|
||||
log.writeLogPath((string)json.styleName);
|
||||
TabletStyle ts = new TabletStyle();
|
||||
List<TabletStyleDetail> list = new List<TabletStyleDetail>();
|
||||
ts.StyleID = (json == null || json.styleID == null) ? "" : (string)json.styleID;
|
||||
string mode = "edit";
|
||||
if (string.IsNullOrEmpty(ts.StyleID))
|
||||
{
|
||||
ts.StyleID = DateTime.Now.ToString("yyyyMMddHHmmss");
|
||||
mode = "add";
|
||||
}
|
||||
ts.Name = (json == null || json.styleName == null) ? "" : (string)json.styleName;
|
||||
ts.Descr = (json == null || json.descr == null) ? "" : (string)json.descr;
|
||||
ts.PaperSize = (json == null || json.paperSize == null) ? "" : (string)json.paperSize;
|
||||
ts.BackendImg = (json == null || json.backendImg == null) ? "" : (string)json.backendImg;
|
||||
ts.PrintSize = (json == null || json.printSize == null) ? "" : (string)json.printSize;
|
||||
ts.Orientation = (json == null || json.orientation == null) ? "" : (string)json.orientation;
|
||||
ts.PrintPageCount = (json == null || json.printPageCount == null) ? "" : (string)json.printPageCount;
|
||||
ts.PrintMode = (json == null || json.printMode == null) ? "" : (string)json.printMode;
|
||||
ts.RosterLimit = (json == null || json.rosterLimit == null) ? "" : (string)json.rosterLimit;
|
||||
foreach (var item in json.detail.Children<JObject>())
|
||||
{
|
||||
TabletStyleDetail tsd = new TabletStyleDetail();
|
||||
tsd.StyleID = ts.StyleID;
|
||||
tsd.Name = item.name == null ? "" : (string)item.name;
|
||||
tsd.Descr = item.descr == null ? "" : (string)item.descr;
|
||||
tsd.ElementID = item.elementID == null ? "" : (string)item.elementID;
|
||||
tsd.StartX = item.startX == null ? "" : (string)item.startX;
|
||||
tsd.StartY = item.startY == null ? "" : (string)item.startY;
|
||||
tsd.FontSize = item.fontSize == null ? "" : (string)item.fontSize;
|
||||
tsd.FontFamily = item.fontFamily == null ? "" : (string)item.fontFamily;
|
||||
tsd.BreakLen = item.breakLen == null ? "" : (string)item.breakLen;
|
||||
tsd.Width = item.width == null ? "" : (string)item.width;
|
||||
tsd.TwoOffset = item.twoOffset == null ? "" : (string)item.twoOffset;
|
||||
tsd.ThreeOffset = item.threeOffset == null ? "" : (string)item.threeOffset;
|
||||
tsd.FourOffset = item.fourOffset == null ? "" : (string)item.fourOffset;
|
||||
tsd.IsActive = item.isActive == null ? "" : (string)item.isActive;
|
||||
tsd.Width = item.width == null ? "" : (string)item.width;
|
||||
tsd.Height = item.height == null ? "" : (string)item.height;
|
||||
tsd.TextWidth = item.textWidth == null ? "" : (string)item.textWidth;
|
||||
tsd.TextHeight = item.textHeight == null ? "" : (string)item.textHeight;
|
||||
list.Add(tsd);
|
||||
}
|
||||
|
||||
object[] obj = new StyleDataAccess().UpdateStyle(ts, list);
|
||||
if (obj[0].ToString() == "Y")
|
||||
{
|
||||
return Ok(new { result = "Y" });
|
||||
}
|
||||
else
|
||||
{
|
||||
return Ok(new { result = "N" });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[HttpPost]
|
||||
[Route("api/tablet/GetPaperSize")]
|
||||
public IHttpActionResult GetPaperSize([FromBody] dynamic data)
|
||||
{
|
||||
LogUtility log = new LogUtility();
|
||||
|
||||
object[] obj = new StyleDataAccess().GetTabletPaper("", "");
|
||||
if (obj[0].ToString() == "Y")
|
||||
{
|
||||
return Ok(new { result = "Y", data = obj[2] });
|
||||
}
|
||||
else
|
||||
{
|
||||
return Ok(new { result = "N", message = obj[1] });
|
||||
//throw new HttpResponseException(HttpStatusCode.NotFound);
|
||||
}
|
||||
//return Ok(data);
|
||||
}
|
||||
|
||||
|
||||
[HttpPost]
|
||||
[Route("api/tablet/SavePaperSize")]
|
||||
public IHttpActionResult SavePaperSize([FromBody] dynamic data)
|
||||
{
|
||||
LogUtility log = new LogUtility();
|
||||
var json = data;
|
||||
//json.detail.Children<JObject>()
|
||||
log.writeLogPath((string)json.styleName);
|
||||
TabletPaperSize tps = new TabletPaperSize();
|
||||
tps.PaperID = (json == null || json.paperID == null) ? "" : (string)json.paperID;
|
||||
if (string.IsNullOrEmpty(tps.PaperID))
|
||||
{
|
||||
tps.PaperID = DateTime.Now.ToString("yyyyMMddHHmmss");
|
||||
}
|
||||
tps.PaperName = (json == null || json.paperName == null) ? "" : (string)json.paperName;
|
||||
tps.Width = (json == null || json.width == null) ? "" : (string)json.width;
|
||||
tps.Height = (json == null || json.height == null) ? "" : (string)json.height;
|
||||
tps.CUser = "";
|
||||
tps.CDate = DateTime.Now.ToString("yyyyMMdd");
|
||||
tps.CTime = DateTime.Now.ToString("HHmmss");
|
||||
tps.UUser = "";
|
||||
tps.UDate = DateTime.Now.ToString("yyyyMMdd");
|
||||
tps.UTime = DateTime.Now.ToString("HHmmss");
|
||||
|
||||
object[] obj = new StyleDataAccess().AddTabletPaper(tps);
|
||||
if (obj[0].ToString()=="Y")
|
||||
{
|
||||
return Ok(new { result = "Y" });
|
||||
}
|
||||
else
|
||||
{
|
||||
return Ok(new { result = "N"});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -460,6 +460,7 @@ public class orderController : ApiController
|
||||
? x.num.ToString()
|
||||
: (x.parent_num.ToString() + x.num.ToString())
|
||||
),
|
||||
style=x.style??""
|
||||
//cash_record = x.pro_order_record.Select( c => new {
|
||||
// c,
|
||||
// //pay_kind = tdesc2[c.payment.HasValue && x.keyin1.Value > 0 ? x.keyin1.Value : 1],
|
||||
@@ -725,6 +726,7 @@ public class orderController : ApiController
|
||||
order.demo = item.demo;
|
||||
order.customize_data = item.customize_data;
|
||||
order.UpdateTime = DateTime.Now;
|
||||
order.style = item.style;
|
||||
_db.SaveChanges();
|
||||
var ret = new
|
||||
{
|
||||
@@ -778,6 +780,7 @@ public class orderController : ApiController
|
||||
demo = item.demo,
|
||||
customize_data = item.customize_data,
|
||||
UpdateTime = DateTime.Now,
|
||||
style=item.style
|
||||
};
|
||||
_db.pro_order_detail.Add(orderDetail);
|
||||
_db.SaveChanges();
|
||||
|
||||
@@ -1,14 +1,18 @@
|
||||
using System;
|
||||
using com.itextpdf.text.pdf;
|
||||
using Model;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using PagedList;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Entity;
|
||||
using System.Data.SqlClient;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Web.Http;
|
||||
using PagedList;
|
||||
using Newtonsoft.Json;
|
||||
using System.Collections;
|
||||
using static TreeView;
|
||||
using System.Data.Entity;
|
||||
|
||||
/// <summary>
|
||||
/// orderdetail 的摘要说明
|
||||
@@ -59,4 +63,39 @@ public class orderdetailController:ApiController
|
||||
if (ret.list == null) throw new HttpResponseException(HttpStatusCode.NotFound);
|
||||
return Ok(ret);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[Route("api/orderdetail/GetDetailToPrint")]
|
||||
public IHttpActionResult GetDetailToPrint([FromBody] dynamic data)
|
||||
{
|
||||
if (data.param is Newtonsoft.Json.Linq.JArray items)
|
||||
{
|
||||
string[] details = new string[items.Count];
|
||||
int i = 0;
|
||||
foreach (var item in items)
|
||||
{
|
||||
details[i] = item["order_no"] + item["num"].ToString();
|
||||
i++;
|
||||
}
|
||||
|
||||
var parameters = details.Select((s,j)=>"@p"+j).ToArray();
|
||||
string sql = $"select * from pro_order_detail where order_no+convert(varchar,num) in ({string.Join(",",parameters)}) ";
|
||||
|
||||
int l =0;
|
||||
List<SqlParameter> sqlList = new List<SqlParameter>();
|
||||
foreach (var item in details)
|
||||
{
|
||||
sqlList.Add( new SqlParameter("@p" + l, item));
|
||||
l++;
|
||||
}
|
||||
SqlParameter[] p = sqlList.ToArray();
|
||||
var ret = _db.Database.SqlQuery<pro_order_detail>(sql, p).ToList();
|
||||
if (ret == null) throw new HttpResponseException(HttpStatusCode.NotFound);
|
||||
return Ok(ret);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new HttpResponseException(HttpStatusCode.NotFound);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,7 @@ using System.Collections;
|
||||
using MyWeb;
|
||||
using System.Web.WebPages;
|
||||
using System.Data.Entity;
|
||||
using Model;
|
||||
|
||||
[ezAuthorize]
|
||||
public class transfer_registerController : ApiController
|
||||
@@ -269,6 +270,7 @@ public class transfer_registerController : ApiController
|
||||
public string check_memo { get; set; }
|
||||
public string draft { get; set; }
|
||||
public int? acc_kind { get; set; } // 新增關聯欄位
|
||||
public int? kind { get; set; }
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
@@ -315,7 +317,7 @@ public class transfer_registerController : ApiController
|
||||
{
|
||||
uptime = dto.check_date,
|
||||
category = 1, // 收入
|
||||
kind = 27, // 固定值:法會收入/功德項目
|
||||
kind = dto.kind,//27, // 固定值:法會收入/功德項目
|
||||
kind2 = dto.acc_num,
|
||||
price = (float)(dto.check_amount ?? 0),
|
||||
tax = 0,
|
||||
@@ -346,6 +348,7 @@ public class transfer_registerController : ApiController
|
||||
item.check_memo = dto.check_memo;
|
||||
item.draft = dto.draft;
|
||||
item.acc_kind = dto.acc_kind;
|
||||
|
||||
}
|
||||
}
|
||||
_db.SaveChanges();
|
||||
@@ -958,7 +961,10 @@ public class transfer_registerController : ApiController
|
||||
activity_name = x.activity != null ? x.activity.subject : "",
|
||||
activity_num = x.activity_num,
|
||||
acc_name = x.acc_num != null ? _db.accounting_kind2.Where(a => a.num == x.acc_num).Select(a => a.kind).FirstOrDefault() : "",
|
||||
|
||||
price_totals=_db.pro_order_detail.
|
||||
Where(a => _db.pro_order.Where (po=>po.f_num==x.f_num&&po.activity_num==x.activity_num).
|
||||
Select(po => po.order_no).Any(p=>p.Equals(a.order_no))).Sum(a => a.price*a.qty),
|
||||
pay_totals=_db.transfer_register.Where(a=>a.activity_num==x.activity_num&&a.f_num==x.f_num).Sum(a=>a.check_amount),
|
||||
// pro_order_record 資訊 (透過 transfer_id 關聯)
|
||||
pro_order_records = x.pro_order_record.Select(pr => new {
|
||||
pr.num,
|
||||
@@ -1275,3 +1281,22 @@ public class transfer_registerController : ApiController
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//select ord.order_no, ord.activity_num, ord.f_num, ord.u_name, ord.totals as cost, isnull(reg.totals, 0) totals
|
||||
//from (
|
||||
//select o.order_no, o.activity_num, o.f_num, o.u_name, sum(o.totals) as totals from (
|
||||
//select a.order_no, a.f_num, d.u_name, a.activity_num, b.num, b.f_num_tablet,
|
||||
//b.price, b.qty, totals = b.price * b.qty, c.kind, c.subject
|
||||
//from pro_order a
|
||||
//left join pro_order_detail b on a.order_no=b.order_no
|
||||
//left join actItem c on b.actItem_num=c.num
|
||||
//left join followers d on a.f_num=d.num )o
|
||||
//group by o.order_no, o.activity_num, o.f_num, o.u_name) ord
|
||||
//left join (
|
||||
//select a.activity_num, a.f_num, sum(a.amount) totals from transfer_register a
|
||||
//where status='2' and check_status='99'
|
||||
//group by a.activity_num, a.f_num
|
||||
//) reg on ord.activity_num=reg.activity_num and ord.f_num=reg.f_num
|
||||
@@ -8,7 +8,7 @@
|
||||
<LastUsedPlatform>Any CPU</LastUsedPlatform>
|
||||
<LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
|
||||
<PublishProvider>FileSystem</PublishProvider>
|
||||
<PublishUrl>D:\17168web</PublishUrl>
|
||||
<PublishUrl>C:\17168web</PublishUrl>
|
||||
<WebPublishMethod>FileSystem</WebPublishMethod>
|
||||
<_TargetId>Folder</_TargetId>
|
||||
<SiteUrlToLaunchAfterPublish />
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
<link href="~/js/sweetalert2/sweetalert2.min.css" rel="stylesheet" />
|
||||
|
||||
<link href="~/admin/Templates/TBS5ADM001/css/Style.css" rel="stylesheet" />
|
||||
<link href="~/admin/item/css/floating.css" rel="stylesheet" />
|
||||
<link href="~/admin/item/css/tablet-design.css" rel="stylesheet" />
|
||||
<asp:ContentPlaceHolder id="page_header" runat="server">
|
||||
</asp:ContentPlaceHolder>
|
||||
</head>
|
||||
@@ -67,14 +69,14 @@
|
||||
let HTTP_HOST = "<%=UrlHost()%>";
|
||||
</script>
|
||||
<script src="<%=ResolveUrl("~/js/bootstrap5/js/bootstrap.bundle.min.js")%>"></script>
|
||||
<script src="<%=ResolveUrl("~/js/jquery-3.6.0.min.js")%>"></script>
|
||||
<script src="<%=ResolveUrl("~/js/jquery-4.0.0.min.js")%>"></script>
|
||||
<script src="<%=ResolveUrl("~/js/vue.min.js")%>"></script>
|
||||
<script src="<%=ResolveUrl("~/js/vuetify.min.js")%>"></script>
|
||||
<script src="<%=ResolveUrl("~/js/axios.min.js")%>"></script>
|
||||
<script src="<%=ResolveUrl("~/js/moment.min.js")%>"></script>
|
||||
<script src="<%=ResolveUrl("~/js/sweetalert2/sweetalert2.all.min.js") %>"></script>
|
||||
<script src="<%=ResolveUrl("~/admin/Templates/TBS5ADM001/js/Script.js")%>"></script>
|
||||
|
||||
<script src="<%=ResolveUrl("~/admin/item/jquery-ui/jquery-ui.min.js")%>"></script>
|
||||
<script>
|
||||
//全局的VUE組件,操作提示組件
|
||||
Vue.component('message-modal', {
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
data() {
|
||||
return {
|
||||
this_id: '<%= Request["num"] %>',
|
||||
paperlist: [],
|
||||
stylelist: [],
|
||||
options: {},
|
||||
optionsDetail: {
|
||||
multiSort: false,
|
||||
@@ -43,7 +45,7 @@
|
||||
{ id: 'kind', title: '分類名稱' },
|
||||
],
|
||||
selected: {},
|
||||
select(item,t) {
|
||||
select(item, t) {
|
||||
console.log("select search1", t);
|
||||
}
|
||||
},
|
||||
@@ -60,7 +62,7 @@
|
||||
{ id: 'subject', title: '文件名稱' },
|
||||
],
|
||||
selected: {},
|
||||
select(item,t) {
|
||||
select(item, t) {
|
||||
console.log("select search2", t);
|
||||
|
||||
item.files_num_selected.text = t.subject //=====?
|
||||
@@ -71,26 +73,26 @@
|
||||
id: 'search3',
|
||||
title: '子項目',
|
||||
text_prop: 'subject',
|
||||
value_prop: 'num',
|
||||
keys: [
|
||||
{ id: 'subject', title: '項目名稱', value: '' },
|
||||
{ id: 'kindTxt', title: '項目分類' },
|
||||
],
|
||||
api_url: HTTP_HOST + 'api/activity/GetItemList',
|
||||
columns: [
|
||||
{ id: 'subject', title: '項目名稱', value: '' },
|
||||
{ id: 'kindTxt', title: '項目分類' },
|
||||
],
|
||||
selected: {},
|
||||
select(item,t) {
|
||||
console.log("select search3", item, t);
|
||||
//debugger;
|
||||
item.actItem.subject = t.subject
|
||||
item.actItem.num = t.num
|
||||
item.item_num_selected={
|
||||
text: t.subject,
|
||||
val : t.num
|
||||
}
|
||||
value_prop: 'num',
|
||||
keys: [
|
||||
{ id: 'subject', title: '項目名稱', value: '' },
|
||||
{ id: 'kindTxt', title: '項目分類' },
|
||||
],
|
||||
api_url: HTTP_HOST + 'api/activity/GetItemList',
|
||||
columns: [
|
||||
{ id: 'subject', title: '項目名稱', value: '' },
|
||||
{ id: 'kindTxt', title: '項目分類' },
|
||||
],
|
||||
selected: {},
|
||||
select(item, t) {
|
||||
console.log("select search3", item, t);
|
||||
//debugger;
|
||||
item.actItem.subject = t.subject
|
||||
item.actItem.num = t.num
|
||||
item.item_num_selected = {
|
||||
text: t.subject,
|
||||
val: t.num
|
||||
}
|
||||
// item.bom_editedItem.actItem.subject = t.subject
|
||||
// item.bom_editedItem.actItem.num = t.num
|
||||
|
||||
@@ -98,8 +100,8 @@
|
||||
// text : t.subject,
|
||||
// val = t.num
|
||||
// }
|
||||
}
|
||||
////新增/修改+關閉時, 會清空/還原
|
||||
}
|
||||
////新增/修改+關閉時, 會清空/還原
|
||||
},
|
||||
|
||||
},
|
||||
@@ -243,8 +245,8 @@
|
||||
});
|
||||
//necessary parameter===
|
||||
if (this.search_dialog.current.id == 'search1') {
|
||||
if (this.this_id=="")
|
||||
search['status'] = "Y";//啟用
|
||||
if (this.this_id == "")
|
||||
search['status'] = "Y";//啟用
|
||||
}
|
||||
console.log("search_get", api_url, search, params, this.options);
|
||||
this.search_dialog.loading = true
|
||||
@@ -292,7 +294,7 @@
|
||||
target.children("input.search-text").val(curr.selected[curr.text_prop])//text
|
||||
target.children("input:hidden").val(curr.selected[curr.value_prop])//value
|
||||
if (curr.select instanceof Function) {
|
||||
curr.select(editem,row);
|
||||
curr.select(editem, row);
|
||||
}
|
||||
this.search_dialog.show = false;
|
||||
//console.log(row, row["u_name"], row["f_number"], curr.id, target);
|
||||
@@ -334,6 +336,50 @@
|
||||
)
|
||||
}
|
||||
|
||||
axios
|
||||
.post(HTTP_HOST + 'api/tablet/GetPaperSize', {})
|
||||
.then(response => {
|
||||
console.log(response);
|
||||
if (response.status == "200") {
|
||||
let data = response.data;
|
||||
if (data.result == "Y") {
|
||||
data.data.forEach(x => {
|
||||
this.paperlist.push({ name: x.paperName, id: x.paperID, width: x.width, height: x.height })
|
||||
$('#<%= ddlPageSize.ClientID %>').append(`<option value="${x.paperID}">${x.paperName}</option>`);
|
||||
$('#<%= ddlPrintSize.ClientID %>').append(`<option value="${x.paperID}">${x.paperName}</option>`);
|
||||
});
|
||||
|
||||
$('#<%= ddlPageSize.ClientID %>').val($("#<%= hidPageSize.ClientID %>").val())
|
||||
$('#<%= ddlPrintSize.ClientID %>').val($("#<%= hidPrintSize.ClientID %>").val())
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(
|
||||
error => console.log(error)
|
||||
)
|
||||
|
||||
axios
|
||||
.post(HTTP_HOST + 'api/tablet/GetStyleData', {})
|
||||
.then(response => {
|
||||
console.log(response);
|
||||
if (response.status == "200") {
|
||||
let data = response.data;
|
||||
if (data.result == "Y") {
|
||||
data.data.forEach(x => {
|
||||
if (x.styleID != "000001") {
|
||||
this.stylelist.push({ styleID: x.styleID, name: x.name })
|
||||
$('#<%= ddlDefaultStyle.ClientID %>').append(`<option value="${x.styleID}">${x.name}</option>`);
|
||||
//$("#defaultStyle").append(`<option value="${x.styleID}">${x.name}</option>`);
|
||||
}
|
||||
});
|
||||
$('#<%= ddlDefaultStyle.ClientID %>').val($("#<%= hidDefaultStyle.ClientID %>").val())
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(
|
||||
error => console.log(error)
|
||||
)
|
||||
|
||||
},
|
||||
editItem(item) {
|
||||
this.editedIndex = this.desserts.indexOf(item);
|
||||
@@ -404,7 +450,7 @@
|
||||
if (this.editedIndex > -1) {
|
||||
if (this.this_id != '') {
|
||||
//chcck necessary params
|
||||
if (this.editedItem.files_num_selected.val != 0 ) {
|
||||
if (this.editedItem.files_num_selected.val != 0) {
|
||||
//insert or update data
|
||||
var pro_order_detail =
|
||||
{
|
||||
@@ -443,16 +489,16 @@
|
||||
const _subject = $('#<%= subject.ClientID%>').val();
|
||||
return "(" + strUser + ")" + " " + _kind_txt + " " + _subject;
|
||||
},
|
||||
bom_editItem(item){
|
||||
bom_editItem(item) {
|
||||
this.bom_editedIndex = this.bom_list.indexOf(item);
|
||||
this.bom_editedItem = $.extend(true, {}, item);
|
||||
console.log("bom_editItem:", this.bom_editedIndex, this.bom_editedItem);
|
||||
//debugger;
|
||||
},
|
||||
bom_deleteItem(item){
|
||||
bom_deleteItem(item) {
|
||||
confirm('確定要刪除此筆資料嗎?') && this.bom_list.splice(index, 1);
|
||||
},
|
||||
bom_cancel(){
|
||||
bom_cancel() {
|
||||
this.bom_spliceNullData();
|
||||
this.bom_close();
|
||||
},
|
||||
@@ -472,7 +518,7 @@
|
||||
this.bom_editedItem = -1;
|
||||
}, 300)
|
||||
},
|
||||
bom_addNew(){
|
||||
bom_addNew() {
|
||||
this.spliceNullData();
|
||||
|
||||
//addObj.id = this.desserts.length + 1;
|
||||
@@ -491,11 +537,11 @@
|
||||
if (!!this.bom_list) this.bom_list?.unshift(addObj);
|
||||
this.bom_editItem(addObj);
|
||||
},
|
||||
bom_save(){
|
||||
bom_save() {
|
||||
if (this.bom_editedIndex > -1) {
|
||||
if (this.this_id != '') {
|
||||
//chcck necessary params
|
||||
if (this.bom_editedItem.item_num_selected.val != 0 ) {
|
||||
if (this.bom_editedItem.item_num_selected.val != 0) {
|
||||
//insert or update data
|
||||
var package_num = $(".packageNum input[type=hidden]").val();
|
||||
var bom_detail =
|
||||
@@ -525,6 +571,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
changeSel(selType) {
|
||||
if (selType=="ddlPageSize") {
|
||||
$("#<%= hidPageSize.ClientID %>").val($("#<%= ddlPageSize.ClientID %>").val())
|
||||
} else if (selType == "ddlPrintSize") {
|
||||
$("#<%= hidPrintSize.ClientID %>").val($("#<%=ddlPrintSize.ClientID %>").val())
|
||||
} else if (selType == "ddlDefaultStyle") {
|
||||
$("#<%= hidDefaultStyle.ClientID %>").val($("#<%= ddlDefaultStyle.ClientID %>").val())
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
},
|
||||
@@ -625,6 +680,27 @@
|
||||
<asp:RegularExpressionValidator ControlToValidate="price" Display="Dynamic" SetFocusOnError="true" ErrorMessage="只能輸入數字" ID="RegularExpressionValidator3" runat="server" ValidationExpression="^(-?\d+)(\.\d+)?$" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-1 label-sm-right">
|
||||
<label class="col-sm-2 col-form-label">預設頁面尺寸</label>
|
||||
<div class="col-sm-4">
|
||||
<select ID="ddlPageSize" runat="server" onchange="VueApp.changeSel('ddlPageSize')"></select>
|
||||
<asp:HiddenField ID="hidPageSize" runat="server" />
|
||||
</div>
|
||||
<label class="col-sm-2 col-form-label">預設列印尺寸</label>
|
||||
<div class="col-sm-4">
|
||||
<select ID="ddlPrintSize" runat="server" onchange="VueApp.changeSel('ddlPrintSize')"></select>
|
||||
<asp:HiddenField ID="hidPrintSize" runat="server" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-1 label-sm-right">
|
||||
<label class="col-sm-2 col-form-label">預設版型</label>
|
||||
<div class="col-sm-4">
|
||||
<select ID="ddlDefaultStyle" runat="server" onchange="VueApp.changeSel('ddlDefaultStyle')"></select>
|
||||
<asp:HiddenField ID="hidDefaultStyle" runat="server" />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<asp:UpdatePanel ID="UpdatePanel1" runat="server" class="row mb-1 label-sm-right">
|
||||
<ContentTemplate>
|
||||
<label class="col-sm-2 col-form-label"></label>
|
||||
|
||||
@@ -44,6 +44,21 @@ public partial class admin_activity_item_reg : MyWeb.config
|
||||
print_init.Text = prod.print_init;
|
||||
PARTNO.Text = prod.partno;
|
||||
//kind.SelectedValue = prod.kind.ToString();
|
||||
if (!isStrNull(prod.pageSize))
|
||||
{
|
||||
ddlPageSize.Value = prod.pageSize.ToString();
|
||||
hidPageSize.Value = prod.pageSize.ToString();
|
||||
}
|
||||
if (!isStrNull(prod.printSize))
|
||||
{
|
||||
ddlPrintSize.Value = prod.printSize.ToString();
|
||||
hidPrintSize.Value = prod.printSize.ToString();
|
||||
}
|
||||
if (!isStrNull(prod.defaultStyle))
|
||||
{
|
||||
ddlDefaultStyle.Value = prod.defaultStyle.ToString();
|
||||
hidDefaultStyle.Value = prod.defaultStyle.ToString();
|
||||
}
|
||||
if (prod.kind.HasValue)
|
||||
{
|
||||
kind_txt.Value = prod.actItem_kind.kind;
|
||||
@@ -122,6 +137,18 @@ public partial class admin_activity_item_reg : MyWeb.config
|
||||
actItem.subject = subject.Text;
|
||||
actItem.print_init = print_init.Text;
|
||||
actItem.partno = PARTNO.Text;
|
||||
if (!isStrNull(ddlPageSize.Value))
|
||||
{
|
||||
actItem.pageSize = ddlPageSize.Value;
|
||||
}
|
||||
if (!isStrNull(ddlPrintSize.Value))
|
||||
{
|
||||
actItem.printSize = ddlPrintSize.Value;
|
||||
}
|
||||
if (!isStrNull(ddlDefaultStyle.Value))
|
||||
{
|
||||
actItem.defaultStyle = (ddlDefaultStyle.Value);
|
||||
}
|
||||
//if (!isStrNull(kind.SelectedValue)) { actItem.kind = Val(kind.SelectedValue); } else { actItem.kind = null; }
|
||||
if (!isStrNull(category.SelectedValue)) { actItem.category = Val(category.SelectedValue); } else { actItem.category = null; }
|
||||
if (!isStrNull(kind.Value)) { actItem.kind = Val(kind.Value); } else { actItem.kind = null; }
|
||||
@@ -170,6 +197,18 @@ public partial class admin_activity_item_reg : MyWeb.config
|
||||
actItem.subject = subject.Text;
|
||||
actItem.print_init = print_init.Text;
|
||||
actItem.partno = PARTNO.Text;
|
||||
if (!isStrNull(hidPageSize.Value))
|
||||
{
|
||||
actItem.pageSize = hidPageSize.Value;
|
||||
}
|
||||
if (!isStrNull(hidPrintSize.Value))
|
||||
{
|
||||
actItem.printSize = hidPrintSize.Value;
|
||||
}
|
||||
if (!isStrNull(hidDefaultStyle.Value))
|
||||
{
|
||||
actItem.defaultStyle = (hidDefaultStyle.Value);
|
||||
}
|
||||
//if (!isStrNull(kind.SelectedValue)) { actItem.kind = Val(kind.SelectedValue); } else { actItem.kind = null; }
|
||||
if (!isStrNull(category.SelectedValue)) { actItem.category = Val(category.SelectedValue); } else { actItem.category = null; }
|
||||
if (!isStrNull(kind.Value)) { actItem.kind = Val(kind.Value); } else { actItem.kind = null; }
|
||||
@@ -248,4 +287,16 @@ public partial class admin_activity_item_reg : MyWeb.config
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//protected override void Render(HtmlTextWriter writer)
|
||||
//{
|
||||
// ClientScript.RegisterForEventValidation(
|
||||
// ddlDefaultStyle.UniqueID, "ddlDefaultStyle");
|
||||
// ClientScript.RegisterForEventValidation(
|
||||
// ddlPageSize.UniqueID, "ddlPageSize");
|
||||
// ClientScript.RegisterForEventValidation(
|
||||
// ddlPrintSize.UniqueID, "ddlPrintSize");
|
||||
|
||||
// base.Render(writer);
|
||||
//}
|
||||
}
|
||||
@@ -590,7 +590,8 @@
|
||||
this.data_table.selected.push(this.data_table.editFilesItem[i])
|
||||
}
|
||||
}
|
||||
}, multiPrint() {
|
||||
},
|
||||
multiPrintNew() {
|
||||
var params = {
|
||||
item: this.thisItemSelected.val,
|
||||
file: this.thisFilesSelected.val,
|
||||
@@ -601,8 +602,81 @@
|
||||
//list = this.data_table.selected.map(x => x.num);
|
||||
|
||||
list = this.data_table.selected
|
||||
.sort((a, b) => a.print_id.localeCompare(b.print_id))
|
||||
.map(x => x.num);
|
||||
.sort((a, b) => (a.print_id == null ? "" : a.print_id).localeCompare(b.print_id == null ? "" : b.print_id))
|
||||
.map(x => x.num);
|
||||
|
||||
//console.log("what:",list);
|
||||
|
||||
if (list.length > 0) {
|
||||
// 記錄已列印
|
||||
let _url = HTTP_HOST + 'api/order/printMultiFileLog';
|
||||
axios.post(_url, list, { params: params })
|
||||
.then(response => {
|
||||
for (let i = 0; i < this.data_table.selected.length; i++) {
|
||||
for (let j = 0; i < this.data_table.editFilesItem.length; j++) {
|
||||
if (this.data_table.selected[i].num == this.data_table.editFilesItem[j].num) {
|
||||
this.data_table.editFilesItem[j].isPrinted = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.log(error)
|
||||
|
||||
})
|
||||
// 送出列印
|
||||
_url = HTTP_HOST + 'admin/print/print_multi_new.aspx';
|
||||
var form = document.createElement("form");
|
||||
form.method = "POST";
|
||||
form.action = _url;
|
||||
form.target = "_blank"; // Open the result in a new tab
|
||||
|
||||
// Helper function to add hidden fields
|
||||
const addHiddenField = (name, value) => {
|
||||
const hiddenField = document.createElement("input");
|
||||
hiddenField.type = "hidden";
|
||||
hiddenField.name = name;
|
||||
hiddenField.value = value;
|
||||
form.appendChild(hiddenField);
|
||||
};
|
||||
|
||||
// Add form fields
|
||||
console.log(this.thisItemSelected.val, this.thisFilesSelected.val, JSON.stringify(list));
|
||||
addHiddenField("item", this.thisItemSelected.val);
|
||||
addHiddenField("file", this.thisFilesSelected.val);
|
||||
addHiddenField("list", JSON.stringify(list));
|
||||
addHiddenField("title", `${this.thisItemSelected.text} / ${this.thisFilesSelected.text}`);
|
||||
//console.log("底家:",this.data_table.selected);
|
||||
localStorage.setItem("item", this.thisItemSelected.val);
|
||||
localStorage.setItem("list", JSON.stringify(this.data_table.selected));
|
||||
|
||||
|
||||
|
||||
document.body.appendChild(form); // Not entirely sure if this is necessary
|
||||
form.submit();
|
||||
document.body.removeChild(form);
|
||||
}
|
||||
else {
|
||||
this.snackbar.text = "未選擇列印項目";
|
||||
this.snackbar.show = true
|
||||
}
|
||||
},
|
||||
multiPrint() {
|
||||
var params = {
|
||||
item: this.thisItemSelected.val,
|
||||
file: this.thisFilesSelected.val,
|
||||
//list: this.data_table.selected.map(x => x.num)
|
||||
};
|
||||
|
||||
var list = [];
|
||||
//list = this.data_table.selected.map(x => x.num);
|
||||
|
||||
list = this.data_table.selected
|
||||
.sort((a, b) => (a.print_id==null?"":a.print_id).localeCompare(b.print_id==null?"":b.print_id))
|
||||
.map(x => x.num);
|
||||
|
||||
//console.log("what:",list);
|
||||
|
||||
if (list.length > 0) {
|
||||
// 記錄已列印
|
||||
@@ -638,11 +712,15 @@
|
||||
form.appendChild(hiddenField);
|
||||
};
|
||||
|
||||
// Add form fields
|
||||
// Add form fields
|
||||
console.log(this.thisItemSelected.val, this.thisFilesSelected.val,JSON.stringify(list));
|
||||
addHiddenField("item", this.thisItemSelected.val);
|
||||
addHiddenField("file", this.thisFilesSelected.val);
|
||||
addHiddenField("list", JSON.stringify(list));
|
||||
addHiddenField("title", `${this.thisItemSelected.text} / ${this.thisFilesSelected.text}`);
|
||||
addHiddenField("title", `${this.thisItemSelected.text} / ${this.thisFilesSelected.text}`);
|
||||
//console.log("底家:",this.data_table.selected);
|
||||
localStorage.setItem("item", this.thisItemSelected.val);
|
||||
localStorage.setItem("list", JSON.stringify(this.data_table.selected));
|
||||
|
||||
/*
|
||||
var hiddenField = document.createElement("input");
|
||||
@@ -1199,6 +1277,12 @@
|
||||
@click="multiPrint">
|
||||
列印<v-icon dark>mdi-turn-right</v-icon>
|
||||
</v-btn>
|
||||
<v-btn
|
||||
color="primary"
|
||||
class="ml-2 white--text"
|
||||
@click="multiPrintNew">
|
||||
列印(New)<v-icon dark>mdi-turn-right</v-icon>
|
||||
</v-btn>
|
||||
</div>
|
||||
</v-toolbar>
|
||||
</template>
|
||||
|
||||
@@ -0,0 +1,868 @@
|
||||
<template>
|
||||
<v-container>
|
||||
<v-card>
|
||||
<v-card-title class="bg-warning white--text text-center">
|
||||
<h5 class="mb-0">餘額核銷 - 處理剩餘金額</h5>
|
||||
<button class="btn btn-default ms-auto"><i class="mdi mdi-close"></i></button>
|
||||
</v-card-title>
|
||||
<v-card-text>
|
||||
<v-data-table :headers="headers"
|
||||
:items="items"
|
||||
:loading="loading"
|
||||
loading-text="載入中..."
|
||||
class="elevation-1 balance-reconcile-table"
|
||||
item-key="id">
|
||||
<template v-slot:item.follower="{ item }">
|
||||
<div>
|
||||
<div class="font-weight-bold">
|
||||
<a :href="`../follower/reg.aspx?num=${item.f_num}`"
|
||||
target="_blank"
|
||||
class="text-decoration-none"
|
||||
:title="`查看 ${item.follower} 的詳細資料`">
|
||||
{{ item.follower }}
|
||||
<v-icon small color="primary" class="ml-1">mdi-open-in-new</v-icon>
|
||||
</a>
|
||||
</div>
|
||||
<div class="caption text--secondary" v-if="item.phone">
|
||||
{{ item.phone }}
|
||||
</div>
|
||||
<div class="caption text--secondary" v-if="item.phone2">
|
||||
{{ item.phone2 }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.bank_info="{ item }">
|
||||
<div>
|
||||
<div class="font-weight-bold">{{ item.acc_name }}</div>
|
||||
<div class="caption text--secondary">{{ item.check_date | date }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.amount_info="{ item }">
|
||||
<div>
|
||||
<div class="font-weight-bold text-primary">
|
||||
已入帳:{{ item.check_amount }}
|
||||
</div>
|
||||
<div class="text-success">
|
||||
已沖帳:{{ item.check_amount - item.remain_amount }}
|
||||
</div>
|
||||
<div class="text-warning font-weight-bold">
|
||||
待核銷:{{ item.remain_amount }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.detail_info="{ item }">
|
||||
<v-btn color="info"
|
||||
outlined
|
||||
@click="showDetailDialog(item)">
|
||||
<v-icon small class="mr-1">mdi-information-outline</v-icon>
|
||||
詳細
|
||||
</v-btn>
|
||||
</template>
|
||||
<!-- 選取項目欄位 -->
|
||||
<template v-slot:item.select_items="{ item }">
|
||||
<div style="min-width: 200px;">
|
||||
<v-text-field v-model="item.selected_items_text"
|
||||
placeholder="項目名稱"
|
||||
dense
|
||||
outlined
|
||||
readonly
|
||||
hide-details
|
||||
style="font-size: 12px;">
|
||||
<template v-slot:append>
|
||||
<v-btn small
|
||||
color="primary"
|
||||
icon
|
||||
@click="showItemSelectDialog(item)"
|
||||
style="margin-right: -8px;">
|
||||
<v-icon small>mdi-table</v-icon>
|
||||
</v-btn>
|
||||
</template>
|
||||
</v-text-field>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<!-- 狀態與操作欄位 -->
|
||||
<template v-slot:item.status_action="{ item }">
|
||||
<div style="min-width: 280px;">
|
||||
<v-row no-gutters>
|
||||
<v-col cols="6" class="pr-1">
|
||||
<v-select v-model="item.new_status"
|
||||
:items="statusOptions"
|
||||
dense
|
||||
outlined
|
||||
hide-details
|
||||
placeholder="狀態"
|
||||
style="font-size: 12px;"></v-select>
|
||||
</v-col>
|
||||
<v-col cols="6" class="pl-1">
|
||||
<v-btn color="primary"
|
||||
block
|
||||
@click="processBalance(item)"
|
||||
:disabled="!canUpdate(item)">
|
||||
更新狀態
|
||||
</v-btn>
|
||||
</v-col>
|
||||
</v-row>
|
||||
<v-row no-gutters class="mt-2">
|
||||
<v-col cols="12">
|
||||
<v-text-field v-model="item.verify_note"
|
||||
dense
|
||||
outlined
|
||||
hide-details
|
||||
placeholder="核對記錄"
|
||||
style="font-size: 12px;"></v-text-field>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</div>
|
||||
</template>
|
||||
</v-data-table>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
|
||||
|
||||
<!-- 餘額處理對話框 -->
|
||||
<v-dialog v-model="dialog.show" max-width="800px">
|
||||
<v-card>
|
||||
<v-card-title class="grey lighten-2">
|
||||
<v-icon color="warning" class="mr-2">mdi-cash-multiple</v-icon>
|
||||
餘額處理
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn icon @click="dialog.show = false">
|
||||
<v-icon>mdi-close</v-icon>
|
||||
</v-btn>
|
||||
</v-card-title>
|
||||
|
||||
<v-card-text class="pb-0">
|
||||
<div v-if="dialog.selected">
|
||||
<v-row class="my-3">
|
||||
<v-col cols="12" md="6">
|
||||
<div class="mb-2">
|
||||
<span class="font-weight-bold">信眾:</span>
|
||||
{{ dialog.selected.follower }}
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<span class="font-weight-bold">入帳銀行:</span>
|
||||
{{ dialog.selected.acc_name }}
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<span class="font-weight-bold">入帳日期:</span>
|
||||
{{ dialog.selected.check_date | date }}
|
||||
</div>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<div class="mb-2">
|
||||
<span class="font-weight-bold">入帳金額:</span>
|
||||
<span class="text-primary">{{ dialog.selected.check_amount | currency }}</span>
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<span class="font-weight-bold">剩餘金額:</span>
|
||||
<span class="text-warning font-weight-bold">{{ dialog.selected.remain_amount | currency }}</span>
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<span class="font-weight-bold">狀態:</span>
|
||||
<v-chip small color="warning" text-color="white">
|
||||
{{ getStatusText(dialog.selected.check_status) }}
|
||||
</v-chip>
|
||||
</div>
|
||||
</v-col>
|
||||
</v-row>
|
||||
|
||||
<!-- 歷史沖帳記錄 -->
|
||||
<v-divider class="my-3"></v-divider>
|
||||
<h6 class="mb-3">
|
||||
<v-icon color="info" class="mr-1">mdi-history</v-icon>
|
||||
歷史沖帳記錄
|
||||
</h6>
|
||||
<v-data-table :headers="dialog.historyHeaders"
|
||||
:items="dialog.historyItems"
|
||||
class="elevation-1 mb-4"
|
||||
hide-default-footer
|
||||
:disable-pagination="true"
|
||||
dense>
|
||||
<template v-slot:item.reconcile_amount="{ item }">
|
||||
<span>{{ item.reconcile_amount | currency }}</span>
|
||||
</template>
|
||||
<template v-slot:item.reconcile_date="{ item }">
|
||||
<span>{{ item.reconcile_date | date }}</span>
|
||||
</template>
|
||||
</v-data-table>
|
||||
|
||||
<!-- 餘額處理選項 -->
|
||||
<v-divider class="my-3"></v-divider>
|
||||
<h6 class="mb-3">
|
||||
<v-icon color="warning" class="mr-1">mdi-cash-multiple</v-icon>
|
||||
餘額處理方式
|
||||
</h6>
|
||||
<v-radio-group v-model="dialog.balanceAction" class="mt-0">
|
||||
<v-radio label="轉入下次活動"
|
||||
value="transfer"
|
||||
color="primary"></v-radio>
|
||||
<v-radio label="現金退費"
|
||||
value="refund_cash"
|
||||
color="success"></v-radio>
|
||||
<v-radio label="銀行轉帳退費"
|
||||
value="refund_bank"
|
||||
color="success"></v-radio>
|
||||
<v-radio label="結餘處理"
|
||||
value="balance_off"
|
||||
color="grey"></v-radio>
|
||||
</v-radio-group>
|
||||
|
||||
<!-- 處理說明 -->
|
||||
<v-textarea v-model="dialog.memo"
|
||||
label="處理說明"
|
||||
outlined
|
||||
rows="3"
|
||||
placeholder="請輸入處理說明..."
|
||||
class="mt-3"></v-textarea>
|
||||
</div>
|
||||
</v-card-text>
|
||||
|
||||
<v-card-actions class="pa-4">
|
||||
<div v-if="dialog.errorMessage" class="text-danger">
|
||||
❌ {{ dialog.errorMessage }}
|
||||
</div>
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn color="grey" text @click="dialog.show = false">取消</v-btn>
|
||||
<v-btn color="warning"
|
||||
@click="confirmBalance"
|
||||
:disabled="!dialog.balanceAction || dialog.loading"
|
||||
:loading="dialog.loading">
|
||||
確認處理
|
||||
</v-btn>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
|
||||
|
||||
|
||||
<!-- 詳細資訊對話框 -->
|
||||
<v-dialog v-model="detailDialog.show" max-width="900px">
|
||||
<v-card>
|
||||
<v-card-title class="grey lighten-2">
|
||||
<v-icon color="info" class="mr-2">mdi-information-outline</v-icon>
|
||||
詳細資訊
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn icon @click="detailDialog.show = false">
|
||||
<v-icon>mdi-close</v-icon>
|
||||
</v-btn>
|
||||
</v-card-title>
|
||||
|
||||
<v-tabs v-model="detailDialog.tab" background-color="grey lighten-4">
|
||||
<v-tab>
|
||||
<v-icon small class="mr-2">mdi-information</v-icon>
|
||||
基本資訊
|
||||
</v-tab>
|
||||
<v-tab>
|
||||
<v-icon small class="mr-2">mdi-table</v-icon>
|
||||
沖帳明細
|
||||
</v-tab>
|
||||
<v-tab>
|
||||
<v-icon small class="mr-2">mdi-image</v-icon>
|
||||
證明圖片
|
||||
</v-tab>
|
||||
</v-tabs>
|
||||
|
||||
<v-tabs-items v-model="detailDialog.tab">
|
||||
<!-- Tab 1: 基本資訊 -->
|
||||
<v-tab-item>
|
||||
<v-card-text>
|
||||
<div v-if="detailDialog.selected">
|
||||
<v-row>
|
||||
<v-col cols="12" md="6">
|
||||
<h6 class="mb-3 text-primary">
|
||||
<v-icon color="primary" small class="mr-1">mdi-account</v-icon>
|
||||
匯款人資訊
|
||||
</h6>
|
||||
<div class="mb-2">
|
||||
<span class="font-weight-bold">姓名:</span>
|
||||
{{ detailDialog.selected.name }}
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<span class="font-weight-bold">支付方式:</span>
|
||||
{{ payTypeText[detailDialog.selected.pay_type] || detailDialog.selected.pay_type }}
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<span class="font-weight-bold">帳號後5碼:</span>
|
||||
{{ detailDialog.selected.account_last5 || '-' }}
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<span class="font-weight-bold">支付型態:</span>
|
||||
{{ detailDialog.selected.pay_mode }}
|
||||
</div>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<h6 class="mb-3 text-success">
|
||||
<v-icon color="success" small class="mr-1">mdi-cash</v-icon>
|
||||
入帳資訊
|
||||
</h6>
|
||||
<div class="mb-2">
|
||||
<div class="font-weight-bold">{{ detailDialog.selected.acc_name }}</div>
|
||||
<div class="caption text--secondary">{{ detailDialog.selected.check_date | date }}</div>
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<span class="font-weight-bold text-primary">已入帳:{{ detailDialog.selected.check_amount }}</span>
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<span class="text-success">已沖帳:{{ detailDialog.selected.check_amount - detailDialog.selected.remain_amount }}</span>
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<span class="text-warning font-weight-bold">待核銷:{{ detailDialog.selected.remain_amount }}</span>
|
||||
</div>
|
||||
</v-col>
|
||||
</v-row>
|
||||
|
||||
<v-divider class="my-4"></v-divider>
|
||||
|
||||
<v-row>
|
||||
<v-col cols="12" md="6">
|
||||
<h6 class="mb-3 text-purple">
|
||||
<v-icon color="purple" small class="mr-1">mdi-calendar-check</v-icon>
|
||||
活動資訊
|
||||
</h6>
|
||||
<div class="mb-2">
|
||||
<span class="font-weight-bold">活動名稱:</span>
|
||||
{{ detailDialog.selected.activity_name || '-' }}
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<span class="font-weight-bold">開始日期:</span>
|
||||
{{ detailDialog.selected.activity_start_date | date }}
|
||||
</div>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<h6 class="mb-3 text-info">
|
||||
<v-icon color="info" small class="mr-1">mdi-clipboard-check</v-icon>
|
||||
核對記錄
|
||||
</h6>
|
||||
<div class="mb-2">
|
||||
<span class="font-weight-bold">核對記錄:</span>
|
||||
{{ detailDialog.selected.verify_note || '-' }}
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<span class="font-weight-bold">帳簿備註:</span>
|
||||
{{ detailDialog.selected.check_memo || '-' }}
|
||||
</div>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</div>
|
||||
</v-card-text>
|
||||
</v-tab-item>
|
||||
|
||||
<!-- Tab 2: 沖帳明細表格 -->
|
||||
<v-tab-item>
|
||||
<v-card-text>
|
||||
<div v-if="detailDialog.selected">
|
||||
<v-data-table :headers="detailDialog.reconcileHeaders"
|
||||
:items="detailDialog.reconcileItems"
|
||||
class="elevation-1"
|
||||
hide-default-footer
|
||||
:disable-pagination="true">
|
||||
<template v-slot:item.reconcile="{ item }">
|
||||
<span class="font-weight-bold text-success">{{ item.reconcile | currency }}</span>
|
||||
</template>
|
||||
<template v-slot:item.register_date="{ item }">
|
||||
<span>{{ item.register_date | date }}</span>
|
||||
</template>
|
||||
<template v-slot:item.price="{ item }">
|
||||
<span>{{ item.price | currency }}</span>
|
||||
</template>
|
||||
</v-data-table>
|
||||
</div>
|
||||
</v-card-text>
|
||||
</v-tab-item>
|
||||
|
||||
<!-- Tab 3: 證明圖片 -->
|
||||
<v-tab-item>
|
||||
<v-card-text>
|
||||
<div v-if="detailDialog.selected">
|
||||
<div v-if="detailDialog.selected.proof_img">
|
||||
<h6 class="mb-3 text-orange">
|
||||
<v-icon color="orange" small class="mr-1">mdi-image</v-icon>
|
||||
證明圖片
|
||||
</h6>
|
||||
<div class="text-center">
|
||||
<img :src="detailDialog.selected.proof_img"
|
||||
alt="證明圖片"
|
||||
style="max-width: 100%; max-height: 500px;"
|
||||
class="elevation-3" />
|
||||
</div>
|
||||
</div>
|
||||
<div v-else class="text-center py-5">
|
||||
<v-icon size="64" color="grey lighten-2">mdi-image-off</v-icon>
|
||||
<div class="mt-3 text--secondary">無證明圖片</div>
|
||||
</div>
|
||||
</div>
|
||||
</v-card-text>
|
||||
</v-tab-item>
|
||||
</v-tabs-items>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
|
||||
<!-- 活動品項選擇對話框 -->
|
||||
<v-dialog v-model="search_dialog.show" max-width="700px">
|
||||
<v-card>
|
||||
<v-card-title class="justify-space-between grey lighten-2">
|
||||
查詢:{{search_dialog.current.title}}
|
||||
<v-btn icon @click="search_dialog.show=false"><v-icon>mdi-close</v-icon></v-btn>
|
||||
</v-card-title>
|
||||
<v-card-text>
|
||||
<v-row>
|
||||
|
||||
<v-col v-for="item in search_dialog.current.keys"
|
||||
:cols="search_dialog.current.keys.length>1?6:12">
|
||||
<v-text-field v-model="item.value" :label="item.title" v-if="item.visible===undefined || item.visible==true "></v-text-field>
|
||||
</v-col>
|
||||
<v-col cols="12" sm="4" md="3">
|
||||
<v-checkbox v-model="search_is_reconcile"
|
||||
label="核銷項目"
|
||||
:true-value="'Y'"
|
||||
:false-value="''"
|
||||
hide-details
|
||||
@change="search_get"></v-checkbox>
|
||||
</v-col>
|
||||
<v-col cols="12" class="text-end">
|
||||
<v-btn color="primary" elevation="0" @click="search_get()">查詢</v-btn>
|
||||
<v-btn elevation="0" @click="search_clear()">清除條件</v-btn>
|
||||
</v-col>
|
||||
</v-row>
|
||||
<v-data-table :headers="search_headers()"
|
||||
:items="search_dialog.list"
|
||||
:footer-props="search_dialog.footer"
|
||||
:items-per-page="10"
|
||||
:server-items-length="search_dialog.count"
|
||||
:page.sync="search_dialog.page"
|
||||
:options.sync="options"
|
||||
@click:row="search_select"
|
||||
:loading="search_dialog.loading"></v-data-table>
|
||||
</v-card-text>
|
||||
<v-card-actions>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
</v-container>
|
||||
</template>
|
||||
<script>
|
||||
module.exports = {
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
headers: [
|
||||
{ text: '信眾', value: 'follower' },
|
||||
{ text: '入帳帳戶/日期', value: 'bank_info' },
|
||||
{ text: '金額', value: 'amount_info' },
|
||||
{ text: '詳細資訊', value: 'detail_info', sortable: false },
|
||||
{ text: '選取項目', value: 'select_items', sortable: false, width: '200px' },
|
||||
{ text: '狀態 | 核對記錄', value: 'status_action', sortable: false, width: '280px' }
|
||||
],
|
||||
items: [],
|
||||
dialog: {
|
||||
show: false,
|
||||
selected: null,
|
||||
balanceAction: null,
|
||||
memo: '',
|
||||
loading: false,
|
||||
errorMessage: '',
|
||||
historyHeaders: [
|
||||
{ text: '法會', value: 'activity_name' },
|
||||
{ text: '項目', value: 'item_name' },
|
||||
{ text: '沖帳金額', value: 'reconcile_amount' },
|
||||
{ text: '沖帳日期', value: 'reconcile_date' }
|
||||
],
|
||||
historyItems: [
|
||||
{
|
||||
activity_name: '2025新春法會',
|
||||
item_name: '護持金',
|
||||
reconcile_amount: 12000,
|
||||
reconcile_date: '2025-01-15T00:00:00'
|
||||
}
|
||||
]
|
||||
},
|
||||
detailDialog: {
|
||||
show: false,
|
||||
selected: null,
|
||||
tab: 0,
|
||||
reconcileHeaders: [
|
||||
{ text: '法會活動', value: 'activity_name' },
|
||||
{ text: '報名項目', value: 'actitem_name' },
|
||||
{ text: '原始金額', value: 'price' },
|
||||
{ text: '沖帳金額', value: 'reconcile' },
|
||||
{ text: '報名日期', value: 'register_date' },
|
||||
{ text: '訂單編號', value: 'order_no' }
|
||||
],
|
||||
reconcileItems: []
|
||||
},
|
||||
statusOptions: [
|
||||
{ text: '沖帳有剩餘', value: '90' },
|
||||
{ text: '未聯絡', value: '91' },
|
||||
{ text: '已聯絡', value: '92' },
|
||||
{ text: '餘額核銷', value: '95' }
|
||||
],
|
||||
search_dialog: {
|
||||
controls: {
|
||||
search5: {
|
||||
id: 'search5',
|
||||
title: '活動品項',
|
||||
text_prop: 'subject',
|
||||
value_prop: 'num',
|
||||
keys: [
|
||||
{ id: 'subject', title: '項目名稱', value: '' },
|
||||
{ id: 'kindTxt', title: '項目分類' },
|
||||
{ id: 'num', visible: false },
|
||||
],
|
||||
api_url: '../../api/activity/GetOrderList',
|
||||
columns: [
|
||||
{ id: 'subject', title: '項目名稱' },
|
||||
{ id: 'kindTxt', title: '項目分類' },
|
||||
{ id: 'price', title: '價格' },
|
||||
],
|
||||
selected: {},
|
||||
currentRow: null, // 儲存當前正在編輯的行
|
||||
select(vueInstance, selectedItem) {
|
||||
// 當選擇項目時的處理邏輯
|
||||
if (this.currentRow) {
|
||||
// 將選中的 actItem 的 num 儲存到 balance_act_item 欄位
|
||||
this.currentRow.balance_act_item = selectedItem.num;
|
||||
// 顯示項目名稱給用戶看
|
||||
this.currentRow.selected_items_text = selectedItem.subject;
|
||||
// 如果有價格,也可以顯示
|
||||
if (selectedItem.price) {
|
||||
this.currentRow.selected_items_text += ` (NT$${Number(selectedItem.price).toLocaleString()})`;
|
||||
}
|
||||
console.log('已選擇項目:', selectedItem.subject, '項目編號:', selectedItem.num);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
show: false,
|
||||
current: {},
|
||||
list: [],
|
||||
count: 0,
|
||||
page: 1,
|
||||
loading: false,
|
||||
footer: {
|
||||
showFirstLastPage: true,
|
||||
disableItemsPerPage: true,
|
||||
itemsPerPageAllText: '',
|
||||
itemsPerPageText: '',
|
||||
},
|
||||
},
|
||||
options: {},
|
||||
payTypeText: {
|
||||
1: '現金',
|
||||
2: '匯款',
|
||||
3: '支票'
|
||||
},
|
||||
search_is_reconcile: "Y",
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.loadTableData();
|
||||
this.search_dialog.current = this.search_dialog.controls.search5; // 設定預設搜尋控制項
|
||||
},
|
||||
filters: {
|
||||
currency(val) {
|
||||
if (!val) return '0';
|
||||
return Number(val).toLocaleString();
|
||||
},
|
||||
date(val) {
|
||||
if (!val) return '';
|
||||
const date = new Date(val);
|
||||
return date.toLocaleDateString();
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// 使用全域 DraftUtils 工具函數
|
||||
loadTableData() {
|
||||
this.loading = true;
|
||||
axios.get('../../api/transfer_register/balance_reconcile_list')
|
||||
.then(res => {
|
||||
this.items = res.data.map(item => ({
|
||||
...item,
|
||||
// 初始化表單欄位
|
||||
selected_items_text: item.balance_act_item ? (item.balance_actitem_name || '已選擇項目') : '', // 如果已有選中項目,顯示項目名稱
|
||||
new_status: item.check_status,
|
||||
balance_act_item: item.balance_act_item, // 保持現有的選中項目
|
||||
verify_note: item.verify_note || '' // 初始化核對記錄欄位
|
||||
}));
|
||||
})
|
||||
.catch(err => {
|
||||
console.error('載入資料失敗:', err);
|
||||
alert('載入資料失敗,請重新整理頁面');
|
||||
this.items = [];
|
||||
})
|
||||
.finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
getStatusColor(status) {
|
||||
switch (status) {
|
||||
case '90': return 'warning';
|
||||
case '99': return 'success';
|
||||
default: return 'grey';
|
||||
}
|
||||
},
|
||||
getStatusText(status) {
|
||||
switch (status) {
|
||||
case '90': return '沖帳有剩餘';
|
||||
case '91': return '未聯絡';
|
||||
case '92': return '已聯絡';
|
||||
case '95': return '餘額核銷';
|
||||
case '99': return '沖帳完成';
|
||||
default: return '未知狀態';
|
||||
}
|
||||
},
|
||||
showBalanceDialog(item) {
|
||||
this.dialog.selected = item;
|
||||
this.dialog.balanceAction = null;
|
||||
this.dialog.memo = '';
|
||||
this.dialog.errorMessage = '';
|
||||
this.dialog.show = true;
|
||||
|
||||
// 載入歷史記錄
|
||||
if (item.draft) {
|
||||
const detailItems = window.DraftUtils.getDraftField(item.draft, 'pro_order_detail_items');
|
||||
if (detailItems && Array.isArray(detailItems)) {
|
||||
this.dialog.historyItems = detailItems.map(item => ({
|
||||
activity_name: item.activity_name || '未知活動',
|
||||
item_name: item.actitem_name || '未知項目',
|
||||
reconcile_amount: item.reconcile || 0,
|
||||
reconcile_date: item.register_date || '2025-01-15T00:00:00'
|
||||
}));
|
||||
} else {
|
||||
this.dialog.historyItems = [];
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
confirmBalance() {
|
||||
if (!this.dialog.balanceAction) {
|
||||
this.dialog.errorMessage = '請選擇處理方式';
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.dialog.memo.trim()) {
|
||||
this.dialog.errorMessage = '請輸入處理說明';
|
||||
return;
|
||||
}
|
||||
|
||||
this.dialog.loading = true;
|
||||
this.dialog.errorMessage = '';
|
||||
|
||||
// 模擬 API 調用
|
||||
setTimeout(() => {
|
||||
alert(`餘額處理完成:${this.getActionText(this.dialog.balanceAction)}`);
|
||||
this.dialog.show = false;
|
||||
this.dialog.loading = false;
|
||||
// 這裡之後會重新載入資料
|
||||
}, 1500);
|
||||
},
|
||||
getActionText(action) {
|
||||
switch (action) {
|
||||
case 'transfer': return '轉入下次活動';
|
||||
case 'refund_cash': return '現金退費';
|
||||
case 'refund_bank': return '銀行轉帳退費';
|
||||
case 'balance_off': return '結餘處理';
|
||||
default: return '未知操作';
|
||||
}
|
||||
},
|
||||
showDetailDialog(item) {
|
||||
this.detailDialog.selected = item;
|
||||
this.detailDialog.tab = 0; // 重置到第一個tab
|
||||
|
||||
// 解析沖帳明細 JSON 並轉為表格資料
|
||||
this.loadReconcileItems(item.draft, item.id);
|
||||
|
||||
this.detailDialog.show = true;
|
||||
},
|
||||
async loadReconcileItems(draft, transferRegisterId) {
|
||||
this.detailDialog.reconcileItems = [];
|
||||
|
||||
if (!draft) return;
|
||||
|
||||
const detailItems = window.DraftUtils.getDraftField(draft, 'pro_order_detail_items');
|
||||
if (detailItems && Array.isArray(detailItems)) {
|
||||
// 使用新格式的 pro_order_detail_items
|
||||
this.detailDialog.reconcileItems = detailItems.map((item, index) => {
|
||||
return {
|
||||
pro_order_detail_num: item.pro_order_detail_num,
|
||||
activity_name: item.activity_name || '未知活動',
|
||||
actitem_name: item.actitem_name || '未知項目',
|
||||
price: item.price || 0,
|
||||
reconcile: item.reconcile,
|
||||
register_date: item.register_date,
|
||||
order_no: item.order_no || ''
|
||||
};
|
||||
});
|
||||
} else {
|
||||
// 如果沒有詳細資料,嘗試使用 API 取得資料
|
||||
try {
|
||||
const response = await axios.get(`../../api/transfer_register/reconcile_detail?transfer_register_id=${transferRegisterId}`);
|
||||
this.detailDialog.reconcileItems = response.data;
|
||||
} catch (error) {
|
||||
console.error('載入沖帳明細失敗:', error);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
search_show(curr) {
|
||||
this.search_dialog.current = curr;
|
||||
this.search_clear();
|
||||
this.search_dialog.show = true;
|
||||
},
|
||||
search_clear() {
|
||||
if (!this.search_dialog.current.keys) return;
|
||||
this.search_dialog.current.keys.forEach((t, i) => { t.value = '' });
|
||||
this.search_get();
|
||||
},
|
||||
search_get() {
|
||||
if (!this.search_dialog.current.keys) return;
|
||||
let api_url = this.search_dialog.current.api_url;
|
||||
let keys = this.search_dialog.current.keys;
|
||||
|
||||
this.search_dialog.page = this.options.page ?? 1;
|
||||
let params = { page: this.search_dialog.page, pageSize: 10 };
|
||||
var search = {};
|
||||
keys.forEach((t, i) => {
|
||||
search[t.id] = t.value;
|
||||
});
|
||||
|
||||
// 只有活動品項 Dialog 查詢時才帶 is_reconcile
|
||||
if (this.search_dialog.current.id === 'search5' && this.search_is_reconcile === 'Y') {
|
||||
search.is_reconcile = 'Y';
|
||||
}
|
||||
|
||||
console.log("search_get", api_url, search, params, this.options);
|
||||
this.search_dialog.loading = true;
|
||||
|
||||
axios.post(api_url, search, { params: params })
|
||||
.then(response => {
|
||||
this.search_dialog.list = response.data.list;
|
||||
this.search_dialog.count = response.data.count;
|
||||
this.search_dialog.loading = false;
|
||||
})
|
||||
.catch(error => {
|
||||
console.log(error);
|
||||
this.search_dialog.list = [];
|
||||
this.search_dialog.count = 0;
|
||||
this.search_dialog.loading = false;
|
||||
alert("錯誤:" + error);
|
||||
});
|
||||
},
|
||||
search_headers() {
|
||||
if (!this.search_dialog.current.columns) return;
|
||||
let r = [];
|
||||
this.search_dialog.current.columns.forEach((t, i) => {
|
||||
r.push({
|
||||
text: t.title,
|
||||
width: t.width,
|
||||
align: 'start',
|
||||
sortable: false,
|
||||
value: t.id,
|
||||
});
|
||||
});
|
||||
return r;
|
||||
},
|
||||
search_select(row) {
|
||||
let curr = this.search_dialog.current;
|
||||
curr.selected = row;
|
||||
|
||||
if (curr.select instanceof Function) {
|
||||
curr.select(this, row);
|
||||
}
|
||||
this.search_dialog.show = false;
|
||||
console.log('Selected row:', row);
|
||||
},
|
||||
showItemSelectDialog(item) {
|
||||
// 設定當前正在編輯的行
|
||||
this.search_dialog.controls.search5.currentRow = item;
|
||||
this.search_dialog.current = this.search_dialog.controls.search5;
|
||||
this.search_is_reconcile = "Y"; // 預設勾選
|
||||
this.search_clear();
|
||||
this.search_get(); // Dialog 一打開就查詢
|
||||
this.search_dialog.show = true;
|
||||
},
|
||||
processBalance(item) {
|
||||
if (!item.new_status) {
|
||||
alert('請選擇狀態');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!item.balance_act_item) {
|
||||
alert('請先選擇項目');
|
||||
return;
|
||||
}
|
||||
|
||||
// 準備更新資料
|
||||
const updateData = {
|
||||
id: item.id,
|
||||
check_status: item.new_status,
|
||||
balance_act_item: item.balance_act_item,
|
||||
verify_note: item.verify_note || ''
|
||||
};
|
||||
|
||||
// 發送到後端更新
|
||||
axios.post('../../api/transfer_register/update_balance', updateData)
|
||||
.then(response => {
|
||||
const statusText = this.statusOptions.find(opt => opt.value === item.new_status)?.text || '';
|
||||
alert(`核銷餘額處理完成\n信眾:${item.follower}\n狀態:${statusText}\n項目:${item.selected_items_text}`);
|
||||
|
||||
// 如果狀態是「餘額核銷」(95),則從表格中移除該列
|
||||
if (item.new_status === '95') {
|
||||
const index = this.items.findIndex(i => i.id === item.id);
|
||||
if (index !== -1) {
|
||||
this.items.splice(index, 1);
|
||||
}
|
||||
} else {
|
||||
// 如果狀態不是「餘額核銷」,則只更新該列的狀態
|
||||
const index = this.items.findIndex(i => i.id === item.id);
|
||||
if (index !== -1) {
|
||||
this.items[index].check_status = item.new_status;
|
||||
this.items[index].verify_note = item.verify_note || '';
|
||||
this.items[index].balance_act_item = item.balance_act_item;
|
||||
// 確保 selected_items_text 也得到更新
|
||||
this.items[index].selected_items_text = item.selected_items_text;
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('更新失敗:', error);
|
||||
alert('更新失敗,請重試');
|
||||
});
|
||||
},
|
||||
canUpdate(item) {
|
||||
// 所有狀態都必須選取項目才可按
|
||||
if (!item.balance_act_item) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 狀態為「餘額核銷」時,必須選取項目才可按
|
||||
if (item.new_status === '95') {
|
||||
return true;
|
||||
}
|
||||
// 狀態為「未聯絡」或「已聯絡」時,皆可按
|
||||
if (item.new_status === '91' || item.new_status === '92') {
|
||||
return true;
|
||||
}
|
||||
// 其他狀態不可按
|
||||
return false;
|
||||
},
|
||||
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.code-textarea textarea {
|
||||
font-family: 'Courier New', monospace !important;
|
||||
font-size: 12px !important;
|
||||
}
|
||||
/* 增加表格每列高度,讓內容不擁擠 */
|
||||
.v-data-table.balance-reconcile-table .v-data-table__wrapper tr {
|
||||
}
|
||||
|
||||
.v-data-table.balance-reconcile-table .v-data-table__wrapper td {
|
||||
min-height: 110px !important;
|
||||
height: 110px !important;
|
||||
vertical-align: middle !important;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,300 @@
|
||||
<template>
|
||||
<v-container>
|
||||
<v-card>
|
||||
<v-card-title class="bg-info white--text text-center">
|
||||
<h5 class="mb-0">餘額核銷查詢</h5>
|
||||
<button class="btn btn-default ms-auto"><i class="mdi mdi-close"></i></button>
|
||||
</v-card-title>
|
||||
<v-card-text>
|
||||
<v-row class="mb-0 mt-4">
|
||||
<v-col cols="12" md="2">
|
||||
<v-text-field v-model="query.start_date" label="起始日" type="date" dense outlined></v-text-field>
|
||||
</v-col>
|
||||
<v-col cols="12" md="2">
|
||||
<v-text-field v-model="query.end_date" label="結束日" type="date" dense outlined></v-text-field>
|
||||
</v-col>
|
||||
<v-col cols="12" md="3">
|
||||
<v-text-field v-model="query.activity_name" label="法會" dense outlined readonly>
|
||||
<template v-slot:append>
|
||||
<v-btn icon @click="showActivityDialog"><v-icon>mdi-magnify</v-icon></v-btn>
|
||||
</template>
|
||||
</v-text-field>
|
||||
</v-col>
|
||||
<v-col cols="12" md="3">
|
||||
<v-text-field v-model="query.follower_name" label="信眾" dense outlined readonly>
|
||||
<template v-slot:append>
|
||||
<v-btn icon @click="showFollowerDialog"><v-icon>mdi-magnify</v-icon></v-btn>
|
||||
</template>
|
||||
</v-text-field>
|
||||
</v-col>
|
||||
<v-col cols="12" md="2" class="d-flex justify-end">
|
||||
<v-btn color="primary" class="mr-2" @click="search">查詢</v-btn>
|
||||
<v-btn color="grey" @click="reset">重設</v-btn>
|
||||
</v-col>
|
||||
</v-row>
|
||||
<v-data-table :headers="headers"
|
||||
:items="items"
|
||||
:loading="loading"
|
||||
loading-text="載入中..."
|
||||
class="elevation-1 balance-reconcile-table"
|
||||
item-key="id"
|
||||
:footer-props="{ 'items-per-page-options': [10, 20, 50] }">
|
||||
<template v-slot:item.follower="{ item }">
|
||||
<div>
|
||||
<div class="font-weight-bold">{{ item.follower }}</div>
|
||||
<div class="caption text--secondary" v-if="item.phone">{{ item.phone }}</div>
|
||||
<div class="caption text--secondary" v-if="item.phone2">{{ item.phone2 }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.bank_info="{ item }">
|
||||
<div>
|
||||
<div class="font-weight-bold">{{ item.acc_name }}</div>
|
||||
<div class="caption text--secondary">{{ item.check_date | date }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.amount_info="{ item }">
|
||||
<div>
|
||||
<div class="font-weight-bold text-primary">入帳金額:{{ item.check_amount || 0 }}</div>
|
||||
<div class="text-success">核銷金額:{{ (item.remain_amount || 0) }}</div>
|
||||
<!-- 狀態95不會有待核銷,不顯示這一行 -->
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.remain_amount="{ item }">
|
||||
<div class="text-success">{{ item.remain_amount || 0 }}</div>
|
||||
</template>
|
||||
<template v-slot:item.select_items="{ item }">
|
||||
<div style="min-width: 120px;">
|
||||
{{ item.balance_actitem_name || '未選擇項目' }}
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.detail_info="{ item }">
|
||||
<v-btn color="info" outlined @click="showDetailDialog(item)">
|
||||
<v-icon small class="mr-1">mdi-information-outline</v-icon> 詳細
|
||||
</v-btn>
|
||||
</template>
|
||||
<template v-slot:item.verify_note="{ item }">
|
||||
<div style="white-space: pre-line;">{{ item.verify_note }}</div>
|
||||
</template>
|
||||
<template v-slot:item.check_date="{ item }">
|
||||
<span>{{ item.check_date | date }}</span>
|
||||
</template>
|
||||
</v-data-table>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
|
||||
<!-- 法會選取 Dialog -->
|
||||
<v-dialog v-model="activityDialog.show" max-width="700px">
|
||||
<v-card>
|
||||
<v-card-title class="grey lighten-2">
|
||||
<v-icon color="primary" class="mr-2">mdi-table</v-icon>
|
||||
選擇法會
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn icon @click="activityDialog.show = false"><v-icon>mdi-close</v-icon></v-btn>
|
||||
</v-card-title>
|
||||
<v-card-text class="mt-4">
|
||||
<v-text-field v-model="activityDialog.search" label="搜尋法會" dense outlined @keyup.enter="searchActivity"></v-text-field>
|
||||
<v-data-table :headers="activityDialog.headers"
|
||||
:items="activityDialog.items"
|
||||
:loading="activityDialog.loading"
|
||||
item-key="num"
|
||||
class="elevation-1 mt-2"
|
||||
@click:row="selectActivity"
|
||||
hide-default-footer></v-data-table>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
|
||||
<!-- 信眾選取 Dialog -->
|
||||
<v-dialog v-model="followerDialog.show" max-width="700px">
|
||||
<v-card>
|
||||
<v-card-title class="grey lighten-2">
|
||||
<v-icon color="primary" class="mr-2">mdi-account</v-icon>
|
||||
選擇信眾
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn icon @click="followerDialog.show = false"><v-icon>mdi-close</v-icon></v-btn>
|
||||
</v-card-title>
|
||||
<v-card-text class="mt-4">
|
||||
<v-text-field v-model="followerDialog.search" label="搜尋信眾" dense outlined @keyup.enter="searchFollower"></v-text-field>
|
||||
<v-data-table :headers="followerDialog.headers"
|
||||
:items="followerDialog.items"
|
||||
:loading="followerDialog.loading"
|
||||
item-key="num"
|
||||
class="elevation-1 mt-2"
|
||||
@click:row="selectFollower"
|
||||
hide-default-footer></v-data-table>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
|
||||
<!-- 詳細資訊對話框 -->
|
||||
<v-dialog v-model="dialog.show" max-width="900px">
|
||||
<v-card>
|
||||
<v-card-title class="grey lighten-2">
|
||||
<v-icon color="info" class="mr-2">mdi-information-outline</v-icon>
|
||||
詳細資訊
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn icon @click="dialog.show = false">
|
||||
<v-icon>mdi-close</v-icon>
|
||||
</v-btn>
|
||||
</v-card-title>
|
||||
<v-card-text>
|
||||
<div v-if="dialog.selected">
|
||||
<v-row>
|
||||
<v-col cols="12" md="6">
|
||||
<h6 class="mb-3 text-primary">匯款人資訊</h6>
|
||||
<div class="mb-2"><span class="font-weight-bold">姓名:</span>{{ dialog.selected.name }}</div>
|
||||
<div class="mb-2"><span class="font-weight-bold">電話:</span>{{ dialog.selected.phone }}</div>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<h6 class="mb-3 text-success">入帳資訊</h6>
|
||||
<div class="mb-2"><span class="font-weight-bold">入帳帳戶:</span>{{ dialog.selected.acc_name }}</div>
|
||||
<div class="mb-2"><span class="font-weight-bold">入帳日期:</span>{{ dialog.selected.check_date | date }}</div>
|
||||
<div class="mb-2"><span class="font-weight-bold">入帳金額:</span>{{ dialog.selected.check_amount }}</div>
|
||||
</v-col>
|
||||
</v-row>
|
||||
<v-divider class="my-4"></v-divider>
|
||||
<v-row>
|
||||
<v-col cols="12" md="6">
|
||||
<h6 class="mb-3 text-purple">活動資訊</h6>
|
||||
<div class="mb-2"><span class="font-weight-bold">活動名稱:</span>{{ dialog.selected.activity_name || '-' }}</div>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<h6 class="mb-3 text-info">核對記錄</h6>
|
||||
<div class="mb-2"><span class="font-weight-bold">核對記錄:</span>{{ dialog.selected.verify_note || '-' }}</div>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</div>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
</v-container>
|
||||
</template>
|
||||
|
||||
<style>
|
||||
.v-data-table.balance-reconcile-table .v-data-table__wrapper tbody tr {
|
||||
min-height: 90px !important;
|
||||
height: 90px !important;
|
||||
}
|
||||
|
||||
.v-data-table.balance-reconcile-table .v-data-table__wrapper tbody td {
|
||||
min-height: 90px !important;
|
||||
height: 90px !important;
|
||||
vertical-align: middle !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
module.exports = {
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
query: {
|
||||
start_date: '',
|
||||
end_date: '',
|
||||
activity_num: '',
|
||||
activity_name: '',
|
||||
follower_num: '',
|
||||
follower_name: ''
|
||||
},
|
||||
headers: [
|
||||
{ text: '信眾', value: 'follower' },
|
||||
{ text: '入帳帳戶/日期', value: 'bank_info' },
|
||||
{ text: '核銷日期', value: 'check_date', sortable: true, width: '120px' },
|
||||
{ text: '核銷項目', value: 'select_items', sortable: false, width: '120px' },
|
||||
{ text: '核銷金額', value: 'reconcile_amount', sortable: false, width: '120px' },
|
||||
{ text: '詳細資訊', value: 'detail_info', sortable: false },
|
||||
// { text: '狀態', value: 'status', sortable: false, width: '100px' }, // 移除狀態欄
|
||||
{ text: '核對記錄', value: 'verify_note', sortable: false, width: '180px' },
|
||||
],
|
||||
items: [],
|
||||
dialog: {
|
||||
show: false,
|
||||
selected: null
|
||||
},
|
||||
activityDialog: {
|
||||
show: false,
|
||||
search: '',
|
||||
loading: false,
|
||||
items: [],
|
||||
headers: [
|
||||
{ text: '編號', value: 'num' },
|
||||
{ text: '名稱', value: 'subject' }
|
||||
]
|
||||
},
|
||||
followerDialog: {
|
||||
show: false,
|
||||
search: '',
|
||||
loading: false,
|
||||
items: [],
|
||||
headers: [
|
||||
{ text: '編號', value: 'num' },
|
||||
{ text: '姓名', value: 'u_name' }
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
filters: {
|
||||
date(val) {
|
||||
if (!val) return '';
|
||||
const date = new Date(val);
|
||||
return date.toLocaleDateString();
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// 使用全域 DraftUtils 工具函數
|
||||
search() {
|
||||
this.loading = true;
|
||||
// 串接查詢 API,帶入所有查詢條件
|
||||
axios.get('../../api/transfer_register/balance_reconcile_query', { params: this.query })
|
||||
.then(res => { this.items = res.data; })
|
||||
.catch(() => { this.items = []; })
|
||||
.finally(() => { this.loading = false; });
|
||||
},
|
||||
reset() {
|
||||
this.query.start_date = '';
|
||||
this.query.end_date = '';
|
||||
this.query.activity_num = '';
|
||||
this.query.activity_name = '';
|
||||
this.query.follower_num = '';
|
||||
this.query.follower_name = '';
|
||||
this.items = [];
|
||||
},
|
||||
showDetailDialog(item) {
|
||||
this.dialog.selected = item;
|
||||
this.dialog.show = true;
|
||||
},
|
||||
showActivityDialog() {
|
||||
this.activityDialog.show = true;
|
||||
this.searchActivity();
|
||||
},
|
||||
searchActivity() {
|
||||
this.activityDialog.loading = true;
|
||||
axios.get('../../api/activity', { params: { keyword: this.activityDialog.search } })
|
||||
.then(res => { this.activityDialog.items = res.data; })
|
||||
.catch(() => { this.activityDialog.items = []; })
|
||||
.finally(() => { this.activityDialog.loading = false; });
|
||||
},
|
||||
selectActivity(row) {
|
||||
this.query.activity_num = row.num;
|
||||
this.query.activity_name = row.subject;
|
||||
this.activityDialog.show = false;
|
||||
},
|
||||
showFollowerDialog() {
|
||||
this.followerDialog.show = true;
|
||||
this.searchFollower();
|
||||
},
|
||||
searchFollower() {
|
||||
this.followerDialog.loading = true;
|
||||
axios.post('../../api/follower/GetList', { u_name: this.followerDialog.search }, { params: { page: 1, pageSize: 10 } })
|
||||
.then(res => { this.followerDialog.items = res.data.list; })
|
||||
.catch(() => { this.followerDialog.items = []; })
|
||||
.finally(() => { this.followerDialog.loading = false; });
|
||||
},
|
||||
selectFollower(row) {
|
||||
this.query.follower_num = row.num;
|
||||
this.query.follower_name = row.u_name;
|
||||
this.followerDialog.show = false;
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,657 @@
|
||||
<template>
|
||||
<v-container>
|
||||
<v-card>
|
||||
<v-card-title class="bg-primary white--text text-center">
|
||||
<h5 class="mb-0">共同 - 沖帳流程</h5>
|
||||
<button class="btn btn-default ms-auto"><i class="mdi mdi-close"></i></button>
|
||||
</v-card-title>
|
||||
<v-card-text>
|
||||
<v-data-table :headers="headers"
|
||||
:items="items"
|
||||
:loading="loading"
|
||||
loading-text="載入中..."
|
||||
class="elevation-1"
|
||||
item-key="id">
|
||||
<template v-slot:item.follower="{ item }">
|
||||
<span :title="item.f_num">{{ item.follower }}</span>
|
||||
</template>
|
||||
<template v-slot:item.activity_info="{ item }">
|
||||
<div>
|
||||
<div class="font-weight-bold">{{ item.activity_name }}</div>
|
||||
<div class="caption text--secondary">
|
||||
<span v-if="hasFollowerList(item.draft)" style="margin-right: 4px;">👥</span>
|
||||
{{ item.acc_name }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.check_date="{ item }">
|
||||
<span>{{ item.check_date | date }}</span>
|
||||
</template>
|
||||
<template v-slot:item.check_memo="{ item }">
|
||||
<span>{{ item.check_memo }}</span>
|
||||
</template>
|
||||
<template v-slot:item.verify_note="{ item }">
|
||||
<span>{{ item.verify_note }}</span>
|
||||
</template>
|
||||
<template v-slot:item.follower_selection="{ item }">
|
||||
<div>
|
||||
<v-btn small
|
||||
color="primary"
|
||||
outlined
|
||||
@click="showFollowerSelection(item)"
|
||||
class="mb-1">
|
||||
<v-icon left small>mdi-account-multiple</v-icon>
|
||||
選擇支付人
|
||||
</v-btn>
|
||||
<div v-if="hasFollowerList(item.draft)" class="caption text-success mt-1">
|
||||
<v-icon small color="success">mdi-check-circle</v-icon>
|
||||
已選擇 {{ getFollowerCount(item.draft) }} 位
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.actions="{ item }">
|
||||
<v-btn small
|
||||
color="success"
|
||||
@click="showGroupReconcileDialog(item)"
|
||||
:disabled="!hasFollowerList(item.draft)">
|
||||
<v-icon left small>mdi-receipt</v-icon>
|
||||
{{ hasFollowerList(item.draft) ? '共同沖帳' : '請先選擇支付人' }}
|
||||
</v-btn>
|
||||
</template>
|
||||
</v-data-table>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
|
||||
|
||||
<!-- 選擇共同支付人對話框 -->
|
||||
<v-dialog v-model="followerDialog.show" max-width="800px">
|
||||
<v-card>
|
||||
<v-card-title class="grey lighten-2">
|
||||
<v-icon color="primary" class="mr-2">mdi-account-multiple</v-icon>
|
||||
選擇共同支付人
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn icon @click="followerDialog.show = false">
|
||||
<v-icon>mdi-close</v-icon>
|
||||
</v-btn>
|
||||
</v-card-title>
|
||||
<v-card-text class="mt-4">
|
||||
<div v-if="followerDialog.selected">
|
||||
<h6 class="mb-3">法會:{{ followerDialog.selected.activity_name }}</h6>
|
||||
<v-text-field v-model="followerDialog.search"
|
||||
label="搜尋信眾"
|
||||
dense
|
||||
outlined
|
||||
prepend-inner-icon="mdi-magnify"
|
||||
@input="searchActivityFollowers"></v-text-field>
|
||||
<v-data-table :headers="followerDialog.headers"
|
||||
:items="followerDialog.items"
|
||||
:loading="followerDialog.loading"
|
||||
item-key="f_num"
|
||||
class="elevation-1 mt-2"
|
||||
show-select
|
||||
v-model="followerDialog.selectedFollowers"
|
||||
hide-default-footer
|
||||
:disable-pagination="true">
|
||||
<template v-slot:item.follower_name="{ item }">
|
||||
<div>
|
||||
<div class="font-weight-bold">{{ item.follower_name }}</div>
|
||||
<div class="caption text--secondary">編號: {{ item.f_num }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.total_due="{ item }">
|
||||
<span class="text-danger">{{ item.total_due | currency }}</span>
|
||||
</template>
|
||||
<template v-slot:item.item_count="{ item }">
|
||||
<span class="text-info">{{ item.item_count }} 項</span>
|
||||
</template>
|
||||
</v-data-table>
|
||||
</div>
|
||||
</v-card-text>
|
||||
<v-card-actions class="pa-4">
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn color="grey" @click="followerDialog.show = false">取消</v-btn>
|
||||
<v-btn color="primary" @click="confirmFollowerSelection" :disabled="followerDialog.selectedFollowers.length === 0">
|
||||
確認選擇 ({{ followerDialog.selectedFollowers.length }})
|
||||
</v-btn>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
|
||||
<!-- 共同沖帳明細對話框 -->
|
||||
<v-dialog v-model="reconcileDialog.show" max-width="1200px">
|
||||
<v-card>
|
||||
<v-card-title class="grey lighten-2">
|
||||
<v-icon color="success" class="mr-2">mdi-receipt</v-icon>
|
||||
共同沖帳明細
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn icon @click="reconcileDialog.show = false">
|
||||
<v-icon>mdi-close</v-icon>
|
||||
</v-btn>
|
||||
</v-card-title>
|
||||
|
||||
<v-card-text class="mb-0 pb-0">
|
||||
<div v-if="reconcileDialog.selected">
|
||||
<div class="row my-2">
|
||||
<h6 class="col">共同支付人:{{ getSelectedFollowersText() }}</h6>
|
||||
<div class="col">
|
||||
<span class="font-weight-bold">入帳金額:</span>
|
||||
<span class="text-primary">{{ reconcileDialog.selected.check_amount | currency }}</span>
|
||||
</div>
|
||||
<div class="col">
|
||||
<span class="font-weight-bold">已沖金額:</span>
|
||||
<span :class="{'text-danger': isOverPaid, 'text-dark': !isOverPaid}">{{ sumReconcile | currency }}</span>
|
||||
</div>
|
||||
<div class="col">
|
||||
<span class="font-weight-bold">未繳餘款:</span>
|
||||
<span class="text-danger">{{ remainDue | currency }}</span>
|
||||
</div>
|
||||
<div class="col">
|
||||
<span class="font-weight-bold">入帳後餘額:</span>
|
||||
<span class="text-success">{{ overPaid | currency }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<v-data-table :headers="reconcileDialog.headers"
|
||||
:items="reconcileDialog.items"
|
||||
class="elevation-1 mt-3"
|
||||
hide-default-footer
|
||||
:disable-pagination="true">
|
||||
<template v-slot:item.follower_info="{ item }">
|
||||
<div>
|
||||
<div class="font-weight-bold text-primary">{{ item.follower_name }}</div>
|
||||
<div class="text-muted" style="font-size:12px;">{{ item.order_no }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.activity_name="{ item }">
|
||||
<div>
|
||||
<div>{{ item.activity_name }}</div>
|
||||
<div class="text-muted" style="font-size:12px;">{{ item.reg_time | date }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.paid="{ item }">
|
||||
<span>{{ item.paid | currency }}</span>
|
||||
</template>
|
||||
<template v-slot:item.due="{ item }">
|
||||
<span>{{ item.due | currency }}</span>
|
||||
</template>
|
||||
<template v-slot:item.reconcile="{ item, index }">
|
||||
<v-text-field v-model="item.reconcile"
|
||||
type="number"
|
||||
dense
|
||||
outlined
|
||||
hide-details="auto"
|
||||
:rules="[
|
||||
v=>
|
||||
!isNaN(Number(v)) || '請輸入數字',
|
||||
v => Number(v) >= 0 || '不可小於 0',
|
||||
v => Number(v) <= Number(item.due) || `不可大於待繳金額 ${item.due}`
|
||||
]"
|
||||
@blur="validateAndUpdateReconcile($event.target.value, item, index)"
|
||||
>
|
||||
</v-text-field>
|
||||
</template>
|
||||
</v-data-table>
|
||||
</div>
|
||||
</v-card-text>
|
||||
<v-card-actions class="pa-4">
|
||||
<div>
|
||||
<div v-if="hasUnallocated && remainDue > 0" class="text-dark mb-2">
|
||||
⚠️ 尚有未分配的入帳金額,請確認是否全部分配
|
||||
</div>
|
||||
<div v-if="hasUnallocated && remainDue === 0" class="text-info mb-2">
|
||||
ℹ️ 已無未繳項目,剩餘入帳金額將成為餘額
|
||||
</div>
|
||||
<div v-if="!canConfirm && buttonErrorMessage" class="text-danger">
|
||||
❌ {{ buttonErrorMessage }}
|
||||
</div>
|
||||
</div>
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn color="info" @click="redistributeReconcile" class="mr-2">重新分配</v-btn>
|
||||
<v-btn color="orange" @click="saveDraft" class="mr-2">暫存</v-btn>
|
||||
<v-btn color="primary" @click="confirmGroupReconcile" :disabled="!canConfirm">確認沖帳</v-btn>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
</v-container>
|
||||
</template>
|
||||
<script>
|
||||
|
||||
if (typeof window.DraftUtils === 'undefined') {
|
||||
console.warn('DraftUtils 未載入,使用備用方案');
|
||||
window.DraftUtils = {
|
||||
hasFollowerList: function (draft) { return false; },
|
||||
getFollowerList: function (draft) { return []; },
|
||||
updateFollowerList: function (draft, list) {
|
||||
return { follower_list: list };
|
||||
},
|
||||
getDraftField: function (draft, field) { return null; },
|
||||
updateDraftField: function (draft, field, value) {
|
||||
return { [field]: value };
|
||||
}
|
||||
};
|
||||
}
|
||||
module.exports = {
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
headers: [
|
||||
{ text: '匯款人', value: 'follower' },
|
||||
{ text: '法會/入帳帳戶', value: 'activity_info' },
|
||||
{ text: '入帳日期', value: 'check_date' },
|
||||
{ text: '帳簿備註', value: 'check_memo' },
|
||||
{ text: '入帳金額', value: 'check_amount' },
|
||||
{ text: '核對記錄', value: 'verify_note' },
|
||||
{ text: '選擇共同支付人', value: 'follower_selection', sortable: false },
|
||||
{ text: '共同沖帳', value: 'actions', sortable: false }
|
||||
],
|
||||
items: [],
|
||||
followerDialog: {
|
||||
show: false,
|
||||
selected: null,
|
||||
search: '',
|
||||
loading: false,
|
||||
items: [],
|
||||
selectedFollowers: [],
|
||||
headers: [
|
||||
{ text: '信眾', value: 'follower_name' },
|
||||
{ text: '待繳金額', value: 'total_due' },
|
||||
{ text: '項目數', value: 'item_count' }
|
||||
]
|
||||
},
|
||||
reconcileDialog: {
|
||||
show: false,
|
||||
selected: null,
|
||||
headers: [
|
||||
{ text: '信眾/報名單號', value: 'follower_info' },
|
||||
{ text: '法會/報名日期', value: 'activity_name' },
|
||||
{ text: '項目', value: 'actitem_name' },
|
||||
{ text: '應繳金額', value: 'price', sortable: false },
|
||||
{ text: '已繳金額', value: 'paid', sortable: false },
|
||||
{ text: '待繳金額', value: 'due', sortable: false },
|
||||
{ text: '沖帳金額', value: 'reconcile', sortable: false }
|
||||
],
|
||||
items: [],
|
||||
loading: false,
|
||||
errorMessage: ''
|
||||
},
|
||||
hasUnallocated: false,
|
||||
draftDataChanged: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
sumReconcile() {
|
||||
return this.reconcileDialog.items.reduce((sum, item) => sum + (Number(item.reconcile) || 0), 0);
|
||||
},
|
||||
remainDue() {
|
||||
const totalDue = this.reconcileDialog.items.reduce((sum, item) => sum + (Number(item.due) || 0), 0);
|
||||
return totalDue - this.sumReconcile;
|
||||
},
|
||||
overPaid() {
|
||||
if (!this.reconcileDialog.selected) return 0;
|
||||
return this.reconcileDialog.selected.check_amount - this.sumReconcile;
|
||||
},
|
||||
isOverPaid() {
|
||||
if (!this.reconcileDialog.selected) return false;
|
||||
return this.sumReconcile > this.reconcileDialog.selected.check_amount;
|
||||
},
|
||||
canConfirm() {
|
||||
if (!this.reconcileDialog.selected) return false;
|
||||
|
||||
const hasReconcile = this.reconcileDialog.items.some(item => Number(item.reconcile) > 0);
|
||||
if (!hasReconcile) return false;
|
||||
|
||||
const validAmounts = this.reconcileDialog.items.every(item => {
|
||||
const amount = Number(item.reconcile) || 0;
|
||||
return amount >= 0 && amount <= Number(item.due);
|
||||
});
|
||||
if (!validAmounts) return false;
|
||||
|
||||
if (this.sumReconcile > this.reconcileDialog.selected.check_amount) return false;
|
||||
|
||||
if (this.hasUnallocated && this.remainDue > 0) return false;
|
||||
|
||||
return true;
|
||||
},
|
||||
buttonErrorMessage() {
|
||||
if (!this.reconcileDialog.selected) return '';
|
||||
|
||||
const hasReconcile = this.reconcileDialog.items.some(item => Number(item.reconcile) > 0);
|
||||
if (!hasReconcile) return '請至少輸入一筆沖帳金額';
|
||||
|
||||
const invalidItem = this.reconcileDialog.items.find(item => {
|
||||
const amount = Number(item.reconcile) || 0;
|
||||
return amount < 0 || amount > Number(item.due);
|
||||
});
|
||||
if (invalidItem) return '沖帳金額超出可沖帳範圍';
|
||||
|
||||
if (this.sumReconcile > this.reconcileDialog.selected.check_amount) {
|
||||
return '已沖金額不可大於入帳金額';
|
||||
}
|
||||
|
||||
if (this.hasUnallocated && this.remainDue > 0) {
|
||||
return '尚有未繳項目,請將入帳金額完全分配';
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.loadTableData();
|
||||
},
|
||||
filters: {
|
||||
currency(val) {
|
||||
if (!val) return '0';
|
||||
return Number(val).toLocaleString();
|
||||
},
|
||||
date(val) {
|
||||
if (!val) return '';
|
||||
const date = new Date(val);
|
||||
return date.toLocaleDateString();
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// 檢查是否有 follower_list
|
||||
hasFollowerList(draft) {
|
||||
return window.DraftUtils && window.DraftUtils.hasFollowerList && window.DraftUtils.hasFollowerList(draft);
|
||||
},
|
||||
// 取得已選擇的支付人數量
|
||||
getFollowerCount(draft) {
|
||||
if (!window.DraftUtils || !window.DraftUtils.getFollowerList) return 0;
|
||||
const followerList = window.DraftUtils.getFollowerList(draft);
|
||||
return followerList ? followerList.length : 0;
|
||||
},
|
||||
loadTableData() {
|
||||
this.loading = true;
|
||||
axios.get('../../api/transfer_register/group_reconcile_list')
|
||||
.then(res => {
|
||||
this.items = res.data;
|
||||
})
|
||||
.catch(() => {
|
||||
this.items = [];
|
||||
})
|
||||
.finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
showGroupReconcileDialog(item) {
|
||||
// 檢查是否已有選擇的共同支付人
|
||||
const followerList = window.DraftUtils.getFollowerList(item.draft);
|
||||
if (followerList && followerList.length > 0) {
|
||||
// 直接顯示沖帳明細
|
||||
this.showReconcileDetail(item, followerList);
|
||||
} else {
|
||||
// 先選擇共同支付人
|
||||
this.showFollowerSelection(item);
|
||||
}
|
||||
},
|
||||
showFollowerSelection(item) {
|
||||
this.followerDialog.selected = item;
|
||||
this.followerDialog.selectedFollowers = [];
|
||||
this.followerDialog.items = [];
|
||||
this.followerDialog.show = true;
|
||||
this.searchActivityFollowers();
|
||||
},
|
||||
searchActivityFollowers() {
|
||||
if (!this.followerDialog.selected || !this.followerDialog.selected.activity_num) return;
|
||||
|
||||
this.followerDialog.loading = true;
|
||||
axios.get('../../api/transfer_register/activity_followers', {
|
||||
params: { activity_num: this.followerDialog.selected.activity_num }
|
||||
})
|
||||
.then(res => {
|
||||
let items = res.data;
|
||||
// 如果有搜尋關鍵字,過濾結果
|
||||
if (this.followerDialog.search && this.followerDialog.search.trim()) {
|
||||
const keyword = this.followerDialog.search.trim().toLowerCase();
|
||||
items = items.filter(item =>
|
||||
item.follower_name.toLowerCase().includes(keyword)
|
||||
);
|
||||
}
|
||||
this.followerDialog.items = items;
|
||||
})
|
||||
.catch(() => {
|
||||
this.followerDialog.items = [];
|
||||
})
|
||||
.finally(() => {
|
||||
this.followerDialog.loading = false;
|
||||
});
|
||||
},
|
||||
confirmFollowerSelection() {
|
||||
if (this.followerDialog.selectedFollowers.length === 0) {
|
||||
alert('請選擇至少一位共同支付人');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.followerDialog.selected) {
|
||||
alert('系統錯誤:未選擇記錄');
|
||||
return;
|
||||
}
|
||||
|
||||
// 儲存選擇的共同支付人到 draft
|
||||
const followerList = this.followerDialog.selectedFollowers.map(f => ({
|
||||
f_num: f.f_num,
|
||||
f_name: f.follower_name,
|
||||
activity_num: this.followerDialog.selected.activity_num
|
||||
}));
|
||||
|
||||
const draftData = window.DraftUtils.updateFollowerList(this.followerDialog.selected.draft, followerList);
|
||||
this.updateFollowerDraftToDB(this.followerDialog.selected.id, draftData)
|
||||
.then(() => {
|
||||
this.followerDialog.selected.draft = JSON.stringify(draftData);
|
||||
this.followerDialog.show = false;
|
||||
// 重新載入資料以更新顯示
|
||||
this.loadTableData();
|
||||
// 顯示沖帳明細
|
||||
this.showReconcileDetail(this.followerDialog.selected, followerList);
|
||||
})
|
||||
.catch(err => {
|
||||
alert('儲存失敗,請重試');
|
||||
console.error(err);
|
||||
});
|
||||
},
|
||||
showReconcileDetail(item, followerList) {
|
||||
this.reconcileDialog.selected = item;
|
||||
this.reconcileDialog.items = [];
|
||||
this.reconcileDialog.show = true;
|
||||
|
||||
// 取得所選信眾的訂單明細
|
||||
const fNums = followerList.map(f => f.f_num).join(',');
|
||||
axios.get('../../api/transfer_register/group_follower_orders', {
|
||||
params: {
|
||||
activity_num: item.activity_num,
|
||||
f_nums: fNums
|
||||
}
|
||||
})
|
||||
.then(res => {
|
||||
this.reconcileDialog.items = res.data.map(item => ({
|
||||
...item,
|
||||
reconcile: 0 // 初始化沖帳金額
|
||||
}));
|
||||
this.autoDistributeReconcile();
|
||||
})
|
||||
.catch(() => {
|
||||
this.reconcileDialog.items = [];
|
||||
this.updateSumReconcile();
|
||||
});
|
||||
},
|
||||
getSelectedFollowersText() {
|
||||
if (!this.reconcileDialog.selected) return '';
|
||||
const followerList = window.DraftUtils.getFollowerList(this.reconcileDialog.selected.draft);
|
||||
return followerList.map(f => f.f_name).join('、');
|
||||
},
|
||||
autoDistributeReconcile() {
|
||||
// 先進先出分配沖帳金額
|
||||
let remainAmount = this.reconcileDialog.selected ? this.reconcileDialog.selected.check_amount : 0;
|
||||
|
||||
// 先將所有項目的 reconcile 清為 0
|
||||
this.reconcileDialog.items.forEach(item => {
|
||||
this.$set(item, 'reconcile', 0);
|
||||
});
|
||||
|
||||
// 依報名日期排序(先進先出)
|
||||
const sortedItems = [...this.reconcileDialog.items].sort((a, b) =>
|
||||
new Date(a.reg_time) - new Date(b.reg_time)
|
||||
);
|
||||
|
||||
// 逐項分配
|
||||
sortedItems.forEach(item => {
|
||||
if (remainAmount > 0) {
|
||||
const canPay = Math.min(item.due, remainAmount);
|
||||
const originalItem = this.reconcileDialog.items.find(i => i === item);
|
||||
if (originalItem) {
|
||||
this.$set(originalItem, 'reconcile', canPay);
|
||||
}
|
||||
remainAmount -= canPay;
|
||||
}
|
||||
});
|
||||
|
||||
this.updateSumReconcile();
|
||||
},
|
||||
redistributeReconcile() {
|
||||
this.autoDistributeReconcile();
|
||||
},
|
||||
updateSumReconcile() {
|
||||
const maxTotal = this.reconcileDialog.selected ? (this.reconcileDialog.selected.check_amount || 0) : 0;
|
||||
this.hasUnallocated = maxTotal > this.sumReconcile;
|
||||
},
|
||||
saveDraft() {
|
||||
try {
|
||||
// 組成新的資料
|
||||
const followerList = window.DraftUtils.getFollowerList(this.reconcileDialog.selected.draft);
|
||||
const reconcileData = this.reconcileDialog.items
|
||||
.filter(item => Number(item.reconcile) > 0)
|
||||
.map(item => ({
|
||||
f_num: item.f_num,
|
||||
follower_name: item.follower_name,
|
||||
pro_order_detail_num: item.num,
|
||||
reconcile: Number(item.reconcile)
|
||||
}));
|
||||
|
||||
const draftData = {
|
||||
transfer_draft: [],
|
||||
pro_order_detail_items: reconcileData,
|
||||
follower_list: followerList
|
||||
};
|
||||
|
||||
this.updateDraftToDB(this.reconcileDialog.selected.id, draftData)
|
||||
.then(() => {
|
||||
alert('暫存成功!');
|
||||
this.reconcileDialog.selected.draft = JSON.stringify(draftData);
|
||||
});
|
||||
|
||||
} catch (e) {
|
||||
alert('暫存失敗:資料格式錯誤');
|
||||
}
|
||||
},
|
||||
updateFollowerDraftToDB(id, draftData) {
|
||||
const selectedItem = this.followerDialog.selected;
|
||||
const updateData = {
|
||||
id: id,
|
||||
activity_num: selectedItem.activity_num,
|
||||
name: selectedItem.name,
|
||||
phone: selectedItem.phone,
|
||||
pay_type: selectedItem.pay_type,
|
||||
account_last5: selectedItem.account_last5,
|
||||
amount: selectedItem.amount,
|
||||
pay_mode: selectedItem.pay_mode,
|
||||
note: selectedItem.note,
|
||||
proof_img: selectedItem.proof_img,
|
||||
status: selectedItem.status,
|
||||
f_num_match: selectedItem.f_num_match,
|
||||
f_num: selectedItem.f_num,
|
||||
acc_num: selectedItem.acc_num,
|
||||
check_date: selectedItem.check_date,
|
||||
check_amount: selectedItem.check_amount,
|
||||
check_memo: selectedItem.check_memo,
|
||||
check_status: selectedItem.check_status,
|
||||
acc_kind: selectedItem.acc_kind,
|
||||
member_num: selectedItem.member_num,
|
||||
verify_time: selectedItem.verify_time,
|
||||
verify_note: selectedItem.verify_note,
|
||||
draft: JSON.stringify(draftData)
|
||||
};
|
||||
|
||||
return axios.put(`../../api/transfer_register/${id}`, updateData);
|
||||
},
|
||||
updateDraftToDB(id, draftData) {
|
||||
const updateData = {
|
||||
id: id,
|
||||
activity_num: this.reconcileDialog.selected.activity_num,
|
||||
name: this.reconcileDialog.selected.name,
|
||||
phone: this.reconcileDialog.selected.phone,
|
||||
pay_type: this.reconcileDialog.selected.pay_type,
|
||||
account_last5: this.reconcileDialog.selected.account_last5,
|
||||
amount: this.reconcileDialog.selected.amount,
|
||||
pay_mode: this.reconcileDialog.selected.pay_mode,
|
||||
note: this.reconcileDialog.selected.note,
|
||||
proof_img: this.reconcileDialog.selected.proof_img,
|
||||
status: this.reconcileDialog.selected.status,
|
||||
f_num_match: this.reconcileDialog.selected.f_num_match,
|
||||
f_num: this.reconcileDialog.selected.f_num,
|
||||
acc_num: this.reconcileDialog.selected.acc_num,
|
||||
check_date: this.reconcileDialog.selected.check_date,
|
||||
check_amount: this.reconcileDialog.selected.check_amount,
|
||||
check_memo: this.reconcileDialog.selected.check_memo,
|
||||
check_status: this.reconcileDialog.selected.check_status,
|
||||
acc_kind: this.reconcileDialog.selected.acc_kind,
|
||||
member_num: this.reconcileDialog.selected.member_num,
|
||||
verify_time: this.reconcileDialog.selected.verify_time,
|
||||
verify_note: this.reconcileDialog.selected.verify_note,
|
||||
draft: JSON.stringify(draftData)
|
||||
};
|
||||
|
||||
return axios.put(`../../api/transfer_register/${id}`, updateData);
|
||||
},
|
||||
confirmGroupReconcile() {
|
||||
if (!this.canConfirm) return;
|
||||
|
||||
this.reconcileDialog.loading = true;
|
||||
const overPayment = this.reconcileDialog.selected.check_amount - this.sumReconcile;
|
||||
const postData = {
|
||||
transfer_register_id: this.reconcileDialog.selected.id,
|
||||
details: this.reconcileDialog.items
|
||||
.filter(item => item.reconcile > 0)
|
||||
.map(item => ({
|
||||
f_num: item.f_num,
|
||||
pro_order_detail_num: item.num,
|
||||
amount: Number(item.reconcile),
|
||||
reg_time: new Date().toISOString()
|
||||
})),
|
||||
over_payment: overPayment
|
||||
};
|
||||
|
||||
axios.post('../../api/transfer_register/group_reconcile', postData)
|
||||
.then(res => {
|
||||
const message = res.data && res.data.message ? res.data.message : '共同沖帳完成';
|
||||
alert(message);
|
||||
|
||||
this.reconcileDialog.show = false;
|
||||
this.loadTableData(); // 重新載入清單
|
||||
})
|
||||
.catch(err => {
|
||||
let errorMessage = '沖帳失敗,請聯繫系統管理員';
|
||||
if (err.response && err.response.data) {
|
||||
if (typeof err.response.data === 'string') {
|
||||
errorMessage = err.response.data;
|
||||
} else if (err.response.data.message) {
|
||||
errorMessage = err.response.data.message;
|
||||
}
|
||||
}
|
||||
alert(errorMessage);
|
||||
})
|
||||
.finally(() => {
|
||||
this.reconcileDialog.loading = false;
|
||||
});
|
||||
},
|
||||
validateAndUpdateReconcile(value, item, index) {
|
||||
let numValue = Number(value);
|
||||
if (isNaN(numValue)) {
|
||||
numValue = 0;
|
||||
}
|
||||
numValue = Math.round(numValue);
|
||||
|
||||
this.$set(item, 'reconcile', numValue);
|
||||
this.updateSumReconcile();
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,295 @@
|
||||
<%@ Page Title="匯款/沖帳管理" Language="C#" MasterPageFile="~/admin/Templates/TBS5ADM001/MasterPage.master" AutoEventWireup="true" EnableEventValidation="false" CodeFile="index.aspx.cs" Inherits="admin_bill_index" %>
|
||||
<asp:Content ID="Content1" ContentPlaceHolderID="page_header" runat="Server">
|
||||
<link rel="stylesheet" href="../../js/_bootstrap-icons-1.8.1/bootstrap-icons.css">
|
||||
<style>
|
||||
.function-icon {
|
||||
font-size: 2em;
|
||||
line-height: 1;
|
||||
align-content: center;
|
||||
}
|
||||
.external-link-icon {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
.modify_modal{
|
||||
width:calc(100vw-20%);
|
||||
background-color:white;
|
||||
opacity:0;
|
||||
}
|
||||
</style>
|
||||
<script src="/js//httpVueLoader.js"></script>
|
||||
</asp:Content>
|
||||
<asp:Content ID="Content3" ContentPlaceHolderID="page_nav" runat="Server">
|
||||
<h2 class="mb-3">匯款/沖帳管理</h2>
|
||||
</asp:Content>
|
||||
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
|
||||
<v-container>
|
||||
<div id="content" class="container py-4">
|
||||
<div class="row">
|
||||
<!-- 第一欄:匯款登錄與核對 -->
|
||||
<div class="col-lg-4 mb-4">
|
||||
<h5 class="text-primary mb-3">
|
||||
<i class="bi bi-upload"></i> 匯款登錄與核對
|
||||
</h5>
|
||||
<div class="list-group">
|
||||
<a @click="show_register()" class="list-group-item list-group-item-action" >
|
||||
<div class="d-flex justify-content-between align-items-start">
|
||||
<div class="d-flex">
|
||||
<i class="bi bi-plus-circle text-success me-3 function-icon"></i>
|
||||
<div>
|
||||
<div>
|
||||
登錄匯款資料
|
||||
<i class="bi bi-box-arrow-up-right text-muted ms-1 external-link-icon"></i>
|
||||
</div>
|
||||
<small class="text-muted">報名者自行填寫匯款相關資訊</small>
|
||||
</div>
|
||||
</div>
|
||||
<span class="badge bg-primary">報名者</span>
|
||||
</div>
|
||||
</a>
|
||||
<a @click="show_verify()" class="list-group-item list-group-item-action d-none">
|
||||
<div class="d-flex justify-content-between align-items-start">
|
||||
<div class="d-flex">
|
||||
<i class="bi bi-person-check text-info me-3 function-icon"></i>
|
||||
<div>
|
||||
<div>出納核對匯款人</div>
|
||||
<small class="text-muted">核對匯款人身份與報名資料</small>
|
||||
</div>
|
||||
</div>
|
||||
<span class="badge bg-info">出納</span>
|
||||
</div>
|
||||
</a>
|
||||
<a @click="show_verify()" class="list-group-item list-group-item-action">
|
||||
<div class="d-flex justify-content-between align-items-start">
|
||||
<div class="d-flex">
|
||||
<i class="bi bi-person-check text-info me-3 function-icon"></i>
|
||||
<div>
|
||||
<div>出納核對匯款人</div>
|
||||
<small class="text-muted">初步核對匯款人身份資料</small>
|
||||
</div>
|
||||
</div>
|
||||
<span class="badge bg-info">出納</span>
|
||||
</div>
|
||||
</a>
|
||||
<%-- <a href="verify2.aspx" class="list-group-item list-group-item-action">
|
||||
<div class="d-flex justify-content-between align-items-start">
|
||||
<div class="d-flex">
|
||||
<i class="bi bi-currency-dollar text-warning me-3 function-icon"></i>
|
||||
<div>
|
||||
<div>出納核對金額(階段2)</div>
|
||||
<small class="text-muted">核對匯款金額與入帳資料</small>
|
||||
</div>
|
||||
</div>
|
||||
<span class="badge bg-warning text-dark">出納</span>
|
||||
</div>
|
||||
</a>--%>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 第二欄:沖帳流程 -->
|
||||
<div class="col-lg-4 mb-4">
|
||||
<h5 class="text-primary mb-3">
|
||||
<i class="bi bi-receipt"></i> 沖帳流程
|
||||
</h5>
|
||||
<div class="list-group">
|
||||
<a @click="personal_reconcile()" class="list-group-item list-group-item-action">
|
||||
<div class="d-flex justify-content-between align-items-start">
|
||||
<div class="d-flex">
|
||||
<i class="bi bi-person text-primary me-3 function-icon"></i>
|
||||
<div>
|
||||
<div>個人-沖帳流程</div>
|
||||
<small class="text-muted">處理個人匯款的沖帳作業</small>
|
||||
</div>
|
||||
</div>
|
||||
<span class="badge bg-success">會計</span>
|
||||
</div>
|
||||
</a>
|
||||
<a @click="group_reconcile()" class="list-group-item list-group-item-action">
|
||||
<div class="d-flex justify-content-between align-items-start">
|
||||
<div class="d-flex">
|
||||
<i class="bi bi-people text-success me-3 function-icon"></i>
|
||||
<div>
|
||||
<div>共同-沖帳流程</div>
|
||||
<small class="text-muted">處理多人共同支付的沖帳作業</small>
|
||||
</div>
|
||||
</div>
|
||||
<span class="badge bg-success">會計</span>
|
||||
</div>
|
||||
</a>
|
||||
<a @click="balance_reconcile()" class="list-group-item list-group-item-action">
|
||||
<div class="d-flex justify-content-between align-items-start">
|
||||
<div class="d-flex">
|
||||
<i class="bi bi-calculator text-danger me-3 function-icon"></i>
|
||||
<div>
|
||||
<div>餘額核銷</div>
|
||||
<small class="text-muted">處理沖帳後剩餘金額的核銷</small>
|
||||
</div>
|
||||
</div>
|
||||
<span class="badge bg-danger">會計</span>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 第三欄:查詢功能 -->
|
||||
<div class="col-lg-4 mb-4">
|
||||
<h5 class="text-primary mb-3">
|
||||
<i class="bi bi-search"></i> 查詢功能
|
||||
</h5>
|
||||
<div class="list-group">
|
||||
<a @click="verify_query()" class="list-group-item list-group-item-action">
|
||||
<div class="d-flex justify-content-between align-items-start">
|
||||
<div class="d-flex">
|
||||
<i class="bi bi-journal-check text-info me-3 function-icon"></i>
|
||||
<div>
|
||||
<div>沖帳查詢</div>
|
||||
<small class="text-muted">查詢所有沖帳記錄與明細</small>
|
||||
</div>
|
||||
</div>
|
||||
<span class="badge bg-info">會計</span>
|
||||
</div>
|
||||
</a>
|
||||
<a @click="balance_query()" class="list-group-item list-group-item-action">
|
||||
<div class="d-flex justify-content-between align-items-start">
|
||||
<div class="d-flex">
|
||||
<i class="bi bi-file-text text-secondary me-3 function-icon"></i>
|
||||
<div>
|
||||
<div>餘額核銷查詢</div>
|
||||
<small class="text-muted">查詢已完成的餘額核銷記錄</small>
|
||||
</div>
|
||||
</div>
|
||||
<span class="badge bg-secondary">會計</span>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<a @click="balance_query()" class="list-group-item list-group-item-action">
|
||||
<div class="d-flex justify-content-between align-items-start">
|
||||
<div class="d-flex">
|
||||
<i class="bi bi-file-spreadsheet text-secondary me-3 function-icon"></i>
|
||||
<div>
|
||||
<div>應收應付(依活動)</div>
|
||||
<small class="text-muted"></small>
|
||||
</div>
|
||||
</div>
|
||||
<span class="badge bg-secondary">會計</span>
|
||||
</div>
|
||||
</a>
|
||||
<a @click="balance_query()" class="list-group-item list-group-item-action">
|
||||
<div class="d-flex justify-content-between align-items-start">
|
||||
<div class="d-flex">
|
||||
<i class="bi bi-file-spreadsheet text-secondary me-3 function-icon"></i>
|
||||
<div>
|
||||
<div>應收應付(依信眾)</div>
|
||||
<small class="text-muted"></small>
|
||||
</div>
|
||||
</div>
|
||||
<span class="badge bg-secondary">會計</span>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 統計資訊 -->
|
||||
<div class="row mt-4">
|
||||
<div class="col-12">
|
||||
<div class="alert alert-info">
|
||||
<h6 class="alert-heading">
|
||||
<i class="bi bi-info-circle"></i> 系統說明
|
||||
</h6>
|
||||
<ul class="mb-0">
|
||||
<li><strong>匯款登錄與核對</strong>:處理報名者匯款資料的登錄與出納核對作業</li>
|
||||
<li><strong>沖帳流程</strong>:處理個人與共同支付的沖帳作業,以及剩餘金額的核銷</li>
|
||||
<li><strong>查詢功能</strong>:提供各類沖帳記錄的查詢與統計功能</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<v-dialog v-model="modify_dialog.show" class="modify_modal">
|
||||
<template>
|
||||
|
||||
<keep-alive>
|
||||
<component :is="currentView" @close-dialog="modify_dialog.show=false"></component>
|
||||
</keep-alive>
|
||||
|
||||
</template>
|
||||
</v-dialog>
|
||||
</v-container>
|
||||
</asp:Content>
|
||||
|
||||
<asp:Content ID="Content5" ContentPlaceHolderID="footer_script" runat="Server">
|
||||
<script src="../transfer/draft-utils.js"></script>
|
||||
<script>
|
||||
|
||||
let VueApp = new Vue({
|
||||
el: '#app',
|
||||
vuetify: new Vuetify(vuetify_options),
|
||||
data() {
|
||||
return {
|
||||
modify_dialog: {
|
||||
show:false
|
||||
},
|
||||
externalHtml: "",
|
||||
currentView:null
|
||||
};
|
||||
},
|
||||
created() {
|
||||
//this.loadActivities();
|
||||
|
||||
},
|
||||
components: {
|
||||
'register-component': httpVueLoader('./register.vue'),
|
||||
'verify-component': httpVueLoader('./verify.vue'),
|
||||
'group-component': httpVueLoader('./group_reconcile.vue'),
|
||||
'personal-component': httpVueLoader('./personal_reconcile.vue'),
|
||||
'balance-component': httpVueLoader('./balance_reconcile.vue'),
|
||||
'verify_query-component': httpVueLoader('./verify_order_record_query.vue'),
|
||||
'balance_query-component': httpVueLoader('./balance_reconcile_query.vue')
|
||||
},
|
||||
|
||||
methods: {
|
||||
async balance_query() {
|
||||
this.modify_dialog.show = true
|
||||
this.currentView = 'balance_query-component'
|
||||
},
|
||||
async verify_query(){
|
||||
this.modify_dialog.show = true
|
||||
this.currentView = 'verify_query-component'
|
||||
},
|
||||
async balance_reconcile() {
|
||||
this.modify_dialog.show = true
|
||||
this.currentView = 'balance-component'
|
||||
},
|
||||
async personal_reconcile() {
|
||||
this.modify_dialog.show = true
|
||||
this.currentView = 'personal-component'
|
||||
},
|
||||
async group_reconcile() {
|
||||
this.modify_dialog.show = true
|
||||
this.currentView = 'group-component'
|
||||
},
|
||||
async show_verify() {
|
||||
this.modify_dialog.show = true
|
||||
this.currentView = 'verify-component'
|
||||
},
|
||||
async show_register() {
|
||||
this.modify_dialog.show = true
|
||||
this.currentView ='register-component'
|
||||
},
|
||||
loadActivities() {
|
||||
const today = new Date().toISOString().split('T')[0];
|
||||
axios.get(`../../api/activity?endDate<=${today}`)
|
||||
.then(response => {
|
||||
this.activities = response.data;
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('載入活動列表失敗:', error);
|
||||
alert('載入活動列表失敗,請重新整理頁面');
|
||||
});
|
||||
},
|
||||
}
|
||||
})
|
||||
</script>
|
||||
</asp:Content>
|
||||
@@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
|
||||
public partial class admin_bill_index : MyWeb.config
|
||||
{
|
||||
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,510 @@
|
||||
<template>
|
||||
<v-container>
|
||||
<v-card>
|
||||
<v-card-title class="bg-primary white--text text-center">
|
||||
<h5 class="mb-0">個人 - 沖帳流程</h5>
|
||||
<button class="btn btn-default ms-auto" ><i class="mdi mdi-close"></i></button>
|
||||
</v-card-title>
|
||||
<v-card-text>
|
||||
<v-data-table :headers="headers"
|
||||
:items="items"
|
||||
:loading="loading"
|
||||
loading-text="載入中..."
|
||||
class="elevation-1"
|
||||
item-key="id">
|
||||
<template v-slot:item.follower="{ item }">
|
||||
<span :title="item.f_num">{{ item.follower }}</span>
|
||||
</template>
|
||||
<template v-slot:item.acc_name="{ item }">
|
||||
<span>
|
||||
<span v-if="hasTransferDraft(item.draft)" style="margin-right: 4px;">📝</span>{{ item.acc_name }}
|
||||
</span>
|
||||
</template>
|
||||
<template v-slot:item.check_date="{ item }">
|
||||
<span>{{ item.check_date | date }}</span>
|
||||
</template>
|
||||
<template v-slot:item.check_memo="{ item }">
|
||||
<span>{{ item.check_memo }}</span>
|
||||
</template>
|
||||
<template v-slot:item.check_status="{ item }">
|
||||
<span>{{ item.check_status }}</span>
|
||||
</template>
|
||||
<template v-slot:item.verify_note="{ item }">
|
||||
<span>{{ item.verify_note }}</span>
|
||||
</template>
|
||||
<template v-slot:item.actions="{ item }">
|
||||
<v-btn small
|
||||
color="success"
|
||||
@click="showReconcileDialog(item)">
|
||||
沖帳
|
||||
</v-btn>
|
||||
</template>
|
||||
</v-data-table>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
|
||||
|
||||
<!-- 沖帳明細對話框 -->
|
||||
<v-dialog v-model="dialog.show" max-width="960px">
|
||||
<v-card>
|
||||
<v-card-title class="grey lighten-2">
|
||||
<span v-if="dialog.selected && hasTransferDraft(dialog.selected.draft)" style="margin-right: 8px;">📝</span>沖帳明細
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn icon @click="dialog.show = false">
|
||||
<v-icon>mdi-close</v-icon>
|
||||
</v-btn>
|
||||
</v-card-title>
|
||||
|
||||
<v-card-text class="mb-0 pb-0">
|
||||
<div v-if="dialog.selected">
|
||||
<div class="row my-2">
|
||||
<h6 class="col">信眾:{{ dialog.selected.follower }}</h6>
|
||||
<div class="col">
|
||||
<span class="font-weight-bold">入帳金額:</span>
|
||||
<span class="text-primary">{{ dialog.selected.check_amount | currency }}</span>
|
||||
</div>
|
||||
<div class="col">
|
||||
<span class="font-weight-bold">已沖金額:</span>
|
||||
<span :class="{'text-danger': isOverPaid, 'text-dark': !isOverPaid}">{{ sumReconcile | currency }}</span>
|
||||
</div>
|
||||
<div class="col">
|
||||
<span class="font-weight-bold">未繳餘款:</span>
|
||||
<span class="text-danger">{{ remainDue | currency }}</span>
|
||||
</div>
|
||||
<div class="col">
|
||||
<span class="font-weight-bold">入帳後餘額:</span>
|
||||
<span class="text-success">{{ overPaid | currency }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<v-data-table :headers="dialog.headers"
|
||||
:items="dialog.items"
|
||||
class="elevation-1 mt-3"
|
||||
hide-default-footer
|
||||
:disable-pagination="true">
|
||||
<template v-slot:item.activity_name="{ item }">
|
||||
<div>
|
||||
<div>{{ item.activity_name }}</div>
|
||||
<div class="text-muted" style="font-size:12px;">{{ item.order_no }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.paid="{ item }">
|
||||
<span>{{ item.paid | currency }}</span>
|
||||
</template>
|
||||
<template v-slot:item.due="{ item }">
|
||||
<span>{{ item.due | currency }}</span>
|
||||
</template>
|
||||
<template v-slot:item.reg_time="{ item }">
|
||||
<span>{{ item.reg_time | date }}</span>
|
||||
</template>
|
||||
<template v-slot:item.reconcile="{ item, index }">
|
||||
<v-text-field v-model="item.reconcile"
|
||||
type="number"
|
||||
dense
|
||||
outlined
|
||||
hide-details="auto"
|
||||
:rules="[
|
||||
v=>
|
||||
!isNaN(Number(v)) || '請輸入數字',
|
||||
v => Number(v) >= 0 || '不可小於 0',
|
||||
v => Number(v) <= Number(item.due) || `不可大於待繳金額 ${item.due}`
|
||||
]"
|
||||
@blur="validateAndUpdateReconcile($event.target.value, item, index)"
|
||||
>
|
||||
</v-text-field>
|
||||
</template>
|
||||
</v-data-table>
|
||||
</div>
|
||||
</v-card-text>
|
||||
<v-card-actions class="pa-4">
|
||||
<div>
|
||||
<div v-if="hasUnallocated && remainDue > 0" class="text-dark mb-2">
|
||||
⚠️ 尚有未分配的入帳金額,請確認是否全部分配
|
||||
</div>
|
||||
<div v-if="hasUnallocated && remainDue === 0" class="text-info mb-2">
|
||||
ℹ️ 已無未繳項目,剩餘入帳金額將成為餘額
|
||||
</div>
|
||||
<div v-if="!canConfirm && buttonErrorMessage" class="text-danger">
|
||||
❌ {{ buttonErrorMessage }}
|
||||
</div>
|
||||
</div>
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn color="info" @click="redistributeReconcile" class="mr-2">重新分配</v-btn>
|
||||
<v-btn color="orange" @click="saveDraft" class="mr-2">暫存</v-btn>
|
||||
<v-btn color="primary" @click="confirmReconcile" :disabled="!canConfirm">確認沖帳</v-btn>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
</v-container>
|
||||
</template>
|
||||
<script>
|
||||
if (typeof window.DraftUtils === 'undefined') {
|
||||
console.warn('DraftUtils 未載入,使用備用方案');
|
||||
window.DraftUtils = {
|
||||
hasTransferDraft: function (draft) { return false; },
|
||||
getDraftField: function (draft, field) { return null; },
|
||||
updateDraftField: function (draft, field, value) {
|
||||
return { [field]: value };
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
headers: [
|
||||
//{ text: '信眾#', value: 'f_num' },
|
||||
{ text: '信眾', value: 'follower' },
|
||||
{ text: '入帳銀行/帳戶', value: 'acc_name' },
|
||||
{ text: '入帳日期', value: 'check_date' },
|
||||
{ text: '帳簿備註', value: 'check_memo' },
|
||||
{ text: '入帳金額', value: 'check_amount' },
|
||||
//{ text: '狀態', value: 'check_status' },
|
||||
{ text: '核對記錄', value: 'verify_note' },
|
||||
{ text: '沖帳', value: 'actions', sortable: false }
|
||||
],
|
||||
items: [],
|
||||
dialog: {
|
||||
show: false,
|
||||
selected: null,
|
||||
headers: [
|
||||
{ text: '法會/報名單號', value: 'activity_name' },
|
||||
{ text: '報名日期', value: 'reg_time' },
|
||||
{ text: '項目', value: 'actitem_name' },
|
||||
{ text: '應繳金額', value: 'price', sortable: false },
|
||||
{ text: '已繳金額', value: 'paid', sortable: false },
|
||||
{ text: '待繳金額', value: 'due', sortable: false },
|
||||
{ text: '沖帳金額', value: 'reconcile', sortable: false }
|
||||
],
|
||||
items: [],
|
||||
loading: false,
|
||||
errorMessage: ''
|
||||
},
|
||||
hasUnallocated: false,
|
||||
draftDataChanged: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
sumReconcile() {
|
||||
return this.dialog.items.reduce((sum, item) => sum + (Number(item.reconcile) || 0), 0);
|
||||
},
|
||||
remainDue() {
|
||||
const totalDue = this.dialog.items.reduce((sum, item) => sum + (Number(item.due) || 0), 0);
|
||||
return totalDue - this.sumReconcile;
|
||||
},
|
||||
overPaid() {
|
||||
if (!this.dialog.selected) return 0;
|
||||
return this.dialog.selected.check_amount - this.sumReconcile;
|
||||
},
|
||||
isOverPaid() {
|
||||
if (!this.dialog.selected) return false;
|
||||
return this.sumReconcile > this.dialog.selected.check_amount;
|
||||
},
|
||||
canConfirm() {
|
||||
if (!this.dialog.selected) return false;
|
||||
|
||||
const hasReconcile = this.dialog.items.some(item => Number(item.reconcile) > 0);
|
||||
if (!hasReconcile) return false;
|
||||
|
||||
const validAmounts = this.dialog.items.every(item => {
|
||||
const amount = Number(item.reconcile) || 0;
|
||||
return amount >= 0 && amount <= Number(item.due);
|
||||
});
|
||||
if (!validAmounts) return false;
|
||||
|
||||
if (this.sumReconcile > this.dialog.selected.check_amount) return false;
|
||||
|
||||
// 有未分配金額時,只有在還有未繳餘款的情況下才禁用按鈕
|
||||
// 如果未繳餘款為 0,表示沒有更多項目可沖帳,應允許確認
|
||||
if (this.hasUnallocated && this.remainDue > 0) return false;
|
||||
|
||||
return true;
|
||||
},
|
||||
buttonErrorMessage() {
|
||||
if (!this.dialog.selected) return '';
|
||||
|
||||
const hasReconcile = this.dialog.items.some(item => Number(item.reconcile) > 0);
|
||||
if (!hasReconcile) return '請至少輸入一筆沖帳金額';
|
||||
|
||||
const invalidItem = this.dialog.items.find(item => {
|
||||
const amount = Number(item.reconcile) || 0;
|
||||
return amount < 0 || amount > Number(item.due);
|
||||
});
|
||||
if (invalidItem) return '沖帳金額超出可沖帳範圍';
|
||||
|
||||
if (this.sumReconcile > this.dialog.selected.check_amount) {
|
||||
return '已沖金額不可大於入帳金額';
|
||||
}
|
||||
|
||||
if (this.hasUnallocated && this.remainDue > 0) {
|
||||
return '尚有未繳項目,請將入帳金額完全分配';
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.loadTableData();
|
||||
},
|
||||
filters: {
|
||||
currency(val) {
|
||||
if (!val) return '0';
|
||||
return Number(val).toLocaleString();
|
||||
},
|
||||
date(val) {
|
||||
if (!val) return '';
|
||||
const date = new Date(val);
|
||||
return date.toLocaleDateString();
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// 檢查是否有 DraftUtils 可用
|
||||
hasTransferDraft(draft) {
|
||||
return window.DraftUtils && window.DraftUtils.hasTransferDraft && window.DraftUtils.hasTransferDraft(draft);
|
||||
},
|
||||
// 使用全域 DraftUtils 工具函數
|
||||
showError(message) {
|
||||
this.dialog.errorMessage = message;
|
||||
},
|
||||
clearError() {
|
||||
this.dialog.errorMessage = '';
|
||||
},
|
||||
loadTableData() {
|
||||
this.loading = true;
|
||||
axios.get('../../api/transfer_register/personal_reconcile_list')
|
||||
.then(res => {
|
||||
this.items = res.data;
|
||||
})
|
||||
.catch(() => {
|
||||
this.items = [];
|
||||
})
|
||||
.finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
showReconcileDialog(item) {
|
||||
this.dialog.selected = item;
|
||||
this.dialog.items = [];
|
||||
this.dialog.show = true;
|
||||
// 依 f_num 呼叫 API 取得訂單明細
|
||||
if (item.f_num) {
|
||||
axios.get('../../api/transfer_register/follower_orders', { params: { f_num: item.f_num } })
|
||||
.then(res => {
|
||||
this.dialog.items = res.data;
|
||||
this.loadFromDraftOrAutoDistribute();
|
||||
})
|
||||
.catch(() => {
|
||||
this.dialog.items = [];
|
||||
this.updateSumReconcile();
|
||||
});
|
||||
} else {
|
||||
this.dialog.items = [];
|
||||
this.updateSumReconcile();
|
||||
}
|
||||
},
|
||||
autoDistributeReconcile() {
|
||||
// 先進先出分配沖帳金額
|
||||
let remainAmount = this.dialog.selected ? this.dialog.selected.check_amount : 0;
|
||||
|
||||
// 先將所有項目的 reconcile 清為 0
|
||||
this.dialog.items.forEach(item => {
|
||||
this.$set(item, 'reconcile', 0);
|
||||
});
|
||||
|
||||
// 依報名日期排序(先進先出)
|
||||
const sortedItems = [...this.dialog.items].sort((a, b) =>
|
||||
new Date(a.reg_time) - new Date(b.reg_time)
|
||||
);
|
||||
|
||||
// 逐項分配
|
||||
sortedItems.forEach(item => {
|
||||
if (remainAmount > 0) {
|
||||
const canPay = Math.min(item.due, remainAmount);
|
||||
const originalItem = this.dialog.items.find(i => i === item);
|
||||
if (originalItem) {
|
||||
this.$set(originalItem, 'reconcile', canPay);
|
||||
}
|
||||
remainAmount -= canPay;
|
||||
}
|
||||
});
|
||||
|
||||
this.updateSumReconcile();
|
||||
},
|
||||
redistributeReconcile() {
|
||||
// 重新依先進先出原則分配沖帳金額
|
||||
this.autoDistributeReconcile();
|
||||
},
|
||||
updateSumReconcile() {
|
||||
// 只更新 hasUnallocated 狀態
|
||||
const maxTotal = this.dialog.selected ? (this.dialog.selected.check_amount || 0) : 0;
|
||||
this.hasUnallocated = maxTotal > this.sumReconcile;
|
||||
},
|
||||
loadFromDraftOrAutoDistribute() {
|
||||
const draft = this.dialog.selected ? this.dialog.selected.draft : null;
|
||||
|
||||
if (draft && draft.trim() && window.DraftUtils && window.DraftUtils.getDraftField) {
|
||||
const transferDraft = window.DraftUtils.getDraftField(draft, 'transfer_draft');
|
||||
if (transferDraft && Array.isArray(transferDraft)) {
|
||||
this.loadFromDraft(transferDraft);
|
||||
} else {
|
||||
this.autoDistributeReconcile();
|
||||
}
|
||||
} else {
|
||||
this.autoDistributeReconcile();
|
||||
}
|
||||
},
|
||||
loadFromDraft(draftData) {
|
||||
this.draftDataChanged = false;
|
||||
|
||||
// 先將所有項目的 reconcile 設為 0
|
||||
this.dialog.items.forEach(item => {
|
||||
this.$set(item, 'reconcile', 0);
|
||||
});
|
||||
|
||||
// 從 draft 資料填入沖帳金額
|
||||
draftData.forEach(draftItem => {
|
||||
const matchedItem = this.dialog.items.find(item =>
|
||||
item.num === draftItem.pro_order_detail_num
|
||||
);
|
||||
|
||||
if (matchedItem) {
|
||||
this.$set(matchedItem, 'reconcile', draftItem.reconcile || 0);
|
||||
} else {
|
||||
// 找不到對應的項目,標記資料已改動
|
||||
this.draftDataChanged = true;
|
||||
}
|
||||
});
|
||||
|
||||
this.updateSumReconcile();
|
||||
|
||||
// 如果有資料改動,提醒用戶
|
||||
if (this.draftDataChanged) {
|
||||
setTimeout(() => {
|
||||
alert('資料已改動,請注意金額一致性');
|
||||
}, 100);
|
||||
}
|
||||
},
|
||||
saveDraft() {
|
||||
try {
|
||||
// 組成新的 transfer_draft 資料
|
||||
const transferDraftData = this.dialog.items
|
||||
.filter(item => Number(item.reconcile) > 0)
|
||||
.map(item => ({
|
||||
pro_order_detail_num: item.num,
|
||||
reconcile: Number(item.reconcile)
|
||||
}));
|
||||
|
||||
// 使用工具函數安全地更新 draft 物件
|
||||
const currentDraft = this.dialog.selected.draft || '';
|
||||
let draftJson = '';
|
||||
|
||||
if (window.DraftUtils && window.DraftUtils.updateDraftField) {
|
||||
const newDraftObj = window.DraftUtils.updateDraftField(currentDraft, 'transfer_draft', transferDraftData);
|
||||
draftJson = JSON.stringify(newDraftObj);
|
||||
} else {
|
||||
// 如果 DraftUtils 不可用,使用簡單的格式
|
||||
draftJson = JSON.stringify({ transfer_draft: transferDraftData });
|
||||
}
|
||||
|
||||
// 更新 draft 欄位
|
||||
const updateData = {
|
||||
id: this.dialog.selected.id,
|
||||
activity_num: this.dialog.selected.activity_num,
|
||||
name: this.dialog.selected.name,
|
||||
phone: this.dialog.selected.phone,
|
||||
pay_type: this.dialog.selected.pay_type,
|
||||
account_last5: this.dialog.selected.account_last5,
|
||||
amount: this.dialog.selected.amount,
|
||||
pay_mode: this.dialog.selected.pay_mode,
|
||||
note: this.dialog.selected.note,
|
||||
proof_img: this.dialog.selected.proof_img,
|
||||
status: this.dialog.selected.status,
|
||||
f_num_match: this.dialog.selected.f_num_match,
|
||||
f_num: this.dialog.selected.f_num,
|
||||
acc_num: this.dialog.selected.acc_num,
|
||||
check_date: this.dialog.selected.check_date,
|
||||
check_amount: this.dialog.selected.check_amount,
|
||||
check_memo: this.dialog.selected.check_memo,
|
||||
check_status: this.dialog.selected.check_status,
|
||||
acc_kind: this.dialog.selected.acc_kind,
|
||||
member_num: this.dialog.selected.member_num,
|
||||
verify_time: this.dialog.selected.verify_time,
|
||||
verify_note: this.dialog.selected.verify_note,
|
||||
draft: draftJson // 更新 draft 欄位
|
||||
};
|
||||
|
||||
axios.put(`../../api/transfer_register/${this.dialog.selected.id}`, updateData)
|
||||
.then(() => {
|
||||
alert('暫存成功!');
|
||||
// 更新本地資料
|
||||
this.dialog.selected.draft = draftJson;
|
||||
})
|
||||
.catch(err => {
|
||||
alert('暫存失敗:' + (err.response?.data?.message || err.message));
|
||||
});
|
||||
|
||||
} catch (e) {
|
||||
alert('暫存失敗:資料格式錯誤');
|
||||
}
|
||||
},
|
||||
confirmReconcile() {
|
||||
if (!this.canConfirm) {
|
||||
this.showError(this.buttonErrorMessage);
|
||||
return;
|
||||
}
|
||||
|
||||
this.dialog.loading = true;
|
||||
const over_payment = this.dialog.selected.check_amount - this.sumReconcile;
|
||||
const postData = {
|
||||
transfer_register_id: this.dialog.selected.id,
|
||||
details: this.dialog.items
|
||||
.filter(item => item.reconcile > 0)
|
||||
.map(item => ({
|
||||
pro_order_detail_num: item.num,
|
||||
amount: Number(item.reconcile),
|
||||
reg_time: new Date().toISOString(),
|
||||
demo: `${this.dialog.selected.check_memo || ''}`
|
||||
})),
|
||||
over_payment: over_payment
|
||||
};
|
||||
|
||||
axios.post('../../api/transfer_register/reconcile', postData)
|
||||
.then(res => {
|
||||
// 顯示成功訊息
|
||||
const message = res.data && res.data.message ? res.data.message : '沖帳完成';
|
||||
msgtop(message, 'success');
|
||||
|
||||
this.dialog.show = false;
|
||||
this.loadTableData(); // 重新載入清單
|
||||
})
|
||||
.catch(err => {
|
||||
let errorMessage = '沖帳失敗,請聯繫系統管理員';
|
||||
if (err.response && err.response.data) {
|
||||
if (typeof err.response.data === 'string') {
|
||||
errorMessage = err.response.data;
|
||||
} else if (err.response.data.message) {
|
||||
errorMessage = err.response.data.message;
|
||||
if (err.response.data.exceptionMessage) {
|
||||
errorMessage += `\\n${err.response.data.exceptionMessage}`;
|
||||
}
|
||||
}
|
||||
}
|
||||
alert(errorMessage);
|
||||
})
|
||||
.finally(() => {
|
||||
this.dialog.loading = false;
|
||||
});
|
||||
},
|
||||
validateAndUpdateReconcile(value, item, index) {
|
||||
let numValue = Number(value);
|
||||
if (isNaN(numValue)) {
|
||||
numValue = 0;
|
||||
}
|
||||
numValue = Math.round(numValue);
|
||||
|
||||
this.$set(item, 'reconcile', numValue);
|
||||
this.updateSumReconcile();
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,193 @@
|
||||
<template>
|
||||
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-12 col-md-8 col-lg-6">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-primary text-white text-center">
|
||||
<h4 class="mb-0">登錄匯款資料</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form id="transferForm" @submit.prevent="submitForm" enctype="multipart/form-data" autocomplete="off">
|
||||
<!-- 法會名稱 -->
|
||||
<div class="mb-3">
|
||||
<label for="activity_num" class="form-label">法會名稱 <span class="text-danger">*</span></label>
|
||||
<select class="form-select" id="activity_num" v-model="formData.activity_num" required>
|
||||
<option value="">請選擇</option>
|
||||
<option v-for="activity in activities" :key="activity.num" :value="activity.num">
|
||||
{{activity.subject}}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<!-- 姓名 -->
|
||||
<div class="mb-3">
|
||||
<label for="name" class="form-label">姓名 <span class="text-danger">*</span></label>
|
||||
<input type="text" class="form-control" id="name" v-model="formData.name" required maxlength="50" placeholder="請輸入姓名" @blur="onNameBlur">
|
||||
</div>
|
||||
<!-- 電話 -->
|
||||
<div class="mb-3">
|
||||
<label for="phone" class="form-label">電話 <span class="text-danger">*</span></label>
|
||||
<input type="tel" class="form-control" id="phone" v-model="formData.phone" required maxlength="30" placeholder="請輸入聯絡電話">
|
||||
</div>
|
||||
<!-- 支付方式 -->
|
||||
<div class="mb-3">
|
||||
<label for="pay_type" class="form-label">支付方式 <span class="text-danger">*</span></label>
|
||||
<select class="form-select" id="pay_type" v-model="formData.pay_type" required>
|
||||
<option value="">請選擇</option>
|
||||
<option v-for="(desc, value) in payTypes" :key="value" :value="value">
|
||||
{{desc}}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<!-- 帳號後五碼 -->
|
||||
<div class="mb-3">
|
||||
<label for="account_last5" class="form-label">帳號後五碼(若無免填)</label>
|
||||
<input type="text" class="form-control" id="account_last5" v-model="formData.account_last5" maxlength="10" placeholder="如有匯款請填寫">
|
||||
</div>
|
||||
<!-- 支付金額 -->
|
||||
<div class="mb-3">
|
||||
<label for="amount" class="form-label">支付金額 <span class="text-danger">*</span></label>
|
||||
<input type="number" class="form-control" id="amount" v-model="formData.amount" required min="1" step="1" placeholder="請輸入金額">
|
||||
</div>
|
||||
<!-- 支付型態 -->
|
||||
<div class="mb-3">
|
||||
<label class="form-label">支付型態 <span class="text-danger">*</span></label>
|
||||
<div class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="radio" name="pay_mode" id="pay_mode1" value="個人" v-model="formData.pay_mode" checked>
|
||||
<label class="form-check-label" for="pay_mode1">個人支付</label>
|
||||
</div>
|
||||
<div class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="radio" name="pay_mode" id="pay_mode2" value="共同" v-model="formData.pay_mode">
|
||||
<label class="form-check-label" for="pay_mode2">共同支付</label>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 備註 -->
|
||||
<div class="mb-3">
|
||||
<label for="note" class="form-label">備註</label>
|
||||
<textarea class="form-control" id="note" v-model="formData.note" rows="2" maxlength="200" placeholder="如有分攤人名、金額、項目等請說明"></textarea>
|
||||
</div>
|
||||
<!-- 憑證上傳 -->
|
||||
<div class="mb-3">
|
||||
<label for="proof_img" class="form-label">上傳匯款憑證(可拍照)</label>
|
||||
<input class="form-control" type="file" id="proof_img" @change="handleFileUpload" accept="image/*" capture="environment">
|
||||
</div>
|
||||
<!-- 送出/關閉 -->
|
||||
<div class="d-grid gap-2">
|
||||
<button type="submit" class="btn btn-primary btn-lg" :disabled="isSubmitting || !canSubmit">
|
||||
{{ isSubmitting ? '處理中...' : '送出資料' }}
|
||||
</button>
|
||||
<button type="button" class="btn btn-outline-secondary" @click="closeWindow">離開</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="mt-3 text-muted small">
|
||||
<ul>
|
||||
<li>如一位組頭幫多人匯款,請在備註欄分拆明細(人名、金額、項目等)。</li>
|
||||
<li>送出後直接新增記錄,不顯示查核。</li>
|
||||
<li>如無姓名/電話資料,系統會提示。</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
<script>
|
||||
module.exports = {
|
||||
// 1. 移除 el: '#register'
|
||||
// 2. data 必須改成 function 形式
|
||||
data() {
|
||||
return {
|
||||
activities: [],
|
||||
formData: {
|
||||
activity_num: '',
|
||||
name: '',
|
||||
phone: '',
|
||||
pay_type: '',
|
||||
account_last5: '',
|
||||
amount: '',
|
||||
pay_mode: '個人',
|
||||
note: '',
|
||||
proof_img: null
|
||||
},
|
||||
payTypes: {
|
||||
'1': '現金',
|
||||
'2': '匯款',
|
||||
'3': '支票'
|
||||
},
|
||||
isSubmitting: false,
|
||||
canSubmit: true
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.loadActivities();
|
||||
},
|
||||
methods: {
|
||||
loadActivities() {
|
||||
const today = new Date().toISOString().split('T')[0];
|
||||
axios.get(`../../api/activity?endDate=${today}`)
|
||||
.then(response => {
|
||||
this.activities = response.data;
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('載入活動列表失敗:', error);
|
||||
alert('載入活動列表失敗,請重新整理頁面');
|
||||
});
|
||||
},
|
||||
handleFileUpload(event) {
|
||||
this.formData.proof_img = event.target.files[0];
|
||||
},
|
||||
submitForm() {
|
||||
if (this.isSubmitting || !this.canSubmit) return;
|
||||
this.isSubmitting = true;
|
||||
|
||||
const formData = new FormData();
|
||||
Object.keys(this.formData).forEach(key => {
|
||||
if (this.formData[key] !== null) {
|
||||
formData.append(key, this.formData[key]);
|
||||
}
|
||||
});
|
||||
|
||||
axios.post('../../api/transfer_register', formData, {
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data'
|
||||
}
|
||||
})
|
||||
.then(response => {
|
||||
alert('資料已成功送出!');
|
||||
this.formData = {
|
||||
activity_num: '',
|
||||
name: '',
|
||||
phone: '',
|
||||
pay_type: '',
|
||||
account_last5: '',
|
||||
amount: '',
|
||||
pay_mode: '個人',
|
||||
note: '',
|
||||
proof_img: null
|
||||
};
|
||||
this.canSubmit = false;
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('送出失敗:', error);
|
||||
// 增加錯誤保護,避免 response.data.message 不存在時報錯
|
||||
const errorMsg = error.response && error.response.data && error.response.data.message
|
||||
? error.response.data.message
|
||||
: '請檢查網路連線或系統狀態';
|
||||
alert('送出失敗 :' + errorMsg);
|
||||
})
|
||||
.finally(() => {
|
||||
this.isSubmitting = false;
|
||||
});
|
||||
},
|
||||
closeWindow() {
|
||||
// 3. 修正關閉邏輯:因為現在是開在 Dialog 裡,window.close() 關不掉
|
||||
// 改為觸發一個事件,通知父層 (index.aspx) 把彈跳視窗關掉
|
||||
this.$emit('close-dialog');
|
||||
},
|
||||
onNameBlur() {
|
||||
this.canSubmit = !!this.formData.name.trim();
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,461 @@
|
||||
<template>
|
||||
<v-container>
|
||||
<v-card>
|
||||
<v-card-title class="bg-success white--text text-center">
|
||||
<h5 class="mb-0">出納核對匯款人</h5>
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn color="primary" @click="submitData">確認送出</v-btn>
|
||||
<v-btn color="primary" class="ml-2" @click="closeWindow">關閉</v-btn>
|
||||
</v-card-title>
|
||||
<v-card-text>
|
||||
<v-data-table :headers="headers"
|
||||
:items="items"
|
||||
:loading="loading"
|
||||
loading-text="載入中..."
|
||||
class="elevation-1 mt-3"
|
||||
item-key="id"
|
||||
:expanded.sync="expanded"
|
||||
show-expand>
|
||||
<template v-slot:item.info="{ item }">
|
||||
<div>
|
||||
<div><span class="text-muted">姓名:</span>{{ item.name }}</div>
|
||||
<div><span class="text-muted">電話:</span>{{ item.phone }}</div>
|
||||
<div><span class="text-muted">法會:</span>{{ getActivityName(item.activity_num) }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.f_num="{ item }">
|
||||
<span v-if="item.f_num && item.follower">
|
||||
<a :href="'/admin/follower/reg.aspx?num=' + item.follower.num"
|
||||
class="text-success"
|
||||
target="_blank">
|
||||
{{ item.follower.u_name }}(F{{ item.f_num }})
|
||||
</a>
|
||||
<div class="small text-muted">
|
||||
電話:{{ item.follower.phone }}<br>
|
||||
手機:{{ item.follower.cellphone }}
|
||||
</div>
|
||||
</span>
|
||||
<span v-else class="text-danger">未自動比對</span>
|
||||
</template>
|
||||
|
||||
<template v-slot:expanded-item="{ headers, item }">
|
||||
<td :colspan="headers.length">
|
||||
<div class="pa-4">
|
||||
<h6 class="mb-3 text-primary">
|
||||
<v-icon color="primary" small class="mr-1">mdi-receipt</v-icon>
|
||||
沖帳明細
|
||||
</h6>
|
||||
<v-container>
|
||||
<v-row class="font-weight-bold grey--text text--darken-2">
|
||||
<v-col>*入帳銀行/帳戶 | 支付資訊/帳號後5碼</v-col>
|
||||
<v-col>*入帳日期</v-col>
|
||||
<v-col>*入帳金額</v-col>
|
||||
<v-col>*收支項目</v-col>
|
||||
<!--<v-col>備註/狀態 | 核對記錄</v-col>-->
|
||||
</v-row>
|
||||
<v-row>
|
||||
<v-col>
|
||||
<div class="mb-2">
|
||||
<span class="badge bg-primary me-1" title="支付方式">{{ payTypeText[item.pay_type] || item.pay_type }}</span>
|
||||
<span class="badge bg-secondary" title="型態:個人/共同">{{ item.pay_mode }}</span>
|
||||
<span class="font-weight-bold text-primary" title="帳號後5碼">{{ item.account_last5 }}</span>
|
||||
</div>
|
||||
<div>
|
||||
<v-select :items="bankOptions"
|
||||
v-model="item.acc_num"
|
||||
dense
|
||||
outlined
|
||||
hide-details
|
||||
style="max-width: 200px"></v-select>
|
||||
</div>
|
||||
</v-col>
|
||||
<v-col>
|
||||
<div class="mb-2">
|
||||
<span class="text-muted small">登記日期:</span>
|
||||
<span class="font-weight-bold error--text"
|
||||
style="cursor:pointer"
|
||||
@click="$set(item, 'check_date', item.create_time ? item.create_time.split('T')[0] : '')"
|
||||
title="點擊帶入日期">
|
||||
{{ item.create_time | date }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<v-text-field v-model="item.check_date"
|
||||
type="date"
|
||||
dense
|
||||
outlined
|
||||
hide-details
|
||||
style="max-width: 140px"></v-text-field>
|
||||
</div>
|
||||
</v-col>
|
||||
<v-col>
|
||||
<div class="mb-2">
|
||||
<span class="text-muted small">金額:</span>
|
||||
<span class="font-weight-bold error--text"
|
||||
style="cursor:pointer"
|
||||
@click="$set(item, 'check_amount', item.amount)"
|
||||
title="點擊帶入金額">
|
||||
{{ item.amount | currency }}
|
||||
</span>
|
||||
</div>
|
||||
<div>
|
||||
<v-text-field v-model="item.check_amount"
|
||||
type="number"
|
||||
dense
|
||||
outlined
|
||||
hide-details
|
||||
style="max-width: 100px"></v-text-field>
|
||||
</div>
|
||||
</v-col>
|
||||
<v-col>
|
||||
<div class="mb-2">
|
||||
<span class="badge bg-primary me-1" title="支付方式">收支項目</span>
|
||||
</div>
|
||||
<div>
|
||||
<v-select :items="accountingKinds"
|
||||
v-model="item.kind"
|
||||
dense
|
||||
outlined
|
||||
hide-details
|
||||
style="max-width: 200px"></v-select>
|
||||
</div>
|
||||
</v-col>
|
||||
|
||||
</v-row>
|
||||
</v-container>
|
||||
</div>
|
||||
</td>
|
||||
</template>
|
||||
|
||||
<template v-slot:item.actions="{ item }">
|
||||
<v-btn small outlined color="primary" @click="openFollowerDialog(item)">選擇信眾</v-btn>
|
||||
</template>
|
||||
<template v-slot:item.check_memo="{ item }">
|
||||
<div class="d-flex align-center my-2" style="min-width: 300px">
|
||||
<v-text-field v-model="item.check_memo"
|
||||
dense
|
||||
outlined
|
||||
hide-details
|
||||
class="mr-2"
|
||||
style="width: 180px"
|
||||
placeholder="帳簿備註"></v-text-field>
|
||||
<v-select :items="checkStatusOptions"
|
||||
v-model="item.check_status"
|
||||
item-text="text"
|
||||
item-value="value"
|
||||
dense
|
||||
outlined
|
||||
hide-details
|
||||
style="width: 110px"
|
||||
:menu-props="{ contentClass: 'mini-dropdown', maxHeight: 200 }"></v-select>
|
||||
</div>
|
||||
</template>
|
||||
</v-data-table>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
|
||||
<v-dialog v-model="follower_dialog.show" max-width="800px">
|
||||
<v-card>
|
||||
<v-card-title class="grey lighten-2">
|
||||
選擇信眾
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn icon @click="follower_dialog.show = false">
|
||||
<v-icon>mdi-close</v-icon>
|
||||
</v-btn>
|
||||
</v-card-title>
|
||||
|
||||
<v-card-text class="pt-4">
|
||||
<v-row>
|
||||
<v-col cols="12">
|
||||
<v-text-field v-model="follower_dialog.search"
|
||||
label="搜尋信眾 (按 Enter 搜尋)"
|
||||
prepend-icon="mdi-magnify"
|
||||
@keyup.enter="searchFollowers"
|
||||
clearable></v-text-field>
|
||||
</v-col>
|
||||
</v-row>
|
||||
|
||||
<v-data-table :headers="follower_dialog.headers"
|
||||
:items="follower_dialog.items"
|
||||
:loading="follower_dialog.loading"
|
||||
item-key="num"
|
||||
class="elevation-1"
|
||||
@click:row="selectFollower">
|
||||
<template v-slot:item.actions="{ item }">
|
||||
<v-btn small color="primary" @click.stop="selectFollower(item)">
|
||||
選擇
|
||||
</v-btn>
|
||||
</template>
|
||||
</v-data-table>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
|
||||
|
||||
<v-snackbar v-model="snackbar.show" :timeout="3000" top color="error">
|
||||
{{ snackbar.text }}
|
||||
<template v-slot:action="{ attrs }">
|
||||
<v-btn dark text v-bind="attrs" @click="snackbar.show = false">關閉</v-btn>
|
||||
</template>
|
||||
</v-snackbar>
|
||||
</v-container>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
module.exports = {
|
||||
data() {
|
||||
return {
|
||||
// 【修正點3】補上 snackbar 的資料定義
|
||||
snackbar: {
|
||||
show: false,
|
||||
text: ''
|
||||
},
|
||||
headers: [
|
||||
{ text: '匯款人資訊', value: 'info' },
|
||||
{ text: '對應信眾', value: 'f_num' },
|
||||
{ text: '選擇信眾', value: 'actions', sortable: false },
|
||||
{ text: '備註/狀態 | 核對記錄', value: 'check_memo' }
|
||||
//{ text: '狀態 | 核對記錄', value: 'status' },
|
||||
],
|
||||
// detailHeaders 可保留供其他地方參考,但不應放入 expanded 插槽變數中
|
||||
detailHeaders: [
|
||||
{ text: '匯款人資訊', value: 'info' },
|
||||
{ text: '匯款備註/相片', value: 'note' },
|
||||
{ text: '*入帳銀行/帳戶 | 支付資訊/帳號後5碼', value: 'acc_num' },
|
||||
{ text: '*入帳日期', value: 'check_date' },
|
||||
{ text: '*入帳金額', value: 'check_amount' },
|
||||
{ text: '*收支項目', value: 'kind' },
|
||||
{ text: '備註/狀態 | 核對記錄', value: 'check_memo' }
|
||||
],
|
||||
items: [],
|
||||
bankOptions: [],
|
||||
accountingKinds: [],
|
||||
checkStatusOptions: [
|
||||
{ text: '', value: '' },
|
||||
{ text: '未核對', value: '1' },
|
||||
{ text: '核對', value: '2' },
|
||||
{ text: '金額不符', value: '3' },
|
||||
{ text: '其他問題', value: '4' },
|
||||
{ text: '作廢', value: '5' }
|
||||
],
|
||||
payTypeText: {
|
||||
1: '現金',
|
||||
2: '匯款',
|
||||
3: '支票'
|
||||
},
|
||||
activities: [],
|
||||
expanded: [],
|
||||
loading: false,
|
||||
statusOptions: [
|
||||
{ text: '', value: '' },
|
||||
{ text: '待確認', value: '1' },
|
||||
{ text: '確認', value: '2' },
|
||||
{ text: '作廢', value: '3' }
|
||||
],
|
||||
follower_dialog: {
|
||||
show: false,
|
||||
loading: false,
|
||||
search: '',
|
||||
headers: [
|
||||
{ text: '編號', value: 'num' },
|
||||
{ text: '姓名', value: 'u_name' },
|
||||
{ text: '地址', value: 'address' },
|
||||
// 【修正點2】補上操作欄位定義,這樣按鈕才出得來
|
||||
{ text: '操作', value: 'actions', sortable: false }
|
||||
],
|
||||
items: [],
|
||||
selected: null,
|
||||
current_item: null
|
||||
}
|
||||
};
|
||||
},
|
||||
filters: {
|
||||
currency(val) {
|
||||
if (!val) return '';
|
||||
return Number(val).toLocaleString();
|
||||
},
|
||||
date(val) {
|
||||
if (!val) return '';
|
||||
return val.split('T')[0];
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getActivityName(num) {
|
||||
const act = this.activities.find(a => a.num === num);
|
||||
return act ? act.subject : '';
|
||||
},
|
||||
openFollowerDialog(item) {
|
||||
this.follower_dialog.current_item = item;
|
||||
this.follower_dialog.show = true;
|
||||
// 若開啟時已有關鍵字,可以自動帶入搜尋
|
||||
// this.searchFollowers();
|
||||
},
|
||||
async searchFollowers() {
|
||||
if (!this.follower_dialog.search) return;
|
||||
|
||||
this.follower_dialog.loading = true;
|
||||
try {
|
||||
const response = await axios.post(HTTP_HOST + 'api/follower/GetList', {
|
||||
f_number: this.follower_dialog.search,
|
||||
u_name: this.follower_dialog.search
|
||||
}, {
|
||||
params: {
|
||||
page: 1,
|
||||
pageSize: 10
|
||||
}
|
||||
});
|
||||
this.follower_dialog.items = response.data.list || [];
|
||||
} catch (error) {
|
||||
console.error('Error fetching followers:', error);
|
||||
this.snackbar.text = "查詢信眾失敗,請確認網路或 API 狀態";
|
||||
this.snackbar.show = true;
|
||||
} finally {
|
||||
this.follower_dialog.loading = false;
|
||||
}
|
||||
},
|
||||
async selectFollower(follower) {
|
||||
if (this.follower_dialog.current_item) {
|
||||
try {
|
||||
this.follower_dialog.show = false;
|
||||
|
||||
const selectedFollower = this.follower_dialog.items.find(item => item.num === follower.num);
|
||||
|
||||
if (selectedFollower) {
|
||||
this.follower_dialog.current_item.f_num = follower.num;
|
||||
this.follower_dialog.current_item.follower = {
|
||||
num: selectedFollower.num,
|
||||
u_name: selectedFollower.u_name,
|
||||
address: selectedFollower.address || '',
|
||||
phone: selectedFollower.phoneDes || '',
|
||||
cellphone: selectedFollower.cellphoneDes || ''
|
||||
};
|
||||
} else {
|
||||
throw new Error('找不到信眾詳細資料');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('取得信眾詳細資料失敗:', error);
|
||||
this.snackbar.text = '取得信眾詳細資料失敗,請重試';
|
||||
this.snackbar.show = true;
|
||||
|
||||
this.follower_dialog.current_item.f_num = follower.num;
|
||||
this.follower_dialog.current_item.follower = {
|
||||
num: follower.num,
|
||||
u_name: follower.u_name,
|
||||
address: follower.address || '',
|
||||
phone: '',
|
||||
cellphone: ''
|
||||
};
|
||||
}
|
||||
}
|
||||
},
|
||||
async loadData() {
|
||||
this.loading = true;
|
||||
try {
|
||||
const actRes = await axios.get('../../api/activity');
|
||||
this.activities = actRes.data;
|
||||
|
||||
const res = await axios.get('../../api/transfer_register/pending');
|
||||
this.items = res.data.map(item => ({
|
||||
...item,
|
||||
status: item.status ? String(item.status) : ''
|
||||
}));
|
||||
|
||||
const bankRes = await axios.post('../../api/accounting/GetAccountKindList', {}, { params: { page: 1, pageSize: 1000 } });
|
||||
this.bankOptions = bankRes.data.list.map(x => ({
|
||||
text: x.kind + (x.bank_name ? ' - ' + x.bank_name : '') + (x.bank_id ? ' (' + x.bank_id + ')' : ''),
|
||||
value: x.num
|
||||
}));
|
||||
|
||||
const kindRes = await axios.post('../../api/accounting/GetTitleKindList', {}, { params: { page: 1, pageSize: 1000 } });
|
||||
this.accountingKinds = kindRes.data.list.map(x => ({
|
||||
text: x.kind,
|
||||
value: x.num
|
||||
}));
|
||||
} catch (e) {
|
||||
console.error('載入資料失敗:', e);
|
||||
this.snackbar.text = '載入資料失敗';
|
||||
this.snackbar.show = true;
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
async saveData() {
|
||||
const updateList = this.items.map(item => ({
|
||||
id: item.id,
|
||||
f_num: item.f_num,
|
||||
status: item.status ? String(item.status) : '',
|
||||
verify_note: item.verify_note
|
||||
// 備註:依您的原本邏輯,這裡並未傳送 check_date, check_amount 等欄位,若後端 API 需要這些沖帳資訊,請在這裡一併補上。
|
||||
}));
|
||||
|
||||
try {
|
||||
const res = await axios.post('../../api/transfer_register/batch_update', updateList);
|
||||
if (res.data && res.data.success) {
|
||||
alert('儲存成功!');
|
||||
await this.loadData();
|
||||
} else {
|
||||
alert('儲存失敗,請重試!!');
|
||||
}
|
||||
} catch (e) {
|
||||
alert('儲存失敗,請重試:' + e.message);
|
||||
}
|
||||
},
|
||||
async submitData() {
|
||||
// 檢查必填欄位 - 入帳銀行/帳戶
|
||||
const missingAccNum = this.items.filter(item => !item.acc_num);
|
||||
if (missingAccNum.length > 0) {
|
||||
alert('請選擇入帳銀行/帳戶!有 ' + missingAccNum.length + ' 筆資料未選擇。');
|
||||
return;
|
||||
}
|
||||
|
||||
// 檢查必填欄位 - 入帳日期
|
||||
const missingCheckDate = this.items.filter(item => !item.check_date);
|
||||
if (missingCheckDate.length > 0) {
|
||||
alert('請填寫入帳日期!有 ' + missingCheckDate.length + ' 筆資料未填寫。');
|
||||
return;
|
||||
}
|
||||
|
||||
// 檢查必填欄位 - 入帳金額
|
||||
const missingCheckAmount = this.items.filter(item => !item.check_amount || item.check_amount <= 0);
|
||||
if (missingCheckAmount.length > 0) {
|
||||
alert('請填寫入帳金額!有 ' + missingCheckAmount.length + ' 筆資料未填寫或金額無效。');
|
||||
return;
|
||||
}
|
||||
|
||||
// 組出要更新的資料
|
||||
const updateList = this.items.map(item => ({
|
||||
id: item.id,
|
||||
f_num: item.f_num,
|
||||
status: '2',
|
||||
check_status: item.check_status ? String(item.check_status) : '',
|
||||
verify_note: item.verify_note,
|
||||
acc_num: item.acc_num,
|
||||
check_date: item.check_date,
|
||||
check_amount: item.check_amount,
|
||||
check_memo: item.check_memo,
|
||||
kind: item.kind,
|
||||
verify_note: item.verify_note
|
||||
}));
|
||||
try {
|
||||
const res = await axios.post('../../api/transfer_register/batch_update', updateList);
|
||||
if (res.data && res.data.success) {
|
||||
alert('送出成功!');
|
||||
// 重新載入資料
|
||||
await this.loadData();
|
||||
} else {
|
||||
alert('送出失敗,請重試 :' + res.data.message);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('送出失敗:', e);
|
||||
alert('送出失敗,請再試一次!');
|
||||
}
|
||||
},
|
||||
closeWindow() {
|
||||
this.$emit('close-dialog');
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.loadData();
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,382 @@
|
||||
<template>
|
||||
<v-container>
|
||||
<v-card>
|
||||
<v-card-title class="bg-primary white--text text-center">
|
||||
<h5 class="mb-0">沖帳查詢</h5>
|
||||
<button class="btn btn-default ms-auto"><i class="mdi mdi-close"></i></button>
|
||||
</v-card-title>
|
||||
<v-card-text>
|
||||
<v-row class="mb-0 mt-4">
|
||||
<v-col cols="12" md="2">
|
||||
<v-text-field v-model="query.start_date" label="起始日" type="date" dense outlined></v-text-field>
|
||||
</v-col>
|
||||
<v-col cols="12" md="2">
|
||||
<v-text-field v-model="query.end_date" label="結束日" type="date" dense outlined></v-text-field>
|
||||
</v-col>
|
||||
<v-col cols="12" md="3">
|
||||
<v-text-field v-model="query.activity_name" label="法會" dense outlined readonly>
|
||||
<template v-slot:append>
|
||||
<v-btn icon @click="showActivityDialog"><v-icon>mdi-magnify</v-icon></v-btn>
|
||||
</template>
|
||||
</v-text-field>
|
||||
</v-col>
|
||||
<v-col cols="12" md="3">
|
||||
<v-text-field v-model="query.follower_name" label="信眾" dense outlined readonly>
|
||||
<template v-slot:append>
|
||||
<v-btn icon @click="showFollowerDialog"><v-icon>mdi-magnify</v-icon></v-btn>
|
||||
</template>
|
||||
</v-text-field>
|
||||
</v-col>
|
||||
<v-col cols="12" md="2" class="d-flex justify-end">
|
||||
<v-btn color="primary" class="mr-2" @click="search">查詢</v-btn>
|
||||
<v-btn color="grey" @click="reset">重設</v-btn>
|
||||
</v-col>
|
||||
</v-row>
|
||||
<v-data-table :headers="headers"
|
||||
:items="items"
|
||||
:loading="loading"
|
||||
loading-text="載入中..."
|
||||
class="elevation-1 verify-query-table"
|
||||
item-key="transfer_id"
|
||||
:footer-props="{ 'items-per-page-options': [10, 20, 50] }"
|
||||
:expanded.sync="expanded"
|
||||
show-expand>
|
||||
<template v-slot:item.follower="{ item }">
|
||||
<div>
|
||||
<div class="font-weight-bold">{{ item.follower }}</div>
|
||||
<div class="caption text--secondary">{{ item.transfer_name }}</div>
|
||||
<div class="caption text--secondary">{{ item.transfer_phone }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.activity_info="{ item }">
|
||||
<div>
|
||||
<div class="font-weight-bold">{{ item.activity_name }}</div>
|
||||
<div class="caption text--secondary">{{ item.acc_name }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.transfer_info="{ item }">
|
||||
<div>
|
||||
<div class="font-weight-bold text-primary">應收總額:{{ item.price_totals | currency }}</div>
|
||||
<div class="font-weight-bold text-primary">入帳金額:{{ item.transfer_check_amount | currency }}</div>
|
||||
<div class="text-success">沖帳日期:{{ item.transfer_check_date | date }}</div>
|
||||
<div v-if="item.transfer_remain_amount > 0" class="text-warning">
|
||||
剩餘金額:{{ item.transfer_remain_amount | currency }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.status_info="{ item }">
|
||||
<div>
|
||||
<v-chip small :color="getStatusColor(item.transfer_check_status)" text-color="white">
|
||||
{{ getStatusText(item.transfer_check_status) }}
|
||||
</v-chip>
|
||||
<div class="caption text--secondary mt-1">{{ item.transfer_check_memo }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.actions="{ item }">
|
||||
<v-btn color="info" outlined small @click="showDetailDialog(item)">
|
||||
<v-icon small class="mr-1">mdi-information-outline</v-icon> 詳細
|
||||
</v-btn>
|
||||
</template>
|
||||
<template v-slot:expanded-item="{ headers, item }">
|
||||
<td :colspan="headers.length">
|
||||
<div class="pa-4">
|
||||
<h6 class="mb-3 text-primary">
|
||||
<v-icon color="primary" small class="mr-1">mdi-receipt</v-icon>
|
||||
沖帳明細
|
||||
</h6>
|
||||
<v-data-table :headers="detailHeaders"
|
||||
:items="item.pro_order_records"
|
||||
class="elevation-1"
|
||||
hide-default-footer
|
||||
:disable-pagination="true"
|
||||
dense>
|
||||
<template v-slot:item.order_info="{ item }">
|
||||
<div>
|
||||
<div class="font-weight-bold">{{ item.pro_order_detail?.pro_order?.order_no }}</div>
|
||||
<div class="caption text--secondary">{{ item.pro_order_detail?.actitem_name }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.payment_info="{ item }">
|
||||
<div>
|
||||
<div class="font-weight-bold">{{ item.payment_name }}</div>
|
||||
<div class="caption text--secondary">{{ item.bank_code }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.amount_info="{ item }">
|
||||
<div>
|
||||
<div class="font-weight-bold text-success">{{ item.price | currency }}</div>
|
||||
<div class="caption text--secondary">{{ item.pay_date | date }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:item.memo="{ item }">
|
||||
<div style="white-space: pre-line;">{{ item.reconcile_memo }}</div>
|
||||
</template>
|
||||
</v-data-table>
|
||||
</div>
|
||||
</td>
|
||||
</template>
|
||||
</v-data-table>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
|
||||
<!-- 法會選取 Dialog -->
|
||||
<v-dialog v-model="activityDialog.show" max-width="700px">
|
||||
<v-card>
|
||||
<v-card-title class="grey lighten-2">
|
||||
<v-icon color="primary" class="mr-2">mdi-table</v-icon>
|
||||
選擇法會
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn icon @click="activityDialog.show = false"><v-icon>mdi-close</v-icon></v-btn>
|
||||
</v-card-title>
|
||||
<v-card-text class="mt-4">
|
||||
<v-text-field v-model="activityDialog.search" label="搜尋法會" dense outlined @keyup.enter="searchActivity"></v-text-field>
|
||||
<v-data-table :headers="activityDialog.headers"
|
||||
:items="activityDialog.items"
|
||||
:loading="activityDialog.loading"
|
||||
item-key="num"
|
||||
class="elevation-1 mt-2"
|
||||
@click:row="selectActivity"
|
||||
hide-default-footer></v-data-table>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
|
||||
<!-- 信眾選取 Dialog -->
|
||||
<v-dialog v-model="followerDialog.show" max-width="700px">
|
||||
<v-card>
|
||||
<v-card-title class="grey lighten-2">
|
||||
<v-icon color="primary" class="mr-2">mdi-account</v-icon>
|
||||
選擇信眾
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn icon @click="followerDialog.show = false"><v-icon>mdi-close</v-icon></v-btn>
|
||||
</v-card-title>
|
||||
<v-card-text class="mt-4">
|
||||
<v-text-field v-model="followerDialog.search" label="搜尋信眾" dense outlined @keyup.enter="searchFollower"></v-text-field>
|
||||
<v-data-table :headers="followerDialog.headers"
|
||||
:items="followerDialog.items"
|
||||
:loading="followerDialog.loading"
|
||||
item-key="num"
|
||||
class="elevation-1 mt-2"
|
||||
@click:row="selectFollower"
|
||||
hide-default-footer></v-data-table>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
|
||||
<!-- 詳細資訊對話框 -->
|
||||
<v-dialog v-model="dialog.show" max-width="900px">
|
||||
<v-card>
|
||||
<v-card-title class="grey lighten-2">
|
||||
<v-icon color="info" class="mr-2">mdi-information-outline</v-icon>
|
||||
詳細資訊
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn icon @click="dialog.show = false">
|
||||
<v-icon>mdi-close</v-icon>
|
||||
</v-btn>
|
||||
</v-card-title>
|
||||
<v-card-text>
|
||||
<div v-if="dialog.selected">
|
||||
<v-row>
|
||||
<v-col cols="12" md="6">
|
||||
<h6 class="mb-3 text-primary">匯款人資訊</h6>
|
||||
<div class="mb-2"><span class="font-weight-bold">姓名:</span>{{ dialog.selected.transfer_name }}</div>
|
||||
<div class="mb-2"><span class="font-weight-bold">電話:</span>{{ dialog.selected.transfer_phone }}</div>
|
||||
<div class="mb-2"><span class="font-weight-bold">信眾:</span>{{ dialog.selected.follower }}</div>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<h6 class="mb-3 text-success">入帳資訊</h6>
|
||||
<div class="mb-2"><span class="font-weight-bold">入帳帳戶:</span>{{ dialog.selected.acc_name }}</div>
|
||||
<div class="mb-2"><span class="font-weight-bold">入帳日期:</span>{{ dialog.selected.transfer_check_date | date }}</div>
|
||||
<div class="mb-2"><span class="font-weight-bold">入帳金額:</span>{{ dialog.selected.transfer_check_amount | currency }}</div>
|
||||
<div class="mb-2"><span class="font-weight-bold">應收總額:</span>{{ dialog.selected.price_totals | currency }}</div>
|
||||
</v-col>
|
||||
</v-row>
|
||||
<v-divider class="my-4"></v-divider>
|
||||
<v-row>
|
||||
<v-col cols="12" md="6">
|
||||
<h6 class="mb-3 text-purple">活動資訊</h6>
|
||||
<div class="mb-2"><span class="font-weight-bold">活動名稱:</span>{{ dialog.selected.activity_name || '-' }}</div>
|
||||
<div class="mb-2"><span class="font-weight-bold">支付方式:</span>{{ payTypeText[dialog.selected.transfer_pay_type] || dialog.selected.transfer_pay_type }}</div>
|
||||
<div class="mb-2"><span class="font-weight-bold">帳號後5碼:</span>{{ dialog.selected.transfer_account_last5 || '-' }}</div>
|
||||
</v-col>
|
||||
<v-col cols="12" md="6">
|
||||
<h6 class="mb-3 text-info">核對記錄</h6>
|
||||
<div class="mb-2"><span class="font-weight-bold">核對記錄:</span>{{ dialog.selected.transfer_verify_note || '-' }}</div>
|
||||
<div class="mb-2"><span class="font-weight-bold">帳簿備註:</span>{{ dialog.selected.transfer_check_memo || '-' }}</div>
|
||||
<div v-if="dialog.selected.transfer_proof_img" class="mb-2">
|
||||
<span class="font-weight-bold">證明圖片:</span>
|
||||
<a :href="'../../upload/transfer_proof/' + dialog.selected.transfer_proof_img" target="_blank">查看相片</a>
|
||||
</div>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</div>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
</v-container>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
module.exports = {
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
expanded: [],
|
||||
query: {
|
||||
start_date: '',
|
||||
end_date: '',
|
||||
activity_num: '',
|
||||
activity_name: '',
|
||||
follower_num: '',
|
||||
follower_name: ''
|
||||
},
|
||||
headers: [
|
||||
{ text: '信眾/匯款人', value: 'follower' },
|
||||
{ text: '法會/入帳帳戶', value: 'activity_info' },
|
||||
{ text: '入帳資訊', value: 'transfer_info' },
|
||||
{ text: '狀態/備註', value: 'status_info' },
|
||||
{ text: '操作', value: 'actions', sortable: false }
|
||||
],
|
||||
detailHeaders: [
|
||||
{ text: '訂單/項目', value: 'order_info' },
|
||||
{ text: '付款機構', value: 'payment_info' },
|
||||
{ text: '沖帳金額/日期', value: 'amount_info' },
|
||||
{ text: '備註', value: 'memo' }
|
||||
],
|
||||
items: [],
|
||||
dialog: {
|
||||
show: false,
|
||||
selected: null
|
||||
},
|
||||
activityDialog: {
|
||||
show: false,
|
||||
search: '',
|
||||
loading: false,
|
||||
items: [],
|
||||
headers: [
|
||||
{ text: '編號', value: 'num' },
|
||||
{ text: '名稱', value: 'subject' }
|
||||
]
|
||||
},
|
||||
followerDialog: {
|
||||
show: false,
|
||||
search: '',
|
||||
loading: false,
|
||||
items: [],
|
||||
headers: [
|
||||
{ text: '編號', value: 'num' },
|
||||
{ text: '姓名', value: 'u_name' }
|
||||
]
|
||||
},
|
||||
payTypeText: {
|
||||
1: '現金',
|
||||
2: '匯款',
|
||||
3: '支票'
|
||||
}
|
||||
}
|
||||
},
|
||||
filters: {
|
||||
currency(val) {
|
||||
if (!val) return '0';
|
||||
return Number(val).toLocaleString();
|
||||
},
|
||||
date(val) {
|
||||
if (!val) return '';
|
||||
const date = new Date(val);
|
||||
return date.toLocaleDateString();
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
search() {
|
||||
this.loading = true;
|
||||
// 串接查詢 API,帶入所有查詢條件
|
||||
axios.get('../../api/transfer_register/verify_order_record_query', { params: this.query })
|
||||
.then(res => {
|
||||
this.items = res.data;
|
||||
this.expanded = []; // 重置展開狀態
|
||||
})
|
||||
.catch(() => {
|
||||
this.items = [];
|
||||
this.expanded = [];
|
||||
})
|
||||
.finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
reset() {
|
||||
this.query.start_date = '';
|
||||
this.query.end_date = '';
|
||||
this.query.activity_num = '';
|
||||
this.query.activity_name = '';
|
||||
this.query.follower_num = '';
|
||||
this.query.follower_name = '';
|
||||
this.items = [];
|
||||
this.expanded = [];
|
||||
},
|
||||
showDetailDialog(item) {
|
||||
this.dialog.selected = item;
|
||||
this.dialog.show = true;
|
||||
},
|
||||
showActivityDialog() {
|
||||
this.activityDialog.show = true;
|
||||
this.searchActivity();
|
||||
},
|
||||
searchActivity() {
|
||||
this.activityDialog.loading = true;
|
||||
axios.get('../../api/activity', { params: { keyword: this.activityDialog.search } })
|
||||
.then(res => { this.activityDialog.items = res.data; })
|
||||
.catch(() => { this.activityDialog.items = []; })
|
||||
.finally(() => { this.activityDialog.loading = false; });
|
||||
},
|
||||
selectActivity(row) {
|
||||
this.query.activity_num = row.num;
|
||||
this.query.activity_name = row.subject;
|
||||
this.activityDialog.show = false;
|
||||
},
|
||||
showFollowerDialog() {
|
||||
this.followerDialog.show = true;
|
||||
this.searchFollower();
|
||||
},
|
||||
searchFollower() {
|
||||
this.followerDialog.loading = true;
|
||||
axios.post('../..../..../../api/follower/GetList', { u_name: this.followerDialog.search }, { params: { page: 1, pageSize: 10 } })
|
||||
.then(res => { this.followerDialog.items = res.data.list; })
|
||||
.catch(() => { this.followerDialog.items = []; })
|
||||
.finally(() => { this.followerDialog.loading = false; });
|
||||
},
|
||||
selectFollower(row) {
|
||||
this.query.follower_num = row.num;
|
||||
this.query.follower_name = row.u_name;
|
||||
this.followerDialog.show = false;
|
||||
},
|
||||
getStatusColor(status) {
|
||||
switch (status) {
|
||||
case '90': return 'warning';
|
||||
case '99': return 'success';
|
||||
default: return 'grey';
|
||||
}
|
||||
},
|
||||
getStatusText(status) {
|
||||
switch (status) {
|
||||
case '90': return '沖帳有剩餘';
|
||||
case '99': return '沖帳完成';
|
||||
default: return '未知狀態';
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.v-data-table.verify-query-table .v-data-table__wrapper tbody tr {
|
||||
min-height: 90px !important;
|
||||
height: 90px !important;
|
||||
}
|
||||
|
||||
.v-data-table.verify-query-table .v-data-table__wrapper tbody td {
|
||||
min-height: 90px !important;
|
||||
height: 90px !important;
|
||||
vertical-align: middle !important;
|
||||
}
|
||||
</style>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,104 @@
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.Services;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
|
||||
// 定義與前端一致的元素結構
|
||||
public class TabletElement
|
||||
{
|
||||
public string id { get; set; }
|
||||
public string type { get; set; }
|
||||
public string text { get; set; }
|
||||
public double x { get; set; }
|
||||
public double y { get; set; }
|
||||
public double? width { get; set; }
|
||||
public double? height { get; set; }
|
||||
public ElementStyle style { get; set; }
|
||||
public string hidden { get; set; }
|
||||
public double? twoOffset { get; set; }
|
||||
public double? threeOffset { get; set; }
|
||||
public double? fourOffset { get; set; }
|
||||
public int? breakLen { get; set; }
|
||||
public string backendInp { get; set; }
|
||||
public double? textWidth { get; set; }
|
||||
public double? textHeight { get; set; }
|
||||
|
||||
}
|
||||
|
||||
public class ElementStyle
|
||||
{
|
||||
public double fontSize { get; set; }
|
||||
public string fontFamily { get; set; }
|
||||
public bool isVertical { get; set; }
|
||||
public double letterSpacing { get; set; }
|
||||
public double lineHeight { get; set; }
|
||||
public double? itemSpacing { get; set; }
|
||||
public string visibility { get; set; }
|
||||
}
|
||||
|
||||
public partial class admin_item_TabletDesigner :MyWeb.config
|
||||
{
|
||||
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
[WebMethod]
|
||||
public static string SaveDesigner()
|
||||
{
|
||||
|
||||
return "";
|
||||
}
|
||||
[WebMethod]
|
||||
public static string GetConfig()
|
||||
{
|
||||
// 模擬原本的 GetConfig() 行為
|
||||
var config = new
|
||||
{
|
||||
elements = new List<TabletElement> {
|
||||
new TabletElement {
|
||||
id = "address", type = "address", text = "台中市潭子區中山路", x = 60, y = 80,
|
||||
style = new ElementStyle { fontSize = 24, fontFamily = "Kaiti", isVertical = true, letterSpacing = 5, lineHeight = 1.5,visibility="" }
|
||||
},
|
||||
new TabletElement {
|
||||
id = "title1", type = "ancestor", text = "張一\n李二\n陳三\n吳四\n劉五\n趙六\n林七\n徐八", x = 50, y = 80,
|
||||
width=136,height=600,textWidth=20,textHeight=90,
|
||||
style = new ElementStyle { fontSize = 16, fontFamily = "Kaiti", isVertical = true, letterSpacing = 1, lineHeight = 1 ,visibility="" }
|
||||
},
|
||||
new TabletElement {
|
||||
id = "lefttitle", type = "ancestor", text = "左正名", x = 10, y = 80,
|
||||
style = new ElementStyle { fontSize = 24, fontFamily = "Kaiti", isVertical = true, letterSpacing = 5, lineHeight = 1.5 ,visibility="" }
|
||||
},
|
||||
new TabletElement {
|
||||
id = "righttitle", type = "ancestor", text = "右正名", x = 50, y = 80,
|
||||
style = new ElementStyle { fontSize = 24, fontFamily = "Kaiti", isVertical = true, letterSpacing = 5, lineHeight = 1.5 ,visibility="" }
|
||||
},
|
||||
new TabletElement {
|
||||
id = "titletriangle", type = "roster", text = "張一\n李二\n陳三\n吳四\n劉五\n趙六\n林七\n徐八", x = 10, y = 80,
|
||||
style = new ElementStyle { fontSize = 24, fontFamily = "Kaiti", isVertical = true, letterSpacing = 5, lineHeight = 1.5,visibility="" }
|
||||
},
|
||||
new TabletElement
|
||||
{
|
||||
id="tricombined",type="combined-center",text="林張吳\n氏歷代祖先", x = 10, y = 80,
|
||||
style = new ElementStyle { fontSize = 24, fontFamily = "Kaiti", isVertical = true, letterSpacing = 5, lineHeight = 1.5 ,visibility="" }
|
||||
},
|
||||
new TabletElement
|
||||
{
|
||||
id="combined",type="combined-center",text="李王\n氏歷代祖先", x = 10, y = 80,
|
||||
style = new ElementStyle { fontSize = 24, fontFamily = "Kaiti", isVertical = true, letterSpacing = 5, lineHeight = 1.5 ,visibility="" }
|
||||
},
|
||||
new TabletElement
|
||||
{
|
||||
id="alive",type="alive",text="陽上名字", x = 60, y = 200,
|
||||
style = new ElementStyle { fontSize = 18, fontFamily = "Kaiti", isVertical = true, letterSpacing = 5, lineHeight = 1.5 ,visibility="" }
|
||||
}
|
||||
},
|
||||
paper = new { width = 100, height = 272, name = "Yellow" }
|
||||
};
|
||||
return JsonConvert.SerializeObject(config);
|
||||
}
|
||||
}
|
||||
+4085
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+4084
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+601
@@ -0,0 +1,601 @@
|
||||
/*!
|
||||
* Bootstrap Reboot v5.3.8 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2025 The Bootstrap Authors
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||
*/
|
||||
:root,
|
||||
[data-bs-theme=light] {
|
||||
--bs-blue: #0d6efd;
|
||||
--bs-indigo: #6610f2;
|
||||
--bs-purple: #6f42c1;
|
||||
--bs-pink: #d63384;
|
||||
--bs-red: #dc3545;
|
||||
--bs-orange: #fd7e14;
|
||||
--bs-yellow: #ffc107;
|
||||
--bs-green: #198754;
|
||||
--bs-teal: #20c997;
|
||||
--bs-cyan: #0dcaf0;
|
||||
--bs-black: #000;
|
||||
--bs-white: #fff;
|
||||
--bs-gray: #6c757d;
|
||||
--bs-gray-dark: #343a40;
|
||||
--bs-gray-100: #f8f9fa;
|
||||
--bs-gray-200: #e9ecef;
|
||||
--bs-gray-300: #dee2e6;
|
||||
--bs-gray-400: #ced4da;
|
||||
--bs-gray-500: #adb5bd;
|
||||
--bs-gray-600: #6c757d;
|
||||
--bs-gray-700: #495057;
|
||||
--bs-gray-800: #343a40;
|
||||
--bs-gray-900: #212529;
|
||||
--bs-primary: #0d6efd;
|
||||
--bs-secondary: #6c757d;
|
||||
--bs-success: #198754;
|
||||
--bs-info: #0dcaf0;
|
||||
--bs-warning: #ffc107;
|
||||
--bs-danger: #dc3545;
|
||||
--bs-light: #f8f9fa;
|
||||
--bs-dark: #212529;
|
||||
--bs-primary-rgb: 13, 110, 253;
|
||||
--bs-secondary-rgb: 108, 117, 125;
|
||||
--bs-success-rgb: 25, 135, 84;
|
||||
--bs-info-rgb: 13, 202, 240;
|
||||
--bs-warning-rgb: 255, 193, 7;
|
||||
--bs-danger-rgb: 220, 53, 69;
|
||||
--bs-light-rgb: 248, 249, 250;
|
||||
--bs-dark-rgb: 33, 37, 41;
|
||||
--bs-primary-text-emphasis: #052c65;
|
||||
--bs-secondary-text-emphasis: #2b2f32;
|
||||
--bs-success-text-emphasis: #0a3622;
|
||||
--bs-info-text-emphasis: #055160;
|
||||
--bs-warning-text-emphasis: #664d03;
|
||||
--bs-danger-text-emphasis: #58151c;
|
||||
--bs-light-text-emphasis: #495057;
|
||||
--bs-dark-text-emphasis: #495057;
|
||||
--bs-primary-bg-subtle: #cfe2ff;
|
||||
--bs-secondary-bg-subtle: #e2e3e5;
|
||||
--bs-success-bg-subtle: #d1e7dd;
|
||||
--bs-info-bg-subtle: #cff4fc;
|
||||
--bs-warning-bg-subtle: #fff3cd;
|
||||
--bs-danger-bg-subtle: #f8d7da;
|
||||
--bs-light-bg-subtle: #fcfcfd;
|
||||
--bs-dark-bg-subtle: #ced4da;
|
||||
--bs-primary-border-subtle: #9ec5fe;
|
||||
--bs-secondary-border-subtle: #c4c8cb;
|
||||
--bs-success-border-subtle: #a3cfbb;
|
||||
--bs-info-border-subtle: #9eeaf9;
|
||||
--bs-warning-border-subtle: #ffe69c;
|
||||
--bs-danger-border-subtle: #f1aeb5;
|
||||
--bs-light-border-subtle: #e9ecef;
|
||||
--bs-dark-border-subtle: #adb5bd;
|
||||
--bs-white-rgb: 255, 255, 255;
|
||||
--bs-black-rgb: 0, 0, 0;
|
||||
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
|
||||
--bs-body-font-family: var(--bs-font-sans-serif);
|
||||
--bs-body-font-size: 1rem;
|
||||
--bs-body-font-weight: 400;
|
||||
--bs-body-line-height: 1.5;
|
||||
--bs-body-color: #212529;
|
||||
--bs-body-color-rgb: 33, 37, 41;
|
||||
--bs-body-bg: #fff;
|
||||
--bs-body-bg-rgb: 255, 255, 255;
|
||||
--bs-emphasis-color: #000;
|
||||
--bs-emphasis-color-rgb: 0, 0, 0;
|
||||
--bs-secondary-color: rgba(33, 37, 41, 0.75);
|
||||
--bs-secondary-color-rgb: 33, 37, 41;
|
||||
--bs-secondary-bg: #e9ecef;
|
||||
--bs-secondary-bg-rgb: 233, 236, 239;
|
||||
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
|
||||
--bs-tertiary-color-rgb: 33, 37, 41;
|
||||
--bs-tertiary-bg: #f8f9fa;
|
||||
--bs-tertiary-bg-rgb: 248, 249, 250;
|
||||
--bs-heading-color: inherit;
|
||||
--bs-link-color: #0d6efd;
|
||||
--bs-link-color-rgb: 13, 110, 253;
|
||||
--bs-link-decoration: underline;
|
||||
--bs-link-hover-color: #0a58ca;
|
||||
--bs-link-hover-color-rgb: 10, 88, 202;
|
||||
--bs-code-color: #d63384;
|
||||
--bs-highlight-color: #212529;
|
||||
--bs-highlight-bg: #fff3cd;
|
||||
--bs-border-width: 1px;
|
||||
--bs-border-style: solid;
|
||||
--bs-border-color: #dee2e6;
|
||||
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
|
||||
--bs-border-radius: 0.375rem;
|
||||
--bs-border-radius-sm: 0.25rem;
|
||||
--bs-border-radius-lg: 0.5rem;
|
||||
--bs-border-radius-xl: 1rem;
|
||||
--bs-border-radius-xxl: 2rem;
|
||||
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
|
||||
--bs-border-radius-pill: 50rem;
|
||||
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
|
||||
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
|
||||
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
|
||||
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
|
||||
--bs-focus-ring-width: 0.25rem;
|
||||
--bs-focus-ring-opacity: 0.25;
|
||||
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
|
||||
--bs-form-valid-color: #198754;
|
||||
--bs-form-valid-border-color: #198754;
|
||||
--bs-form-invalid-color: #dc3545;
|
||||
--bs-form-invalid-border-color: #dc3545;
|
||||
}
|
||||
|
||||
[data-bs-theme=dark] {
|
||||
color-scheme: dark;
|
||||
--bs-body-color: #dee2e6;
|
||||
--bs-body-color-rgb: 222, 226, 230;
|
||||
--bs-body-bg: #212529;
|
||||
--bs-body-bg-rgb: 33, 37, 41;
|
||||
--bs-emphasis-color: #fff;
|
||||
--bs-emphasis-color-rgb: 255, 255, 255;
|
||||
--bs-secondary-color: rgba(222, 226, 230, 0.75);
|
||||
--bs-secondary-color-rgb: 222, 226, 230;
|
||||
--bs-secondary-bg: #343a40;
|
||||
--bs-secondary-bg-rgb: 52, 58, 64;
|
||||
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
|
||||
--bs-tertiary-color-rgb: 222, 226, 230;
|
||||
--bs-tertiary-bg: #2b3035;
|
||||
--bs-tertiary-bg-rgb: 43, 48, 53;
|
||||
--bs-primary-text-emphasis: #6ea8fe;
|
||||
--bs-secondary-text-emphasis: #a7acb1;
|
||||
--bs-success-text-emphasis: #75b798;
|
||||
--bs-info-text-emphasis: #6edff6;
|
||||
--bs-warning-text-emphasis: #ffda6a;
|
||||
--bs-danger-text-emphasis: #ea868f;
|
||||
--bs-light-text-emphasis: #f8f9fa;
|
||||
--bs-dark-text-emphasis: #dee2e6;
|
||||
--bs-primary-bg-subtle: #031633;
|
||||
--bs-secondary-bg-subtle: #161719;
|
||||
--bs-success-bg-subtle: #051b11;
|
||||
--bs-info-bg-subtle: #032830;
|
||||
--bs-warning-bg-subtle: #332701;
|
||||
--bs-danger-bg-subtle: #2c0b0e;
|
||||
--bs-light-bg-subtle: #343a40;
|
||||
--bs-dark-bg-subtle: #1a1d20;
|
||||
--bs-primary-border-subtle: #084298;
|
||||
--bs-secondary-border-subtle: #41464b;
|
||||
--bs-success-border-subtle: #0f5132;
|
||||
--bs-info-border-subtle: #087990;
|
||||
--bs-warning-border-subtle: #997404;
|
||||
--bs-danger-border-subtle: #842029;
|
||||
--bs-light-border-subtle: #495057;
|
||||
--bs-dark-border-subtle: #343a40;
|
||||
--bs-heading-color: inherit;
|
||||
--bs-link-color: #6ea8fe;
|
||||
--bs-link-hover-color: #8bb9fe;
|
||||
--bs-link-color-rgb: 110, 168, 254;
|
||||
--bs-link-hover-color-rgb: 139, 185, 254;
|
||||
--bs-code-color: #e685b5;
|
||||
--bs-highlight-color: #dee2e6;
|
||||
--bs-highlight-bg: #664d03;
|
||||
--bs-border-color: #495057;
|
||||
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
|
||||
--bs-form-valid-color: #75b798;
|
||||
--bs-form-valid-border-color: #75b798;
|
||||
--bs-form-invalid-color: #ea868f;
|
||||
--bs-form-invalid-border-color: #ea868f;
|
||||
}
|
||||
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
:root {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: var(--bs-body-font-family);
|
||||
font-size: var(--bs-body-font-size);
|
||||
font-weight: var(--bs-body-font-weight);
|
||||
line-height: var(--bs-body-line-height);
|
||||
color: var(--bs-body-color);
|
||||
text-align: var(--bs-body-text-align);
|
||||
background-color: var(--bs-body-bg);
|
||||
-webkit-text-size-adjust: 100%;
|
||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 1rem 0;
|
||||
color: inherit;
|
||||
border: 0;
|
||||
border-top: var(--bs-border-width) solid;
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
||||
h6, h5, h4, h3, h2, h1 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
font-weight: 500;
|
||||
line-height: 1.2;
|
||||
color: var(--bs-heading-color);
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: calc(1.375rem + 1.5vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h1 {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: calc(1.325rem + 0.9vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h2 {
|
||||
font-size: 2rem;
|
||||
}
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: calc(1.3rem + 0.6vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h3 {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: calc(1.275rem + 0.3vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h4 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
abbr[title] {
|
||||
-webkit-text-decoration: underline dotted;
|
||||
text-decoration: underline dotted;
|
||||
cursor: help;
|
||||
-webkit-text-decoration-skip-ink: none;
|
||||
text-decoration-skip-ink: none;
|
||||
}
|
||||
|
||||
address {
|
||||
margin-bottom: 1rem;
|
||||
font-style: normal;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul {
|
||||
padding-left: 2rem;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul,
|
||||
dl {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
ol ol,
|
||||
ul ul,
|
||||
ol ul,
|
||||
ul ol {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-bottom: 0.5rem;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
small {
|
||||
font-size: 0.875em;
|
||||
}
|
||||
|
||||
mark {
|
||||
padding: 0.1875em;
|
||||
color: var(--bs-highlight-color);
|
||||
background-color: var(--bs-highlight-bg);
|
||||
}
|
||||
|
||||
sub,
|
||||
sup {
|
||||
position: relative;
|
||||
font-size: 0.75em;
|
||||
line-height: 0;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
a {
|
||||
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:hover {
|
||||
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
|
||||
}
|
||||
|
||||
a:not([href]):not([class]), a:not([href]):not([class]):hover {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
pre,
|
||||
code,
|
||||
kbd,
|
||||
samp {
|
||||
font-family: var(--bs-font-monospace);
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
pre {
|
||||
display: block;
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
overflow: auto;
|
||||
font-size: 0.875em;
|
||||
}
|
||||
pre code {
|
||||
font-size: inherit;
|
||||
color: inherit;
|
||||
word-break: normal;
|
||||
}
|
||||
|
||||
code {
|
||||
font-size: 0.875em;
|
||||
color: var(--bs-code-color);
|
||||
word-wrap: break-word;
|
||||
}
|
||||
a > code {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
kbd {
|
||||
padding: 0.1875rem 0.375rem;
|
||||
font-size: 0.875em;
|
||||
color: var(--bs-body-bg);
|
||||
background-color: var(--bs-body-color);
|
||||
border-radius: 0.25rem;
|
||||
}
|
||||
kbd kbd {
|
||||
padding: 0;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
figure {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
img,
|
||||
svg {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
table {
|
||||
caption-side: bottom;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
caption {
|
||||
padding-top: 0.5rem;
|
||||
padding-bottom: 0.5rem;
|
||||
color: var(--bs-secondary-color);
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
th {
|
||||
text-align: inherit;
|
||||
text-align: -webkit-match-parent;
|
||||
}
|
||||
|
||||
thead,
|
||||
tbody,
|
||||
tfoot,
|
||||
tr,
|
||||
td,
|
||||
th {
|
||||
border-color: inherit;
|
||||
border-style: solid;
|
||||
border-width: 0;
|
||||
}
|
||||
|
||||
label {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
button {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
button:focus:not(:focus-visible) {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
input,
|
||||
button,
|
||||
select,
|
||||
optgroup,
|
||||
textarea {
|
||||
margin: 0;
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
[role=button] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
select {
|
||||
word-wrap: normal;
|
||||
}
|
||||
select:disabled {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
button,
|
||||
[type=button],
|
||||
[type=reset],
|
||||
[type=submit] {
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
button:not(:disabled),
|
||||
[type=button]:not(:disabled),
|
||||
[type=reset]:not(:disabled),
|
||||
[type=submit]:not(:disabled) {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
::-moz-focus-inner {
|
||||
padding: 0;
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
textarea {
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
min-width: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
legend {
|
||||
float: left;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
line-height: inherit;
|
||||
font-size: calc(1.275rem + 0.3vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
legend {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
legend + * {
|
||||
clear: left;
|
||||
}
|
||||
|
||||
::-webkit-datetime-edit-fields-wrapper,
|
||||
::-webkit-datetime-edit-text,
|
||||
::-webkit-datetime-edit-minute,
|
||||
::-webkit-datetime-edit-hour-field,
|
||||
::-webkit-datetime-edit-day-field,
|
||||
::-webkit-datetime-edit-month-field,
|
||||
::-webkit-datetime-edit-year-field {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
::-webkit-inner-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
[type=search] {
|
||||
-webkit-appearance: textfield;
|
||||
outline-offset: -2px;
|
||||
}
|
||||
[type=search]::-webkit-search-cancel-button {
|
||||
cursor: pointer;
|
||||
filter: grayscale(1);
|
||||
}
|
||||
|
||||
/* rtl:raw:
|
||||
[type="tel"],
|
||||
[type="url"],
|
||||
[type="email"],
|
||||
[type="number"] {
|
||||
direction: ltr;
|
||||
}
|
||||
*/
|
||||
::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
::-webkit-color-swatch-wrapper {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
font: inherit;
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
::file-selector-button {
|
||||
font: inherit;
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
output {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
iframe {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
progress {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
[hidden] {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/*# sourceMappingURL=bootstrap-reboot.css.map */
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,598 @@
|
||||
/*!
|
||||
* Bootstrap Reboot v5.3.8 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2025 The Bootstrap Authors
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||
*/
|
||||
:root,
|
||||
[data-bs-theme=light] {
|
||||
--bs-blue: #0d6efd;
|
||||
--bs-indigo: #6610f2;
|
||||
--bs-purple: #6f42c1;
|
||||
--bs-pink: #d63384;
|
||||
--bs-red: #dc3545;
|
||||
--bs-orange: #fd7e14;
|
||||
--bs-yellow: #ffc107;
|
||||
--bs-green: #198754;
|
||||
--bs-teal: #20c997;
|
||||
--bs-cyan: #0dcaf0;
|
||||
--bs-black: #000;
|
||||
--bs-white: #fff;
|
||||
--bs-gray: #6c757d;
|
||||
--bs-gray-dark: #343a40;
|
||||
--bs-gray-100: #f8f9fa;
|
||||
--bs-gray-200: #e9ecef;
|
||||
--bs-gray-300: #dee2e6;
|
||||
--bs-gray-400: #ced4da;
|
||||
--bs-gray-500: #adb5bd;
|
||||
--bs-gray-600: #6c757d;
|
||||
--bs-gray-700: #495057;
|
||||
--bs-gray-800: #343a40;
|
||||
--bs-gray-900: #212529;
|
||||
--bs-primary: #0d6efd;
|
||||
--bs-secondary: #6c757d;
|
||||
--bs-success: #198754;
|
||||
--bs-info: #0dcaf0;
|
||||
--bs-warning: #ffc107;
|
||||
--bs-danger: #dc3545;
|
||||
--bs-light: #f8f9fa;
|
||||
--bs-dark: #212529;
|
||||
--bs-primary-rgb: 13, 110, 253;
|
||||
--bs-secondary-rgb: 108, 117, 125;
|
||||
--bs-success-rgb: 25, 135, 84;
|
||||
--bs-info-rgb: 13, 202, 240;
|
||||
--bs-warning-rgb: 255, 193, 7;
|
||||
--bs-danger-rgb: 220, 53, 69;
|
||||
--bs-light-rgb: 248, 249, 250;
|
||||
--bs-dark-rgb: 33, 37, 41;
|
||||
--bs-primary-text-emphasis: #052c65;
|
||||
--bs-secondary-text-emphasis: #2b2f32;
|
||||
--bs-success-text-emphasis: #0a3622;
|
||||
--bs-info-text-emphasis: #055160;
|
||||
--bs-warning-text-emphasis: #664d03;
|
||||
--bs-danger-text-emphasis: #58151c;
|
||||
--bs-light-text-emphasis: #495057;
|
||||
--bs-dark-text-emphasis: #495057;
|
||||
--bs-primary-bg-subtle: #cfe2ff;
|
||||
--bs-secondary-bg-subtle: #e2e3e5;
|
||||
--bs-success-bg-subtle: #d1e7dd;
|
||||
--bs-info-bg-subtle: #cff4fc;
|
||||
--bs-warning-bg-subtle: #fff3cd;
|
||||
--bs-danger-bg-subtle: #f8d7da;
|
||||
--bs-light-bg-subtle: #fcfcfd;
|
||||
--bs-dark-bg-subtle: #ced4da;
|
||||
--bs-primary-border-subtle: #9ec5fe;
|
||||
--bs-secondary-border-subtle: #c4c8cb;
|
||||
--bs-success-border-subtle: #a3cfbb;
|
||||
--bs-info-border-subtle: #9eeaf9;
|
||||
--bs-warning-border-subtle: #ffe69c;
|
||||
--bs-danger-border-subtle: #f1aeb5;
|
||||
--bs-light-border-subtle: #e9ecef;
|
||||
--bs-dark-border-subtle: #adb5bd;
|
||||
--bs-white-rgb: 255, 255, 255;
|
||||
--bs-black-rgb: 0, 0, 0;
|
||||
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
|
||||
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
|
||||
--bs-body-font-family: var(--bs-font-sans-serif);
|
||||
--bs-body-font-size: 1rem;
|
||||
--bs-body-font-weight: 400;
|
||||
--bs-body-line-height: 1.5;
|
||||
--bs-body-color: #212529;
|
||||
--bs-body-color-rgb: 33, 37, 41;
|
||||
--bs-body-bg: #fff;
|
||||
--bs-body-bg-rgb: 255, 255, 255;
|
||||
--bs-emphasis-color: #000;
|
||||
--bs-emphasis-color-rgb: 0, 0, 0;
|
||||
--bs-secondary-color: rgba(33, 37, 41, 0.75);
|
||||
--bs-secondary-color-rgb: 33, 37, 41;
|
||||
--bs-secondary-bg: #e9ecef;
|
||||
--bs-secondary-bg-rgb: 233, 236, 239;
|
||||
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
|
||||
--bs-tertiary-color-rgb: 33, 37, 41;
|
||||
--bs-tertiary-bg: #f8f9fa;
|
||||
--bs-tertiary-bg-rgb: 248, 249, 250;
|
||||
--bs-heading-color: inherit;
|
||||
--bs-link-color: #0d6efd;
|
||||
--bs-link-color-rgb: 13, 110, 253;
|
||||
--bs-link-decoration: underline;
|
||||
--bs-link-hover-color: #0a58ca;
|
||||
--bs-link-hover-color-rgb: 10, 88, 202;
|
||||
--bs-code-color: #d63384;
|
||||
--bs-highlight-color: #212529;
|
||||
--bs-highlight-bg: #fff3cd;
|
||||
--bs-border-width: 1px;
|
||||
--bs-border-style: solid;
|
||||
--bs-border-color: #dee2e6;
|
||||
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
|
||||
--bs-border-radius: 0.375rem;
|
||||
--bs-border-radius-sm: 0.25rem;
|
||||
--bs-border-radius-lg: 0.5rem;
|
||||
--bs-border-radius-xl: 1rem;
|
||||
--bs-border-radius-xxl: 2rem;
|
||||
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
|
||||
--bs-border-radius-pill: 50rem;
|
||||
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
|
||||
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
|
||||
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
|
||||
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
|
||||
--bs-focus-ring-width: 0.25rem;
|
||||
--bs-focus-ring-opacity: 0.25;
|
||||
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
|
||||
--bs-form-valid-color: #198754;
|
||||
--bs-form-valid-border-color: #198754;
|
||||
--bs-form-invalid-color: #dc3545;
|
||||
--bs-form-invalid-border-color: #dc3545;
|
||||
}
|
||||
|
||||
[data-bs-theme=dark] {
|
||||
color-scheme: dark;
|
||||
--bs-body-color: #dee2e6;
|
||||
--bs-body-color-rgb: 222, 226, 230;
|
||||
--bs-body-bg: #212529;
|
||||
--bs-body-bg-rgb: 33, 37, 41;
|
||||
--bs-emphasis-color: #fff;
|
||||
--bs-emphasis-color-rgb: 255, 255, 255;
|
||||
--bs-secondary-color: rgba(222, 226, 230, 0.75);
|
||||
--bs-secondary-color-rgb: 222, 226, 230;
|
||||
--bs-secondary-bg: #343a40;
|
||||
--bs-secondary-bg-rgb: 52, 58, 64;
|
||||
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
|
||||
--bs-tertiary-color-rgb: 222, 226, 230;
|
||||
--bs-tertiary-bg: #2b3035;
|
||||
--bs-tertiary-bg-rgb: 43, 48, 53;
|
||||
--bs-primary-text-emphasis: #6ea8fe;
|
||||
--bs-secondary-text-emphasis: #a7acb1;
|
||||
--bs-success-text-emphasis: #75b798;
|
||||
--bs-info-text-emphasis: #6edff6;
|
||||
--bs-warning-text-emphasis: #ffda6a;
|
||||
--bs-danger-text-emphasis: #ea868f;
|
||||
--bs-light-text-emphasis: #f8f9fa;
|
||||
--bs-dark-text-emphasis: #dee2e6;
|
||||
--bs-primary-bg-subtle: #031633;
|
||||
--bs-secondary-bg-subtle: #161719;
|
||||
--bs-success-bg-subtle: #051b11;
|
||||
--bs-info-bg-subtle: #032830;
|
||||
--bs-warning-bg-subtle: #332701;
|
||||
--bs-danger-bg-subtle: #2c0b0e;
|
||||
--bs-light-bg-subtle: #343a40;
|
||||
--bs-dark-bg-subtle: #1a1d20;
|
||||
--bs-primary-border-subtle: #084298;
|
||||
--bs-secondary-border-subtle: #41464b;
|
||||
--bs-success-border-subtle: #0f5132;
|
||||
--bs-info-border-subtle: #087990;
|
||||
--bs-warning-border-subtle: #997404;
|
||||
--bs-danger-border-subtle: #842029;
|
||||
--bs-light-border-subtle: #495057;
|
||||
--bs-dark-border-subtle: #343a40;
|
||||
--bs-heading-color: inherit;
|
||||
--bs-link-color: #6ea8fe;
|
||||
--bs-link-hover-color: #8bb9fe;
|
||||
--bs-link-color-rgb: 110, 168, 254;
|
||||
--bs-link-hover-color-rgb: 139, 185, 254;
|
||||
--bs-code-color: #e685b5;
|
||||
--bs-highlight-color: #dee2e6;
|
||||
--bs-highlight-bg: #664d03;
|
||||
--bs-border-color: #495057;
|
||||
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
|
||||
--bs-form-valid-color: #75b798;
|
||||
--bs-form-valid-border-color: #75b798;
|
||||
--bs-form-invalid-color: #ea868f;
|
||||
--bs-form-invalid-border-color: #ea868f;
|
||||
}
|
||||
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
:root {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: var(--bs-body-font-family);
|
||||
font-size: var(--bs-body-font-size);
|
||||
font-weight: var(--bs-body-font-weight);
|
||||
line-height: var(--bs-body-line-height);
|
||||
color: var(--bs-body-color);
|
||||
text-align: var(--bs-body-text-align);
|
||||
background-color: var(--bs-body-bg);
|
||||
-webkit-text-size-adjust: 100%;
|
||||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 1rem 0;
|
||||
color: inherit;
|
||||
border: 0;
|
||||
border-top: var(--bs-border-width) solid;
|
||||
opacity: 0.25;
|
||||
}
|
||||
|
||||
h6, h5, h4, h3, h2, h1 {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
font-weight: 500;
|
||||
line-height: 1.2;
|
||||
color: var(--bs-heading-color);
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: calc(1.375rem + 1.5vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h1 {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: calc(1.325rem + 0.9vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h2 {
|
||||
font-size: 2rem;
|
||||
}
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: calc(1.3rem + 0.6vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h3 {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: calc(1.275rem + 0.3vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
h4 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
abbr[title] {
|
||||
-webkit-text-decoration: underline dotted;
|
||||
text-decoration: underline dotted;
|
||||
cursor: help;
|
||||
-webkit-text-decoration-skip-ink: none;
|
||||
text-decoration-skip-ink: none;
|
||||
}
|
||||
|
||||
address {
|
||||
margin-bottom: 1rem;
|
||||
font-style: normal;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul {
|
||||
padding-right: 2rem;
|
||||
}
|
||||
|
||||
ol,
|
||||
ul,
|
||||
dl {
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
ol ol,
|
||||
ul ul,
|
||||
ol ul,
|
||||
ul ol {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
dt {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin-bottom: 0.5rem;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
small {
|
||||
font-size: 0.875em;
|
||||
}
|
||||
|
||||
mark {
|
||||
padding: 0.1875em;
|
||||
color: var(--bs-highlight-color);
|
||||
background-color: var(--bs-highlight-bg);
|
||||
}
|
||||
|
||||
sub,
|
||||
sup {
|
||||
position: relative;
|
||||
font-size: 0.75em;
|
||||
line-height: 0;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
a {
|
||||
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:hover {
|
||||
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
|
||||
}
|
||||
|
||||
a:not([href]):not([class]), a:not([href]):not([class]):hover {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
pre,
|
||||
code,
|
||||
kbd,
|
||||
samp {
|
||||
font-family: var(--bs-font-monospace);
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
pre {
|
||||
display: block;
|
||||
margin-top: 0;
|
||||
margin-bottom: 1rem;
|
||||
overflow: auto;
|
||||
font-size: 0.875em;
|
||||
}
|
||||
pre code {
|
||||
font-size: inherit;
|
||||
color: inherit;
|
||||
word-break: normal;
|
||||
}
|
||||
|
||||
code {
|
||||
font-size: 0.875em;
|
||||
color: var(--bs-code-color);
|
||||
word-wrap: break-word;
|
||||
}
|
||||
a > code {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
kbd {
|
||||
padding: 0.1875rem 0.375rem;
|
||||
font-size: 0.875em;
|
||||
color: var(--bs-body-bg);
|
||||
background-color: var(--bs-body-color);
|
||||
border-radius: 0.25rem;
|
||||
}
|
||||
kbd kbd {
|
||||
padding: 0;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
figure {
|
||||
margin: 0 0 1rem;
|
||||
}
|
||||
|
||||
img,
|
||||
svg {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
table {
|
||||
caption-side: bottom;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
caption {
|
||||
padding-top: 0.5rem;
|
||||
padding-bottom: 0.5rem;
|
||||
color: var(--bs-secondary-color);
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
th {
|
||||
text-align: inherit;
|
||||
text-align: -webkit-match-parent;
|
||||
}
|
||||
|
||||
thead,
|
||||
tbody,
|
||||
tfoot,
|
||||
tr,
|
||||
td,
|
||||
th {
|
||||
border-color: inherit;
|
||||
border-style: solid;
|
||||
border-width: 0;
|
||||
}
|
||||
|
||||
label {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
button {
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
button:focus:not(:focus-visible) {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
input,
|
||||
button,
|
||||
select,
|
||||
optgroup,
|
||||
textarea {
|
||||
margin: 0;
|
||||
font-family: inherit;
|
||||
font-size: inherit;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
button,
|
||||
select {
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
[role=button] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
select {
|
||||
word-wrap: normal;
|
||||
}
|
||||
select:disabled {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
button,
|
||||
[type=button],
|
||||
[type=reset],
|
||||
[type=submit] {
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
button:not(:disabled),
|
||||
[type=button]:not(:disabled),
|
||||
[type=reset]:not(:disabled),
|
||||
[type=submit]:not(:disabled) {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
::-moz-focus-inner {
|
||||
padding: 0;
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
textarea {
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
fieldset {
|
||||
min-width: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
legend {
|
||||
float: right;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin-bottom: 0.5rem;
|
||||
line-height: inherit;
|
||||
font-size: calc(1.275rem + 0.3vw);
|
||||
}
|
||||
@media (min-width: 1200px) {
|
||||
legend {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
legend + * {
|
||||
clear: right;
|
||||
}
|
||||
|
||||
::-webkit-datetime-edit-fields-wrapper,
|
||||
::-webkit-datetime-edit-text,
|
||||
::-webkit-datetime-edit-minute,
|
||||
::-webkit-datetime-edit-hour-field,
|
||||
::-webkit-datetime-edit-day-field,
|
||||
::-webkit-datetime-edit-month-field,
|
||||
::-webkit-datetime-edit-year-field {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
::-webkit-inner-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
[type=search] {
|
||||
-webkit-appearance: textfield;
|
||||
outline-offset: -2px;
|
||||
}
|
||||
[type=search]::-webkit-search-cancel-button {
|
||||
cursor: pointer;
|
||||
filter: grayscale(1);
|
||||
}
|
||||
|
||||
[type="tel"],
|
||||
[type="url"],
|
||||
[type="email"],
|
||||
[type="number"] {
|
||||
direction: ltr;
|
||||
}
|
||||
::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
::-webkit-color-swatch-wrapper {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
font: inherit;
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
::file-selector-button {
|
||||
font: inherit;
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
output {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
iframe {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
progress {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
[hidden] {
|
||||
display: none !important;
|
||||
}
|
||||
/*# sourceMappingURL=bootstrap-reboot.rtl.css.map */
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+5406
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+12048
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+12021
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+6312
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+4447
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+4494
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,6 @@
|
||||
.floating-box{
|
||||
position:fixed;
|
||||
width:260px;
|
||||
z-index:9999;
|
||||
max-height:calc(100vh-100px);
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
/* You can add global styles to this file, and also import other style files */
|
||||
|
||||
/*@import "bootstrap/scss/bootstrap";
|
||||
@import "bootstrap-icons/font/bootstrap-icons";*/
|
||||
|
||||
// 3. 自定義全域樣式 (讓 Sidebar 滿版)
|
||||
html, body {
|
||||
height: 100%;
|
||||
// 修正捲軸在 Dark mode 的顏色
|
||||
&[data-bs-theme="dark"] {
|
||||
color-scheme: dark;
|
||||
}
|
||||
}
|
||||
|
||||
// Sidebar 固定寬度設定 (可依需求調整)
|
||||
.sidebar {
|
||||
width: 250px;
|
||||
min-height: 100vh;
|
||||
transition: all 0.3s;
|
||||
|
||||
@include media-breakpoint-down(md) {
|
||||
width: 100%; // 手機版變成全寬或隱藏
|
||||
min-height: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.main-content {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100vh;
|
||||
overflow-y: auto; // 內容區域獨立捲動
|
||||
}
|
||||
|
||||
input[type="checkbox"]{
|
||||
|
||||
/* 1. Remove native styles */
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
|
||||
width: 25px !important;
|
||||
height: 25px !important;
|
||||
|
||||
border: 2px solid #555; /* Your custom border */
|
||||
border-radius: 4px; /* Optional: rounded corners */
|
||||
outline: none;
|
||||
cursor: pointer;
|
||||
|
||||
/* Layout for the checkmark */
|
||||
display: inline-flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-right: 8px;
|
||||
vertical-align: middle;
|
||||
background-color: white;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
$toast-max-width: 500px;
|
||||
$toast-font-size: 1.5rem;
|
||||
|
||||
@@ -0,0 +1,250 @@
|
||||
:host {
|
||||
display: block;
|
||||
width: auto;
|
||||
height: auto;
|
||||
--canvas-bg: #f8f9fa;
|
||||
--canvas-grid: #dee2e6;
|
||||
--paper-bg: #fffbf0;
|
||||
--paper-shadow: rgba(0,0,0,0.1);
|
||||
--selection-color: #0d6efd;
|
||||
}
|
||||
|
||||
:host-context([data-bs-theme="dark"]) {
|
||||
--canvas-bg: #0f1114;
|
||||
--canvas-grid: #2b3035;
|
||||
--paper-shadow: rgba(0,0,0,0.8);
|
||||
/* 紙張保持米黃,因為它是實物模擬 */
|
||||
}
|
||||
|
||||
/*.yangshang-wrapper {
|
||||
display: flex !important;
|
||||
flex-direction: row !important;*/ /* 垂直堆疊 */
|
||||
/*justify-content: space-between !important;*/ /* 陽上與拜薦各據頂底 */
|
||||
/*align-items: center !important;*/ /* 水平方向置中 */
|
||||
/*height: 100% !important;
|
||||
width: 100% !important;
|
||||
writing-mode: vertical-rl !important;*/ /* 確保內部文字均為垂直書寫 */
|
||||
/*text-orientation: upright !important;*/ /* 確保文字方向轉正 */
|
||||
/*gap: 1px;
|
||||
}*/
|
||||
|
||||
.designer-root {
|
||||
/* 防止瀏覽器預設捲動影響畫布 */
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.canvas-area {
|
||||
background-color: var(--canvas-bg);
|
||||
background-image: linear-gradient(45deg, var(--canvas-grid) 25%, transparent 25%), linear-gradient(-45deg, var(--canvas-grid) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, var(--canvas-grid) 75%), linear-gradient(-45deg, transparent 75%, var(--canvas-grid) 75%);
|
||||
background-size: 20px 20px;
|
||||
transition: background-color 0.3s;
|
||||
/* min-height: 100vw;*/
|
||||
|
||||
}
|
||||
|
||||
.tablet-paper {
|
||||
background-color: var(--paper-bg);
|
||||
box-shadow: 0 10px 30px var(--paper-shadow);
|
||||
transition: all 0.3s;
|
||||
overflow: hidden;
|
||||
/* 確保在列印時被視為一個分頁單元 */
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
|
||||
.tablet-element {
|
||||
cursor: move;
|
||||
padding: 4px;
|
||||
color: black !important; /* 強制墨水為黑色 */
|
||||
border: 1px solid transparent;
|
||||
transition: writing-mode 0.3s, transform 0.2s;
|
||||
}
|
||||
.tablet-element:hover { border-color: rgba(13, 110, 253, 0.3); }
|
||||
|
||||
|
||||
/* 直書模式核心 */
|
||||
.vertical-text {
|
||||
writing-mode: vertical-rl;
|
||||
text-orientation: mixed; /* 這是關鍵:中文直立,英文轉90度 */
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
/* 縱中橫 (讓直書中的數字變成橫向) */
|
||||
.tate-chu-yoko {
|
||||
text-combine-upright: all; /* 擠在一起 */
|
||||
/* 或者使用 digits 4 (但在某些瀏覽器支援度不一,all 比較保險) */
|
||||
display: inline-block;
|
||||
letter-spacing: 0; /* 數字之間不要有間距 */
|
||||
}
|
||||
|
||||
/* 名單金字塔佈局容器 */
|
||||
.roster-container {
|
||||
width: 100%; height: 600px;
|
||||
writing-mode: vertical-rl; /* 直書 */
|
||||
display: flex;
|
||||
/*flex-direction: column;*/ /* 雖然是直書,但物理上我們是將「上層區」和「下層區」垂直堆疊 */
|
||||
flex-direction: row; /* 上下分層 (Top / Bottom) */
|
||||
align-items: center; /* 左右置中對齊 */
|
||||
justify-content: center;
|
||||
gap: 20px; /* 這是「上層」跟「下層」之間的距離,可以設大一點 */
|
||||
}
|
||||
|
||||
.roster-row {
|
||||
display: flex;
|
||||
flex-direction: row-reverse; /* 直書由右至左,所以 Row 要反向或依需求調整 */
|
||||
justify-content: center;
|
||||
gap: 8px; /* 名字之間的間距 */
|
||||
margin-left: 10px; /* 上下排之間的間距 (因為是直書,margin-left 是物理上的左邊/下方) */
|
||||
}
|
||||
|
||||
.name-group {
|
||||
display: flex;
|
||||
flex-direction: column; /* ★★★ 關鍵:這讓名字左右並排 ★★★ */
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
/* gap 由 HTML 動態綁定 */
|
||||
}
|
||||
|
||||
.roster-name {
|
||||
text-orientation: upright;
|
||||
/*font-weight: bold;*/
|
||||
white-space: nowrap;
|
||||
line-height: 1.2;
|
||||
font-family: 'Kaiti', serif;
|
||||
/* 確保名字本身不會佔據過多寬度導致間距看起來很大 */
|
||||
width: fit-content;
|
||||
height:200px;
|
||||
}
|
||||
|
||||
|
||||
/* 選取框 */
|
||||
.selection-border {
|
||||
position: absolute; top: -4px; left: -4px; right: -4px; bottom: -4px;
|
||||
border: 2px solid var(--selection-color); pointer-events: none; z-index: 100;
|
||||
}
|
||||
|
||||
.resize-handle {
|
||||
position: absolute; width: 10px; height: 10px; background: white;
|
||||
border: 2px solid var(--selection-color); border-radius: 50%;
|
||||
}
|
||||
.top-left { top: -6px; left: -6px; } .top-right { top: -6px; right: -6px; }
|
||||
.bottom-left { bottom: -6px; left: -6px; } .bottom-right { bottom: -6px; right: -6px; }
|
||||
|
||||
.x-small { font-size: 0.7rem; } .ls-1 { letter-spacing: 1px; }
|
||||
.bg-gradient-primary { background: linear-gradient(135deg, #0d6efd 0%, #0043a8 100%); }
|
||||
.bg-gradient-dark { background: linear-gradient(135deg, #212529 0%, #000000 100%); }
|
||||
|
||||
.page-info-badge {
|
||||
background: rgba(255,255,255,0.9); padding: 5px 15px; border-radius: 20px; font-weight: bold; color: #333;
|
||||
}
|
||||
|
||||
/* Print Mode */
|
||||
@media print {
|
||||
app-floating-widget, .canvas-area, .page-info-badge { display: none !important; }
|
||||
:host { display: block; background: white; }
|
||||
|
||||
.tablet-paper {
|
||||
position: relative !important;
|
||||
margin: 0;
|
||||
page-break-after: always; /* 強制分頁 */
|
||||
box-shadow: none !important; background: transparent !important;
|
||||
width: 100% !important; height: 100% !important;
|
||||
-webkit-print-color-adjust: exact; print-color-adjust: exact;
|
||||
}
|
||||
.tablet-paper:last-child { page-break-after: auto; }
|
||||
|
||||
.paper-size-label, .selection-border { display: none; }
|
||||
|
||||
/* 確保背景圖列印 */
|
||||
img.bg-image-layer {
|
||||
-webkit-print-color-adjust: exact; print-color-adjust: exact;
|
||||
display: block !important;
|
||||
}
|
||||
}
|
||||
|
||||
.resizable-box {
|
||||
width: 300px;
|
||||
height: 200px;
|
||||
border: 1px solid #ccc;
|
||||
|
||||
/* 關鍵屬性 */
|
||||
resize: both; /* 允許水平和垂直調整 (或是 horizontal, vertical) */
|
||||
overflow: auto; /* 必須設定 overflow (非 visible) resize 才會生效 */
|
||||
|
||||
/* 選用:限制最小最大尺寸 */
|
||||
min-width: 100px;
|
||||
min-height: 100px;
|
||||
}
|
||||
|
||||
|
||||
.combined-vertical-mode {
|
||||
writing-mode: vertical-rl; /* 設定為直排 */
|
||||
font-family: "KaiTi", "BiauKai", serif;
|
||||
font-size: 48px;
|
||||
font-weight: bold;
|
||||
letter-spacing: 0.1em;
|
||||
/* 為了讓排版置中好看,可以加這行 */
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.combined {
|
||||
/* --- 關鍵修改 --- */
|
||||
|
||||
/* 1. 取消原本的擠壓設定 */
|
||||
text-combine-upright: none;
|
||||
|
||||
/* 2. 將這三個字改回「橫向排版」 */
|
||||
writing-mode: horizontal-tb;
|
||||
|
||||
/* 3. 讓它變成一個區塊,這樣字體才會撐開空間,不會擠在一起 */
|
||||
display: inline-block;
|
||||
|
||||
/* 4. (選用) 調整它跟下方直書文字的對齊方式 */
|
||||
vertical-align: middle;
|
||||
|
||||
/* 5. (選用) 如果希望字與字之間稍微寬鬆一點 */
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
|
||||
.combined-small {
|
||||
font-size: 32px !important;
|
||||
}
|
||||
|
||||
.auto-wrap-text {
|
||||
/* 1. 設定為直書模式 */
|
||||
writing-mode: vertical-rl;
|
||||
text-orientation: upright; /* 讓文字直立 */
|
||||
|
||||
/* 2. 關鍵:限制最大高度 */
|
||||
/* 設定為 8em 代表大約 8 個字的高度,超過就會自動換行 */
|
||||
max-height: 8em;
|
||||
|
||||
/* 3. 關鍵:允許換行 */
|
||||
white-space: normal; /* 或 pre-wrap */
|
||||
|
||||
/* 4. 調整換行的方向與對齊 (選用) */
|
||||
display: inline-block; /* 讓容器隨內容撐開 */
|
||||
word-break: break-all; /* 確保長單字或連續文字也能強制切斷換行 */
|
||||
}
|
||||
|
||||
.ancestor-wrapper {
|
||||
/* 重置為橫向流,這樣 column 才會是真正的上下堆疊 */
|
||||
writing-mode: horizontal-tb;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center; /* 水平置中 */
|
||||
justify-content: flex-start;
|
||||
width: fit-content;
|
||||
}
|
||||
|
||||
.main-name {
|
||||
line-height: 1.2;
|
||||
/* 保持大字 */
|
||||
}
|
||||
|
||||
.sub-text {
|
||||
font-size: 0.6em; /* 縮小字體 */
|
||||
line-height: 1.2;
|
||||
margin-top: 4px; /* 與上方林張的間距 */
|
||||
white-space: nowrap; /* 避免自動換行 */
|
||||
writing-mode:vertical-rl
|
||||
}
|
||||
@@ -0,0 +1,384 @@
|
||||
Authors ordered by first contribution
|
||||
A list of current team members is available at https://jqueryui.com/about
|
||||
|
||||
Paul Bakaus <paul.bakaus@gmail.com>
|
||||
Richard Worth <rdworth@gmail.com>
|
||||
Yehuda Katz <wycats@gmail.com>
|
||||
Sean Catchpole <sean@sunsean.com>
|
||||
John Resig <jeresig@gmail.com>
|
||||
Tane Piper <piper.tane@gmail.com>
|
||||
Dmitri Gaskin <dmitrig01@gmail.com>
|
||||
Klaus Hartl <klaus.hartl@gmail.com>
|
||||
Stefan Petre <stefan.petre@gmail.com>
|
||||
Gilles van den Hoven <gilles@webunity.nl>
|
||||
Micheil Bryan Smith <micheil@brandedcode.com>
|
||||
Jörn Zaefferer <joern.zaefferer@gmail.com>
|
||||
Marc Grabanski <m@marcgrabanski.com>
|
||||
Keith Wood <kbwood@iinet.com.au>
|
||||
Brandon Aaron <brandon.aaron@gmail.com>
|
||||
Scott González <scott.gonzalez@gmail.com>
|
||||
Eduardo Lundgren <eduardolundgren@gmail.com>
|
||||
Aaron Eisenberger <aaronchi@gmail.com>
|
||||
Joan Piedra <theneojp@gmail.com>
|
||||
Bruno Basto <b.basto@gmail.com>
|
||||
Remy Sharp <remy@leftlogic.com>
|
||||
Bohdan Ganicky <bohdan.ganicky@gmail.com>
|
||||
David Bolter <david.bolter@gmail.com>
|
||||
Chi Cheng <cloudream@gmail.com>
|
||||
Ca-Phun Ung <pazu2k@gmail.com>
|
||||
Ariel Flesler <aflesler@gmail.com>
|
||||
Maggie Wachs <maggie@filamentgroup.com>
|
||||
Scott Jehl <scottjehl@gmail.com>
|
||||
Todd Parker <todd@filamentgroup.com>
|
||||
Andrew Powell <andrew@shellscape.org>
|
||||
Brant Burnett <btburnett3@gmail.com>
|
||||
Douglas Neiner <doug@dougneiner.com>
|
||||
Paul Irish <paul.irish@gmail.com>
|
||||
Ralph Whitbeck <ralph.whitbeck@gmail.com>
|
||||
Thibault Duplessis <thibault.duplessis@gmail.com>
|
||||
Dominique Vincent <dominique.vincent@toitl.com>
|
||||
Jack Hsu <jack.hsu@gmail.com>
|
||||
Adam Sontag <ajpiano@ajpiano.com>
|
||||
Carl Fürstenberg <carl@excito.com>
|
||||
Kevin Dalman <development@allpro.net>
|
||||
Alberto Fernández Capel <afcapel@gmail.com>
|
||||
Jacek Jędrzejewski (https://jacek.jedrzejewski.name)
|
||||
Ting Kuei <ting@kuei.com>
|
||||
Samuel Cormier-Iijima <sam@chide.it>
|
||||
Jon Palmer <jonspalmer@gmail.com>
|
||||
Ben Hollis <bhollis@amazon.com>
|
||||
Justin MacCarthy <Justin@Rubystars.biz>
|
||||
Eyal Kobrigo <kobrigo@hotmail.com>
|
||||
Tiago Freire <tiago.freire@gmail.com>
|
||||
Diego Tres <diegotres@gmail.com>
|
||||
Holger Rüprich <holger@rueprich.de>
|
||||
Ziling Zhao <zilingzhao@gmail.com>
|
||||
Mike Alsup <malsup@gmail.com>
|
||||
Robson Braga Araujo <robsonbraga@gmail.com>
|
||||
Pierre-Henri Ausseil <ph.ausseil@gmail.com>
|
||||
Christopher McCulloh <cmcculloh@gmail.com>
|
||||
Andrew Newcomb <ext.github@preceptsoftware.co.uk>
|
||||
Lim Chee Aun <cheeaun@gmail.com>
|
||||
Jorge Barreiro <yortx.barry@gmail.com>
|
||||
Daniel Steigerwald <daniel@steigerwald.cz>
|
||||
John Firebaugh <john_firebaugh@bigfix.com>
|
||||
John Enters <github@darkdark.net>
|
||||
Andrey Kapitcyn <ru.m157y@gmail.com>
|
||||
Dmitry Petrov <dpetroff@gmail.com>
|
||||
Eric Hynds <eric@hynds.net>
|
||||
Chairat Sunthornwiphat <pipo@sixhead.com>
|
||||
Josh Varner <josh.varner@gmail.com>
|
||||
Stéphane Raimbault <stephane.raimbault@gmail.com>
|
||||
Jay Merrifield <fracmak@gmail.com>
|
||||
J. Ryan Stinnett <jryans@gmail.com>
|
||||
Peter Heiberg <peter@heiberg.se>
|
||||
Alex Dovenmuehle <adovenmuehle@gmail.com>
|
||||
Jamie Gegerson <git@jamiegegerson.com>
|
||||
Raymond Schwartz <skeetergraphics@gmail.com>
|
||||
Phillip Barnes <philbar@gmail.com>
|
||||
Kyle Wilkinson <kai@wikyd.org>
|
||||
Khaled AlHourani <me@khaledalhourani.com>
|
||||
Marian Rudzynski <mr@impaled.org>
|
||||
Jean-Francois Remy <jeff@melix.org>
|
||||
Doug Blood <dougblood@gmail.com>
|
||||
Filippo Cavallarin <filippo.cavallarin@codseq.it>
|
||||
Heiko Henning <heiko@thehennings.ch>
|
||||
Aliaksandr Rahalevich <saksmlz@gmail.com>
|
||||
Mario Visic <mario@mariovisic.com>
|
||||
Xavi Ramirez <xavi.rmz@gmail.com>
|
||||
Max Schnur <max.schnur@gmail.com>
|
||||
Saji Nediyanchath <saji89@gmail.com>
|
||||
Corey Frang <gnarf37@gmail.com>
|
||||
Aaron Peterson <aaronp123@yahoo.com>
|
||||
Ivan Peters <ivan@ivanpeters.com>
|
||||
Mohamed Cherif Bouchelaghem <cherifbouchelaghem@yahoo.fr>
|
||||
Marcos Sousa <falecomigo@marcossousa.com>
|
||||
Michael DellaNoce <mdellanoce@mailtrust.com>
|
||||
George Marshall <echosx@gmail.com>
|
||||
Tobias Brunner <tobias@strongswan.org>
|
||||
Martin Solli <msolli@gmail.com>
|
||||
David Petersen <public@petersendidit.com>
|
||||
Dan Heberden <danheberden@gmail.com>
|
||||
William Kevin Manire <williamkmanire@gmail.com>
|
||||
Gilmore Davidson <gilmoreorless@gmail.com>
|
||||
Michael Wu <michaelmwu@gmail.com>
|
||||
Adam Parod <mystic414@gmail.com>
|
||||
Guillaume Gautreau <guillaume+github@ghusse.com>
|
||||
Marcel Toele <EleotleCram@gmail.com>
|
||||
Dan Streetman <ddstreet@ieee.org>
|
||||
Matt Hoskins <matt@nipltd.com>
|
||||
Giovanni Giacobbi <giovanni@giacobbi.net>
|
||||
Kyle Florence <kyle.florence@gmail.com>
|
||||
Pavol Hluchý <lopo@losys.sk>
|
||||
Hans Hillen <hans.hillen@gmail.com>
|
||||
Mark Johnson <virgofx@live.com>
|
||||
Trey Hunner <treyhunner@gmail.com>
|
||||
Shane Whittet <whittet@gmail.com>
|
||||
Edward A Faulkner <ef@alum.mit.edu>
|
||||
Adam Baratz <adam@adambaratz.com>
|
||||
Kato Kazuyoshi <kato.kazuyoshi@gmail.com>
|
||||
Eike Send <eike.send@gmail.com>
|
||||
Kris Borchers <kris.borchers@gmail.com>
|
||||
Eddie Monge <eddie@eddiemonge.com>
|
||||
Israel Tsadok <itsadok@gmail.com>
|
||||
Carson McDonald <carson@ioncannon.net>
|
||||
Jason Davies <jason@jasondavies.com>
|
||||
Garrison Locke <gplocke@gmail.com>
|
||||
David Murdoch <david@davidmurdoch.com>
|
||||
Benjamin Scott Boyle <benjamins.boyle@gmail.com>
|
||||
Jesse Baird <jebaird@gmail.com>
|
||||
Jonathan Vingiano <jvingiano@gmail.com>
|
||||
Dylan Just <dev@ephox.com>
|
||||
Hiroshi Tomita <tomykaira@gmail.com>
|
||||
Glenn Goodrich <glenn.goodrich@gmail.com>
|
||||
Tarafder Ashek-E-Elahi <mail.ashek@gmail.com>
|
||||
Ryan Neufeld <ryan@neufeldmail.com>
|
||||
Marc Neuwirth <marc.neuwirth@gmail.com>
|
||||
Philip Graham <philip.robert.graham@gmail.com>
|
||||
Benjamin Sterling <benjamin.sterling@kenzomedia.com>
|
||||
Wesley Walser <waw325@gmail.com>
|
||||
Kouhei Sutou <kou@clear-code.com>
|
||||
Karl Kirch <karlkrch@gmail.com>
|
||||
Chris Kelly <ckdake@ckdake.com>
|
||||
Jason Oster <jay@kodewerx.org>
|
||||
Felix Nagel <info@felixnagel.com>
|
||||
Alexander Polomoshnov <alex.polomoshnov@gmail.com>
|
||||
David Leal <dgleal@gmail.com>
|
||||
Igor Milla <igor.fsp.milla@gmail.com>
|
||||
Dave Methvin <dave.methvin@gmail.com>
|
||||
Florian Gutmann <f.gutmann@chronimo.com>
|
||||
Marwan Al Jubeh <marwan.aljubeh@gmail.com>
|
||||
Milan Broum <midlis@googlemail.com>
|
||||
Sebastian Sauer <info@dynpages.de>
|
||||
Gaëtan Muller <m.gaetan89@gmail.com>
|
||||
Michel Weimerskirch <michel@weimerskirch.net>
|
||||
William Griffiths <william@ycymro.com>
|
||||
Stojce Slavkovski <stojce@gmail.com>
|
||||
David Soms <david.soms@gmail.com>
|
||||
David De Sloovere <david.desloovere@outlook.com>
|
||||
Michael P. Jung <michael.jung@terreon.de>
|
||||
Shannon Pekary <spekary@gmail.com>
|
||||
Dan Wellman <danwellman@hotmail.com>
|
||||
Matthew Edward Hutton <meh@corefiling.co.uk>
|
||||
James Khoury <james@jameskhoury.com>
|
||||
Rob Loach <robloach@gmail.com>
|
||||
Alberto Monteiro <betimbrasil@gmail.com>
|
||||
Alex Rhea <alex.rhea@gmail.com>
|
||||
Krzysztof Rosiński <rozwell69@gmail.com>
|
||||
Ryan Olton <oltonr@gmail.com>
|
||||
Genie <386@mail.com>
|
||||
Rick Waldron <waldron.rick@gmail.com>
|
||||
Ian Simpson <spoonlikesham@gmail.com>
|
||||
Lev Kitsis <spam4lev@gmail.com>
|
||||
TJ VanToll <tj.vantoll@gmail.com>
|
||||
Justin Domnitz <jdomnitz@gmail.com>
|
||||
Douglas Cerna <douglascerna@yahoo.com>
|
||||
Bert ter Heide <bertjh@hotmail.com>
|
||||
Jasvir Nagra <jasvir@gmail.com>
|
||||
Yuriy Khabarov <13real008@gmail.com>
|
||||
Harri Kilpiö <harri.kilpio@gmail.com>
|
||||
Lado Lomidze <lado.lomidze@gmail.com>
|
||||
Amir E. Aharoni <amir.aharoni@mail.huji.ac.il>
|
||||
Simon Sattes <simon.sattes@gmail.com>
|
||||
Jo Liss <joliss42@gmail.com>
|
||||
Guntupalli Karunakar <karunakarg@yahoo.com>
|
||||
Shahyar Ghobadpour <shahyar@gmail.com>
|
||||
Lukasz Lipinski <uzza17@gmail.com>
|
||||
Timo Tijhof <krinklemail@gmail.com>
|
||||
Jason Moon <jmoon@socialcast.com>
|
||||
Martin Frost <martinf55@hotmail.com>
|
||||
Eneko Illarramendi <eneko@illarra.com>
|
||||
EungJun Yi <semtlenori@gmail.com>
|
||||
Courtland Allen <courtlandallen@gmail.com>
|
||||
Viktar Varvanovich <non4eg@gmail.com>
|
||||
Danny Trunk <dtrunk90@gmail.com>
|
||||
Pavel Stetina <pavel.stetina@nangu.tv>
|
||||
Michael Stay <metaweta@gmail.com>
|
||||
Steven Roussey <sroussey@gmail.com>
|
||||
Michael Hollis <hollis21@gmail.com>
|
||||
Lee Rowlands <lee.rowlands@previousnext.com.au>
|
||||
Timmy Willison <timmywillisn@gmail.com>
|
||||
Karl Swedberg <kswedberg@gmail.com>
|
||||
Baoju Yuan <the_guy_1987@hotmail.com>
|
||||
Maciej Mroziński <maciej.k.mrozinski@gmail.com>
|
||||
Luis Dalmolin <luis.nh@gmail.com>
|
||||
Mark Aaron Shirley <maspwr@gmail.com>
|
||||
Martin Hoch <martin@fidion.de>
|
||||
Jiayi Yang <tr870829@gmail.com>
|
||||
Philipp Benjamin Köppchen <xgxtpbk@gws.ms>
|
||||
Sindre Sorhus <sindresorhus@gmail.com>
|
||||
Bernhard Sirlinger <bernhard.sirlinger@tele2.de>
|
||||
Jared A. Scheel <jared@jaredscheel.com>
|
||||
Rafael Xavier de Souza <rxaviers@gmail.com>
|
||||
John Chen <zhang.z.chen@intel.com>
|
||||
Robert Beuligmann <robertbeuligmann@gmail.com>
|
||||
Dale Kocian <dale.kocian@gmail.com>
|
||||
Mike Sherov <mike.sherov@gmail.com>
|
||||
Andrew Couch <andy@couchand.com>
|
||||
Marc-Andre Lafortune <github@marc-andre.ca>
|
||||
Nate Eagle <nate.eagle@teamaol.com>
|
||||
David Souther <davidsouther@gmail.com>
|
||||
Mathias Stenbom <mathias@stenbom.com>
|
||||
Sergey Kartashov <ebishkek@yandex.ru>
|
||||
Avinash R <nashpapa@gmail.com>
|
||||
Ethan Romba <ethanromba@gmail.com>
|
||||
Cory Gackenheimer <cory.gack@gmail.com>
|
||||
Juan Pablo Kaniefsky <jpkaniefsky@gmail.com>
|
||||
Roman Salnikov <bardt.dz@gmail.com>
|
||||
Anika Henke <anika@selfthinker.org>
|
||||
Samuel Bovée <samycookie2000@yahoo.fr>
|
||||
Fabrício Matté <ult_combo@hotmail.com>
|
||||
Viktor Kojouharov <vkojouharov@gmail.com>
|
||||
Pawel Maruszczyk (http://hrabstwo.net)
|
||||
Pavel Selitskas <p.selitskas@gmail.com>
|
||||
Bjørn Johansen <post@bjornjohansen.no>
|
||||
Matthieu Penant <thieum22@hotmail.com>
|
||||
Dominic Barnes <dominic@dbarnes.info>
|
||||
David Sullivan <david.sullivan@gmail.com>
|
||||
Thomas Jaggi <thomas@responsive.ch>
|
||||
Vahid Sohrabloo <vahid4134@gmail.com>
|
||||
Travis Carden <travis.carden@gmail.com>
|
||||
Bruno M. Custódio <bruno@brunomcustodio.com>
|
||||
Nathanael Silverman <nathanael.silverman@gmail.com>
|
||||
Christian Wenz <christian@wenz.org>
|
||||
Steve Urmston <steve@urm.st>
|
||||
Zaven Muradyan <megalivoithos@gmail.com>
|
||||
Woody Gilk <shadowhand@deviantart.com>
|
||||
Zbigniew Motyka <zbigniew.motyka@gmail.com>
|
||||
Suhail Alkowaileet <xsoh.k7@gmail.com>
|
||||
Toshi MARUYAMA <marutosijp2@yahoo.co.jp>
|
||||
David Hansen <hansede@gmail.com>
|
||||
Brian Grinstead <briangrinstead@gmail.com>
|
||||
Christian Klammer <christian314159@gmail.com>
|
||||
Steven Luscher <jquerycla@steveluscher.com>
|
||||
Gan Eng Chin <engchin.gan@gmail.com>
|
||||
Gabriel Schulhof <gabriel.schulhof@intel.com>
|
||||
Alexander Schmitz <arschmitz@gmail.com>
|
||||
Vilhjálmur Skúlason <vis@dmm.is>
|
||||
Siebrand Mazeland <siebrand@kitano.nl>
|
||||
Mohsen Ekhtiari <mohsenekhtiari@yahoo.com>
|
||||
Pere Orga <gotrunks@gmail.com>
|
||||
Jasper de Groot <mail@ugomobi.com>
|
||||
Stephane Deschamps <stephane.deschamps@gmail.com>
|
||||
Jyoti Deka <dekajp@gmail.com>
|
||||
Andrei Picus <office.nightcrawler@gmail.com>
|
||||
Ondrej Novy <novy@ondrej.org>
|
||||
Jacob McCutcheon <jacob.mccutcheon@gmail.com>
|
||||
Monika Piotrowicz <monika.piotrowicz@gmail.com>
|
||||
Imants Horsts <imants.horsts@inbox.lv>
|
||||
Eric Dahl <eric.c.dahl@gmail.com>
|
||||
Dave Stein <dave@behance.com>
|
||||
Dylan Barrell <dylan@barrell.com>
|
||||
Daniel DeGroff <djdegroff@gmail.com>
|
||||
Michael Wiencek <mwtuea@gmail.com>
|
||||
Thomas Meyer <meyertee@gmail.com>
|
||||
Ruslan Yakhyaev <ruslan@ruslan.io>
|
||||
Brian J. Dowling <bjd-dev@simplicity.net>
|
||||
Ben Higgins <ben@extrahop.com>
|
||||
Yermo Lamers <yml@yml.com>
|
||||
Patrick Stapleton <github@gdi2290.com>
|
||||
Trisha Crowley <trisha.crowley@gmail.com>
|
||||
Usman Akeju <akeju00+github@gmail.com>
|
||||
Rodrigo Menezes <rod333@gmail.com>
|
||||
Jacques Perrault <jacques_perrault@us.ibm.com>
|
||||
Frederik Elvhage <frederik.elvhage@googlemail.com>
|
||||
Will Holley <willholley@gmail.com>
|
||||
Uri Gilad <antishok@gmail.com>
|
||||
Richard Gibson <richard.gibson@gmail.com>
|
||||
Simen Bekkhus <sbekkhus91@gmail.com>
|
||||
Chen Eshchar <eshcharc@gmail.com>
|
||||
Bruno Pérel <brunoperel@gmail.com>
|
||||
Mohammed Alshehri <m@dralshehri.com>
|
||||
Lisa Seacat DeLuca <ldeluca@us.ibm.com>
|
||||
Anne-Gaelle Colom <coloma@westminster.ac.uk>
|
||||
Adam Foster <slimfoster@gmail.com>
|
||||
Luke Page <luke.a.page@gmail.com>
|
||||
Daniel Owens <daniel@matchstickmixup.com>
|
||||
Michael Orchard <morchard@scottlogic.co.uk>
|
||||
Marcus Warren <marcus@envoke.com>
|
||||
Nils Heuermann <nils@world-of-scripts.de>
|
||||
Marco Ziech <marco@ziech.net>
|
||||
Patricia Juarez <patrixd@gmail.com>
|
||||
Ben Mosher <me@benmosher.com>
|
||||
Ablay Keldibek <atomio.ak@gmail.com>
|
||||
Thomas Applencourt <thomas.applencourt@irsamc.ups-tlse.fr>
|
||||
Jiabao Wu <jiabao.foss@gmail.com>
|
||||
Eric Lee Carraway <github@ericcarraway.com>
|
||||
Victor Homyakov <vkhomyackov@gmail.com>
|
||||
Myeongjin Lee <aranet100@gmail.com>
|
||||
Liran Sharir <lsharir@gmail.com>
|
||||
Weston Ruter <weston@xwp.co>
|
||||
Mani Mishra <manimishra902@gmail.com>
|
||||
Hannah Methvin <hannahmethvin@gmail.com>
|
||||
Leonardo Balter <leonardo.balter@gmail.com>
|
||||
Benjamin Albert <benjamin_a5@yahoo.com>
|
||||
Michał Gołębiowski-Owczarek <m.goleb@gmail.com>
|
||||
Alyosha Pushak <alyosha.pushak@gmail.com>
|
||||
Fahad Ahmad <fahadahmad41@hotmail.com>
|
||||
Matt Brundage <github@mattbrundage.com>
|
||||
Francesc Baeta <francesc.baeta@gmail.com>
|
||||
Piotr Baran <piotros@wp.pl>
|
||||
Mukul Hase <mukulhase@gmail.com>
|
||||
Konstantin Dinev <kdinev@mail.bw.edu>
|
||||
Rand Scullard <rand@randscullard.com>
|
||||
Dan Strohl <dan@wjcg.net>
|
||||
Maksim Ryzhikov <rv.maksim@gmail.com>
|
||||
Amine HADDAD <haddad@allegorie.tv>
|
||||
Amanpreet Singh <apsdehal@gmail.com>
|
||||
Alexey Balchunas <bleshik@gmail.com>
|
||||
Peter Kehl <peter.kehl@gmail.com>
|
||||
Peter Dave Hello <hsu@peterdavehello.org>
|
||||
Johannes Schäfer <johnschaefer@gmx.de>
|
||||
Ville Skyttä <ville.skytta@iki.fi>
|
||||
Ryan Oriecuia <ryan.oriecuia@visioncritical.com>
|
||||
Sergei Ratnikov <sergeir82@gmail.com>
|
||||
milk54 <milk851@gmail.com>
|
||||
Evelyn Masso <evoutofambit@gmail.com>
|
||||
Robin <mail@robin-fowler.com>
|
||||
Simon Asika <asika32764@gmail.com>
|
||||
Kevin Cupp <kevin.cupp@gmail.com>
|
||||
Jeremy Mickelson <Jeremy.Mickelson@gmail.com>
|
||||
Kyle Rosenberg <kyle.rosenberg@gmail.com>
|
||||
Petri Partio <petri.partio@gmail.com>
|
||||
pallxk <github@pallxk.com>
|
||||
Luke Brookhart <luke@onjax.com>
|
||||
claudi <hirt-claudia@gmx.de>
|
||||
Eirik Sletteberg <eiriksletteberg@gmail.com>
|
||||
Albert Johansson <albert@intervaro.se>
|
||||
A. Wells <borgboyone@users.noreply.github.com>
|
||||
Robert Brignull <robertbrignull@gmail.com>
|
||||
Horus68 <pauloizidoro@gmail.com>
|
||||
Maksymenkov Eugene <foatei@gmail.com>
|
||||
OskarNS <soerensen.oskar@gmail.com>
|
||||
Gez Quinn <holla@gezquinn.design>
|
||||
jigar gala <jigar.gala140291@gmail.com>
|
||||
Florian Wegscheider <flo.wegscheider@gmail.com>
|
||||
Fatér Zsolt <fater.zsolt@gmail.com>
|
||||
Szabolcs Szabolcsi-Toth <nec@shell8.net>
|
||||
Jérémy Munsch <github@jeremydev.ovh>
|
||||
Hrvoje Novosel <hrvoje.novosel@gmail.com>
|
||||
Paul Capron <PaulCapron@users.noreply.github.com>
|
||||
Micah Miller <mikhey@runbox.com>
|
||||
sakshi87 <53863764+sakshi87@users.noreply.github.com>
|
||||
Mikolaj Wolicki <wolicki.mikolaj@gmail.com>
|
||||
Patrick McKay <patrick.mckay@vumc.org>
|
||||
c-lambert <58025159+c-lambert@users.noreply.github.com>
|
||||
Josep Sanz <josepsanzcamp@gmail.com>
|
||||
Ben Mullins <benm@umich.edu>
|
||||
Christian Oliff <christianoliff@pm.me>
|
||||
dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
|
||||
Adam Lidén Hällgren <adamlh92@gmail.com>
|
||||
James Hinderks <hinderks@gmail.com>
|
||||
Denny Septian Panggabean <97607754+ddevsr@users.noreply.github.com>
|
||||
Matías Cánepa <matias.canepa@gmail.com>
|
||||
Ashish Kurmi <100655670+boahc077@users.noreply.github.com>
|
||||
DeerBear <andrea.raimondi@gmail.com>
|
||||
Дилян Палаузов <dpa-github@aegee.org>
|
||||
Kenneth DeBacker <kcdebacker@gmail.com>
|
||||
Timo Tijhof <krinkle@fastmail.com>
|
||||
Timmy Willison <timmywil@users.noreply.github.com>
|
||||
divdeploy <166095818+divdeploy@users.noreply.github.com>
|
||||
mark van tilburg <markvantilburg@gmail.com>
|
||||
Ralf Koller <1665422+rpkoller@users.noreply.github.com>
|
||||
Porter Clevidence <116387727+porterclev@users.noreply.github.com>
|
||||
Daniel García <93217193+Daniel-Garmig@users.noreply.github.com>
|
||||
@@ -0,0 +1,43 @@
|
||||
Copyright OpenJS Foundation and other contributors, https://openjsf.org/
|
||||
|
||||
This software consists of voluntary contributions made by many
|
||||
individuals. For exact contribution history, see the revision history
|
||||
available at https://github.com/jquery/jquery-ui
|
||||
|
||||
The following license applies to all parts of this software except as
|
||||
documented below:
|
||||
|
||||
====
|
||||
|
||||
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.
|
||||
|
||||
====
|
||||
|
||||
Copyright and related rights for sample code are waived via CC0. Sample
|
||||
code is defined as all source code contained within the demos directory.
|
||||
|
||||
CC0: http://creativecommons.org/publicdomain/zero/1.0/
|
||||
|
||||
====
|
||||
|
||||
All files located in the node_modules and external directories are
|
||||
externally maintained libraries used by this software which have their
|
||||
own licenses; we recommend you read them, as their terms may differ from
|
||||
the terms above.
|
||||
+10716
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
After Width: | Height: | Size: 6.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 6.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 4.5 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 6.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 4.5 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 6.2 KiB |
@@ -0,0 +1,503 @@
|
||||
<!doctype html>
|
||||
<html lang="us">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>jQuery UI Example Page</title>
|
||||
<link href="jquery-ui.css" rel="stylesheet">
|
||||
<style>
|
||||
body{
|
||||
font-family: "Trebuchet MS", sans-serif;
|
||||
margin: 50px;
|
||||
}
|
||||
.demoHeaders {
|
||||
margin-top: 2em;
|
||||
}
|
||||
#dialog-link {
|
||||
padding: .4em 1em .4em 20px;
|
||||
text-decoration: none;
|
||||
position: relative;
|
||||
}
|
||||
#dialog-link span.ui-icon {
|
||||
margin: 0 5px 0 0;
|
||||
position: absolute;
|
||||
left: .2em;
|
||||
top: 50%;
|
||||
margin-top: -8px;
|
||||
}
|
||||
#icons {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
#icons li {
|
||||
margin: 2px;
|
||||
position: relative;
|
||||
padding: 4px 0;
|
||||
cursor: pointer;
|
||||
float: left;
|
||||
list-style: none;
|
||||
}
|
||||
#icons span.ui-icon {
|
||||
float: left;
|
||||
margin: 0 4px;
|
||||
}
|
||||
.fakewindowcontain .ui-widget-overlay {
|
||||
position: absolute;
|
||||
}
|
||||
select {
|
||||
width: 200px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>Welcome to jQuery UI!</h1>
|
||||
|
||||
<div class="ui-widget">
|
||||
<p>This page demonstrates the widgets and theme you selected in Download Builder. Please make sure you are using them with a compatible jQuery version.</p>
|
||||
</div>
|
||||
|
||||
<h1>YOUR COMPONENTS:</h1>
|
||||
|
||||
<!-- Accordion -->
|
||||
<h2 class="demoHeaders">Accordion</h2>
|
||||
<div id="accordion">
|
||||
<h3>First</h3>
|
||||
<div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
|
||||
<h3>Second</h3>
|
||||
<div>Phasellus mattis tincidunt nibh.</div>
|
||||
<h3>Third</h3>
|
||||
<div>Nam dui erat, auctor a, dignissim quis.</div>
|
||||
</div>
|
||||
|
||||
<!-- Autocomplete -->
|
||||
<h2 class="demoHeaders">Autocomplete</h2>
|
||||
<div>
|
||||
<input id="autocomplete" title="type "a"">
|
||||
</div>
|
||||
|
||||
<!-- Button -->
|
||||
<h2 class="demoHeaders">Button</h2>
|
||||
<button id="button">A button element</button>
|
||||
<button id="button-icon">An icon-only button</button>
|
||||
|
||||
<!-- Checkboxradio -->
|
||||
<h2 class="demoHeaders">Checkboxradio</h2>
|
||||
<form style="margin-top: 1em;">
|
||||
<div id="radioset">
|
||||
<input type="radio" id="radio1" name="radio"><label for="radio1">Choice 1</label>
|
||||
<input type="radio" id="radio2" name="radio" checked="checked"><label for="radio2">Choice 2</label>
|
||||
<input type="radio" id="radio3" name="radio"><label for="radio3">Choice 3</label>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<!-- Controlgroup -->
|
||||
<h2 class="demoHeaders">Controlgroup</h2>
|
||||
<fieldset>
|
||||
<legend>Rental Car</legend>
|
||||
<div id="controlgroup">
|
||||
<select id="car-type">
|
||||
<option>Compact car</option>
|
||||
<option>Midsize car</option>
|
||||
<option>Full size car</option>
|
||||
<option>SUV</option>
|
||||
<option>Luxury</option>
|
||||
<option>Truck</option>
|
||||
<option>Van</option>
|
||||
</select>
|
||||
<label for="transmission-standard">Standard</label>
|
||||
<input type="radio" name="transmission" id="transmission-standard">
|
||||
<label for="transmission-automatic">Automatic</label>
|
||||
<input type="radio" name="transmission" id="transmission-automatic">
|
||||
<label for="insurance">Insurance</label>
|
||||
<input type="checkbox" name="insurance" id="insurance">
|
||||
<label for="horizontal-spinner" class="ui-controlgroup-label"># of cars</label>
|
||||
<input id="horizontal-spinner" class="ui-spinner-input">
|
||||
<button>Book Now!</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
<!-- Tabs -->
|
||||
<h2 class="demoHeaders">Tabs</h2>
|
||||
<div id="tabs">
|
||||
<ul>
|
||||
<li><a href="#tabs-1">First</a></li>
|
||||
<li><a href="#tabs-2">Second</a></li>
|
||||
<li><a href="#tabs-3">Third</a></li>
|
||||
</ul>
|
||||
<div id="tabs-1">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</div>
|
||||
<div id="tabs-2">Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.</div>
|
||||
<div id="tabs-3">Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.</div>
|
||||
</div>
|
||||
|
||||
<h2 class="demoHeaders">Dialog</h2>
|
||||
<p>
|
||||
<button id="dialog-link" class="ui-button ui-corner-all ui-widget">
|
||||
<span class="ui-icon ui-icon-newwin"></span>Open Dialog
|
||||
</button>
|
||||
</p>
|
||||
|
||||
<h2 class="demoHeaders">Overlay and Shadow Classes</h2>
|
||||
<div style="position: relative; width: 96%; height: 200px; padding:1% 2%; overflow:hidden;" class="fakewindowcontain">
|
||||
<p>Lorem ipsum dolor sit amet, Nulla nec tortor. Donec id elit quis purus consectetur consequat. </p><p>Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. </p><p>Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. </p><p>Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. </p><p>Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. </p><p>Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. </p>
|
||||
|
||||
<!-- ui-dialog -->
|
||||
<div class="ui-widget-overlay ui-front"></div>
|
||||
<div style="position: absolute; width: 320px; left: 50px; top: 30px; padding: 1.2em" class="ui-widget ui-front ui-widget-content ui-corner-all ui-widget-shadow">
|
||||
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- ui-dialog -->
|
||||
<div id="dialog" title="Dialog Title">
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
|
||||
</div>
|
||||
|
||||
|
||||
<h2 class="demoHeaders">Framework Icons (content color preview)</h2>
|
||||
<ul id="icons" class="ui-widget ui-helper-clearfix">
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-n"><span class="ui-icon ui-icon-caret-1-n"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-ne"><span class="ui-icon ui-icon-caret-1-ne"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-e"><span class="ui-icon ui-icon-caret-1-e"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-se"><span class="ui-icon ui-icon-caret-1-se"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-s"><span class="ui-icon ui-icon-caret-1-s"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-sw"><span class="ui-icon ui-icon-caret-1-sw"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-w"><span class="ui-icon ui-icon-caret-1-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-1-nw"><span class="ui-icon ui-icon-caret-1-nw"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-2-n-s"><span class="ui-icon ui-icon-caret-2-n-s"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-caret-2-e-w"><span class="ui-icon ui-icon-caret-2-e-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-n"><span class="ui-icon ui-icon-triangle-1-n"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-ne"><span class="ui-icon ui-icon-triangle-1-ne"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-e"><span class="ui-icon ui-icon-triangle-1-e"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-se"><span class="ui-icon ui-icon-triangle-1-se"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-s"><span class="ui-icon ui-icon-triangle-1-s"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-sw"><span class="ui-icon ui-icon-triangle-1-sw"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-w"><span class="ui-icon ui-icon-triangle-1-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-1-nw"><span class="ui-icon ui-icon-triangle-1-nw"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-2-n-s"><span class="ui-icon ui-icon-triangle-2-n-s"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-triangle-2-e-w"><span class="ui-icon ui-icon-triangle-2-e-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-n"><span class="ui-icon ui-icon-arrow-1-n"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-ne"><span class="ui-icon ui-icon-arrow-1-ne"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-e"><span class="ui-icon ui-icon-arrow-1-e"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-se"><span class="ui-icon ui-icon-arrow-1-se"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-s"><span class="ui-icon ui-icon-arrow-1-s"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-sw"><span class="ui-icon ui-icon-arrow-1-sw"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-w"><span class="ui-icon ui-icon-arrow-1-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-1-nw"><span class="ui-icon ui-icon-arrow-1-nw"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-n-s"><span class="ui-icon ui-icon-arrow-2-n-s"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-ne-sw"><span class="ui-icon ui-icon-arrow-2-ne-sw"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-e-w"><span class="ui-icon ui-icon-arrow-2-e-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-2-se-nw"><span class="ui-icon ui-icon-arrow-2-se-nw"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-n"><span class="ui-icon ui-icon-arrowstop-1-n"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-e"><span class="ui-icon ui-icon-arrowstop-1-e"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-s"><span class="ui-icon ui-icon-arrowstop-1-s"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowstop-1-w"><span class="ui-icon ui-icon-arrowstop-1-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-n"><span class="ui-icon ui-icon-arrowthick-1-n"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-ne"><span class="ui-icon ui-icon-arrowthick-1-ne"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-e"><span class="ui-icon ui-icon-arrowthick-1-e"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-se"><span class="ui-icon ui-icon-arrowthick-1-se"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-s"><span class="ui-icon ui-icon-arrowthick-1-s"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-sw"><span class="ui-icon ui-icon-arrowthick-1-sw"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-w"><span class="ui-icon ui-icon-arrowthick-1-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-1-nw"><span class="ui-icon ui-icon-arrowthick-1-nw"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-n-s"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-ne-sw"><span class="ui-icon ui-icon-arrowthick-2-ne-sw"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-e-w"><span class="ui-icon ui-icon-arrowthick-2-e-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthick-2-se-nw"><span class="ui-icon ui-icon-arrowthick-2-se-nw"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-n"><span class="ui-icon ui-icon-arrowthickstop-1-n"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-e"><span class="ui-icon ui-icon-arrowthickstop-1-e"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-s"><span class="ui-icon ui-icon-arrowthickstop-1-s"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowthickstop-1-w"><span class="ui-icon ui-icon-arrowthickstop-1-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-w"><span class="ui-icon ui-icon-arrowreturnthick-1-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-n"><span class="ui-icon ui-icon-arrowreturnthick-1-n"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-e"><span class="ui-icon ui-icon-arrowreturnthick-1-e"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturnthick-1-s"><span class="ui-icon ui-icon-arrowreturnthick-1-s"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-w"><span class="ui-icon ui-icon-arrowreturn-1-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-n"><span class="ui-icon ui-icon-arrowreturn-1-n"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-e"><span class="ui-icon ui-icon-arrowreturn-1-e"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowreturn-1-s"><span class="ui-icon ui-icon-arrowreturn-1-s"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-w"><span class="ui-icon ui-icon-arrowrefresh-1-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-n"><span class="ui-icon ui-icon-arrowrefresh-1-n"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-e"><span class="ui-icon ui-icon-arrowrefresh-1-e"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrowrefresh-1-s"><span class="ui-icon ui-icon-arrowrefresh-1-s"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-4"><span class="ui-icon ui-icon-arrow-4"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-arrow-4-diag"><span class="ui-icon ui-icon-arrow-4-diag"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-extlink"><span class="ui-icon ui-icon-extlink"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-newwin"><span class="ui-icon ui-icon-newwin"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-refresh"><span class="ui-icon ui-icon-refresh"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-shuffle"><span class="ui-icon ui-icon-shuffle"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-transfer-e-w"><span class="ui-icon ui-icon-transfer-e-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-transferthick-e-w"><span class="ui-icon ui-icon-transferthick-e-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-folder-collapsed"><span class="ui-icon ui-icon-folder-collapsed"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-folder-open"><span class="ui-icon ui-icon-folder-open"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-document"><span class="ui-icon ui-icon-document"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-document-b"><span class="ui-icon ui-icon-document-b"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-note"><span class="ui-icon ui-icon-note"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-mail-closed"><span class="ui-icon ui-icon-mail-closed"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-mail-open"><span class="ui-icon ui-icon-mail-open"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-suitcase"><span class="ui-icon ui-icon-suitcase"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-comment"><span class="ui-icon ui-icon-comment"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-person"><span class="ui-icon ui-icon-person"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-print"><span class="ui-icon ui-icon-print"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-trash"><span class="ui-icon ui-icon-trash"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-locked"><span class="ui-icon ui-icon-locked"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-unlocked"><span class="ui-icon ui-icon-unlocked"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-bookmark"><span class="ui-icon ui-icon-bookmark"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-tag"><span class="ui-icon ui-icon-tag"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-home"><span class="ui-icon ui-icon-home"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-flag"><span class="ui-icon ui-icon-flag"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-calculator"><span class="ui-icon ui-icon-calculator"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-cart"><span class="ui-icon ui-icon-cart"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-pencil"><span class="ui-icon ui-icon-pencil"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-clock"><span class="ui-icon ui-icon-clock"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-disk"><span class="ui-icon ui-icon-disk"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-calendar"><span class="ui-icon ui-icon-calendar"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-zoomin"><span class="ui-icon ui-icon-zoomin"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-zoomout"><span class="ui-icon ui-icon-zoomout"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-search"><span class="ui-icon ui-icon-search"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-wrench"><span class="ui-icon ui-icon-wrench"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-gear"><span class="ui-icon ui-icon-gear"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-heart"><span class="ui-icon ui-icon-heart"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-star"><span class="ui-icon ui-icon-star"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-link"><span class="ui-icon ui-icon-link"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-cancel"><span class="ui-icon ui-icon-cancel"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-plus"><span class="ui-icon ui-icon-plus"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-plusthick"><span class="ui-icon ui-icon-plusthick"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-minus"><span class="ui-icon ui-icon-minus"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-minusthick"><span class="ui-icon ui-icon-minusthick"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-close"><span class="ui-icon ui-icon-close"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-closethick"><span class="ui-icon ui-icon-closethick"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-key"><span class="ui-icon ui-icon-key"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-lightbulb"><span class="ui-icon ui-icon-lightbulb"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-scissors"><span class="ui-icon ui-icon-scissors"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-clipboard"><span class="ui-icon ui-icon-clipboard"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-copy"><span class="ui-icon ui-icon-copy"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-contact"><span class="ui-icon ui-icon-contact"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-image"><span class="ui-icon ui-icon-image"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-video"><span class="ui-icon ui-icon-video"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-script"><span class="ui-icon ui-icon-script"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-alert"><span class="ui-icon ui-icon-alert"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-info"><span class="ui-icon ui-icon-info"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-notice"><span class="ui-icon ui-icon-notice"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-help"><span class="ui-icon ui-icon-help"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-check"><span class="ui-icon ui-icon-check"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-bullet"><span class="ui-icon ui-icon-bullet"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-radio-off"><span class="ui-icon ui-icon-radio-off"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-radio-on"><span class="ui-icon ui-icon-radio-on"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-pin-w"><span class="ui-icon ui-icon-pin-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-pin-s"><span class="ui-icon ui-icon-pin-s"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-play"><span class="ui-icon ui-icon-play"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-pause"><span class="ui-icon ui-icon-pause"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-next"><span class="ui-icon ui-icon-seek-next"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-prev"><span class="ui-icon ui-icon-seek-prev"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-end"><span class="ui-icon ui-icon-seek-end"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-seek-first"><span class="ui-icon ui-icon-seek-first"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-stop"><span class="ui-icon ui-icon-stop"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-eject"><span class="ui-icon ui-icon-eject"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-volume-off"><span class="ui-icon ui-icon-volume-off"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-volume-on"><span class="ui-icon ui-icon-volume-on"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-power"><span class="ui-icon ui-icon-power"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-signal-diag"><span class="ui-icon ui-icon-signal-diag"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-signal"><span class="ui-icon ui-icon-signal"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-0"><span class="ui-icon ui-icon-battery-0"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-1"><span class="ui-icon ui-icon-battery-1"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-2"><span class="ui-icon ui-icon-battery-2"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-battery-3"><span class="ui-icon ui-icon-battery-3"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-plus"><span class="ui-icon ui-icon-circle-plus"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-minus"><span class="ui-icon ui-icon-circle-minus"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-close"><span class="ui-icon ui-icon-circle-close"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-e"><span class="ui-icon ui-icon-circle-triangle-e"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-s"><span class="ui-icon ui-icon-circle-triangle-s"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-w"><span class="ui-icon ui-icon-circle-triangle-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-triangle-n"><span class="ui-icon ui-icon-circle-triangle-n"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-e"><span class="ui-icon ui-icon-circle-arrow-e"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-s"><span class="ui-icon ui-icon-circle-arrow-s"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-w"><span class="ui-icon ui-icon-circle-arrow-w"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-arrow-n"><span class="ui-icon ui-icon-circle-arrow-n"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-zoomin"><span class="ui-icon ui-icon-circle-zoomin"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-zoomout"><span class="ui-icon ui-icon-circle-zoomout"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-circle-check"><span class="ui-icon ui-icon-circle-check"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-plus"><span class="ui-icon ui-icon-circlesmall-plus"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-minus"><span class="ui-icon ui-icon-circlesmall-minus"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-circlesmall-close"><span class="ui-icon ui-icon-circlesmall-close"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-plus"><span class="ui-icon ui-icon-squaresmall-plus"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-minus"><span class="ui-icon ui-icon-squaresmall-minus"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-squaresmall-close"><span class="ui-icon ui-icon-squaresmall-close"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-dotted-vertical"><span class="ui-icon ui-icon-grip-dotted-vertical"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-dotted-horizontal"><span class="ui-icon ui-icon-grip-dotted-horizontal"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-solid-vertical"><span class="ui-icon ui-icon-grip-solid-vertical"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-solid-horizontal"><span class="ui-icon ui-icon-grip-solid-horizontal"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-gripsmall-diagonal-se"><span class="ui-icon ui-icon-gripsmall-diagonal-se"></span></li>
|
||||
<li class="ui-state-default ui-corner-all" title=".ui-icon-grip-diagonal-se"><span class="ui-icon ui-icon-grip-diagonal-se"></span></li>
|
||||
</ul>
|
||||
|
||||
<!-- Slider -->
|
||||
<h2 class="demoHeaders">Slider</h2>
|
||||
<div id="slider"></div>
|
||||
|
||||
<!-- Datepicker -->
|
||||
<h2 class="demoHeaders">Datepicker</h2>
|
||||
<div id="datepicker"></div>
|
||||
|
||||
<!-- Progressbar -->
|
||||
<h2 class="demoHeaders">Progressbar</h2>
|
||||
<div id="progressbar"></div>
|
||||
|
||||
<!-- Progressbar -->
|
||||
<h2 class="demoHeaders">Selectmenu</h2>
|
||||
<select id="selectmenu">
|
||||
<option>Slower</option>
|
||||
<option>Slow</option>
|
||||
<option selected="selected">Medium</option>
|
||||
<option>Fast</option>
|
||||
<option>Faster</option>
|
||||
</select>
|
||||
|
||||
<!-- Spinner -->
|
||||
<h2 class="demoHeaders">Spinner</h2>
|
||||
<input id="spinner">
|
||||
|
||||
<!-- Menu -->
|
||||
<h2 class="demoHeaders">Menu</h2>
|
||||
<ul style="width:100px;" id="menu">
|
||||
<li><div>Item 1</div></li>
|
||||
<li><div>Item 2</div></li>
|
||||
<li><div>Item 3</div>
|
||||
<ul>
|
||||
<li><div>Item 3-1</div></li>
|
||||
<li><div>Item 3-2</div></li>
|
||||
<li><div>Item 3-3</div></li>
|
||||
<li><div>Item 3-4</div></li>
|
||||
<li><div>Item 3-5</div></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><div>Item 4</div></li>
|
||||
<li><div>Item 5</div></li>
|
||||
</ul>
|
||||
|
||||
<!-- Tooltip -->
|
||||
<h2 class="demoHeaders">Tooltip</h2>
|
||||
<p id="tooltip">
|
||||
<a href="#" title="That's what this widget is">Tooltips</a> can be attached to any element. When you hover
|
||||
the element with your mouse, the title attribute is displayed in a little box next to the element, just like a native tooltip.
|
||||
</p>
|
||||
|
||||
<!-- Highlight / Error -->
|
||||
<h2 class="demoHeaders">Highlight / Error</h2>
|
||||
<div class="ui-widget">
|
||||
<div class="ui-state-highlight ui-corner-all" style="margin-top: 20px; padding: 0 .7em;">
|
||||
<p><span class="ui-icon ui-icon-info" style="float: left; margin-right: .3em;"></span>
|
||||
<strong>Hey!</strong> Sample ui-state-highlight style.</p>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<div class="ui-widget">
|
||||
<div class="ui-state-error ui-corner-all" style="padding: 0 .7em;">
|
||||
<p><span class="ui-icon ui-icon-alert" style="float: left; margin-right: .3em;"></span>
|
||||
<strong>Alert:</strong> Sample ui-state-error style.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="external/jquery/jquery.js"></script>
|
||||
<script src="jquery-ui.js"></script>
|
||||
<script>
|
||||
$( "#accordion" ).accordion();
|
||||
|
||||
var availableTags = [
|
||||
"ActionScript",
|
||||
"AppleScript",
|
||||
"Asp",
|
||||
"BASIC",
|
||||
"C",
|
||||
"C++",
|
||||
"Clojure",
|
||||
"COBOL",
|
||||
"ColdFusion",
|
||||
"Erlang",
|
||||
"Fortran",
|
||||
"Groovy",
|
||||
"Haskell",
|
||||
"Java",
|
||||
"JavaScript",
|
||||
"Lisp",
|
||||
"Perl",
|
||||
"PHP",
|
||||
"Python",
|
||||
"Ruby",
|
||||
"Scala",
|
||||
"Scheme"
|
||||
];
|
||||
$( "#autocomplete" ).autocomplete({
|
||||
source: availableTags
|
||||
});
|
||||
|
||||
$( "#button" ).button();
|
||||
$( "#button-icon" ).button({
|
||||
icon: "ui-icon-gear",
|
||||
showLabel: false
|
||||
});
|
||||
|
||||
$( "#radioset" ).controlgroup();
|
||||
|
||||
$( "#controlgroup" ).controlgroup();
|
||||
|
||||
$( "#tabs" ).tabs();
|
||||
|
||||
$( "#dialog" ).dialog({
|
||||
autoOpen: false,
|
||||
width: 400,
|
||||
buttons: [
|
||||
{
|
||||
text: "Ok",
|
||||
click: function() {
|
||||
$( this ).dialog( "close" );
|
||||
}
|
||||
},
|
||||
{
|
||||
text: "Cancel",
|
||||
click: function() {
|
||||
$( this ).dialog( "close" );
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
// Link to open the dialog
|
||||
$( "#dialog-link" ).click(function( event ) {
|
||||
$( "#dialog" ).dialog( "open" );
|
||||
event.preventDefault();
|
||||
});
|
||||
|
||||
$( "#datepicker" ).datepicker({
|
||||
inline: true
|
||||
});
|
||||
|
||||
$( "#slider" ).slider({
|
||||
range: true,
|
||||
values: [ 17, 67 ]
|
||||
});
|
||||
|
||||
$( "#progressbar" ).progressbar({
|
||||
value: 20
|
||||
});
|
||||
|
||||
$( "#spinner" ).spinner();
|
||||
|
||||
$( "#menu" ).menu();
|
||||
|
||||
$( "#tooltip" ).tooltip();
|
||||
|
||||
$( "#selectmenu" ).selectmenu();
|
||||
|
||||
// Hover states on the static widgets
|
||||
$( "#dialog-link, #icons li" ).hover(
|
||||
function() {
|
||||
$( this ).addClass( "ui-state-hover" );
|
||||
},
|
||||
function() {
|
||||
$( this ).removeClass( "ui-state-hover" );
|
||||
}
|
||||
);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
+1285
File diff suppressed because it is too large
Load Diff
+18842
File diff suppressed because it is too large
Load Diff
+7
File diff suppressed because one or more lines are too long
+6
File diff suppressed because one or more lines are too long
+863
@@ -0,0 +1,863 @@
|
||||
/*!
|
||||
* jQuery UI CSS Framework 1.14.2
|
||||
* https://jqueryui.com
|
||||
*
|
||||
* Copyright OpenJS Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* https://jquery.org/license
|
||||
*
|
||||
* https://api.jqueryui.com/category/theming/
|
||||
*/
|
||||
/* Layout helpers
|
||||
----------------------------------*/
|
||||
.ui-helper-hidden {
|
||||
display: none;
|
||||
}
|
||||
.ui-helper-hidden-accessible {
|
||||
border: 0;
|
||||
clip: rect(0 0 0 0);
|
||||
height: 1px;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
}
|
||||
.ui-helper-reset {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
outline: 0;
|
||||
line-height: 1.3;
|
||||
text-decoration: none;
|
||||
font-size: 100%;
|
||||
list-style: none;
|
||||
}
|
||||
.ui-helper-clearfix:before,
|
||||
.ui-helper-clearfix:after {
|
||||
content: "";
|
||||
display: table;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
.ui-helper-clearfix:after {
|
||||
clear: both;
|
||||
}
|
||||
.ui-helper-zfix {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: 0;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.ui-front {
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
|
||||
/* Interaction Cues
|
||||
----------------------------------*/
|
||||
.ui-state-disabled {
|
||||
cursor: default !important;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
|
||||
/* Icons
|
||||
----------------------------------*/
|
||||
.ui-icon {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
margin-top: -.25em;
|
||||
position: relative;
|
||||
text-indent: -99999px;
|
||||
overflow: hidden;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
.ui-widget-icon-block {
|
||||
left: 50%;
|
||||
margin-left: -8px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* Misc visuals
|
||||
----------------------------------*/
|
||||
|
||||
/* Overlays */
|
||||
.ui-widget-overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.ui-accordion .ui-accordion-header {
|
||||
display: block;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
margin: 2px 0 0 0;
|
||||
padding: .5em .5em .5em .7em;
|
||||
font-size: 100%;
|
||||
}
|
||||
.ui-accordion .ui-accordion-content {
|
||||
padding: 1em 2.2em;
|
||||
border-top: 0;
|
||||
overflow: auto;
|
||||
}
|
||||
.ui-autocomplete {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
cursor: default;
|
||||
}
|
||||
.ui-menu {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
display: block;
|
||||
outline: 0;
|
||||
}
|
||||
.ui-menu .ui-menu {
|
||||
position: absolute;
|
||||
}
|
||||
.ui-menu .ui-menu-item {
|
||||
margin: 0;
|
||||
cursor: pointer;
|
||||
}
|
||||
.ui-menu .ui-menu-item-wrapper {
|
||||
position: relative;
|
||||
padding: 3px 1em 3px .4em;
|
||||
}
|
||||
.ui-menu .ui-menu-divider {
|
||||
margin: 5px 0;
|
||||
height: 0;
|
||||
font-size: 0;
|
||||
line-height: 0;
|
||||
border-width: 1px 0 0 0;
|
||||
}
|
||||
.ui-menu .ui-state-focus,
|
||||
.ui-menu .ui-state-active {
|
||||
margin: -1px;
|
||||
}
|
||||
|
||||
/* icon support */
|
||||
.ui-menu-icons {
|
||||
position: relative;
|
||||
}
|
||||
.ui-menu-icons .ui-menu-item-wrapper {
|
||||
padding-left: 2em;
|
||||
}
|
||||
|
||||
/* left-aligned */
|
||||
.ui-menu .ui-icon {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: .2em;
|
||||
margin: auto 0;
|
||||
}
|
||||
|
||||
/* right-aligned */
|
||||
.ui-menu .ui-menu-icon {
|
||||
left: auto;
|
||||
right: 0;
|
||||
}
|
||||
.ui-button {
|
||||
padding: .4em 1em;
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
line-height: normal;
|
||||
margin-right: .1em;
|
||||
cursor: pointer;
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
-webkit-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.ui-button,
|
||||
.ui-button:link,
|
||||
.ui-button:visited,
|
||||
.ui-button:hover,
|
||||
.ui-button:active {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* to make room for the icon, a width needs to be set here */
|
||||
.ui-button-icon-only {
|
||||
width: 2em;
|
||||
box-sizing: border-box;
|
||||
text-indent: -9999px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/* no icon support for input elements */
|
||||
input.ui-button.ui-button-icon-only {
|
||||
text-indent: 0;
|
||||
}
|
||||
|
||||
/* button icon element(s) */
|
||||
.ui-button-icon-only .ui-icon {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
margin-top: -8px;
|
||||
margin-left: -8px;
|
||||
}
|
||||
|
||||
.ui-button.ui-icon-notext .ui-icon {
|
||||
padding: 0;
|
||||
width: 2.1em;
|
||||
height: 2.1em;
|
||||
text-indent: -9999px;
|
||||
white-space: nowrap;
|
||||
|
||||
}
|
||||
|
||||
input.ui-button.ui-icon-notext .ui-icon {
|
||||
width: auto;
|
||||
height: auto;
|
||||
text-indent: 0;
|
||||
white-space: normal;
|
||||
padding: .4em 1em;
|
||||
}
|
||||
|
||||
/* workarounds */
|
||||
/* Support: Firefox 5 - 125+ */
|
||||
input.ui-button::-moz-focus-inner,
|
||||
button.ui-button::-moz-focus-inner {
|
||||
border: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.ui-controlgroup {
|
||||
vertical-align: middle;
|
||||
display: inline-block;
|
||||
}
|
||||
.ui-controlgroup > .ui-controlgroup-item {
|
||||
float: left;
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
.ui-controlgroup > .ui-controlgroup-item:focus,
|
||||
.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus {
|
||||
z-index: 9999;
|
||||
}
|
||||
.ui-controlgroup-vertical > .ui-controlgroup-item {
|
||||
display: block;
|
||||
float: none;
|
||||
width: 100%;
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
text-align: left;
|
||||
}
|
||||
.ui-controlgroup-vertical .ui-controlgroup-item {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.ui-controlgroup .ui-controlgroup-label {
|
||||
padding: .4em 1em;
|
||||
}
|
||||
.ui-controlgroup .ui-controlgroup-label span {
|
||||
font-size: 80%;
|
||||
}
|
||||
.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item {
|
||||
border-left: none;
|
||||
}
|
||||
.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item {
|
||||
border-top: none;
|
||||
}
|
||||
.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content {
|
||||
border-right: none;
|
||||
}
|
||||
.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
/* Spinner specific style fixes */
|
||||
.ui-controlgroup-vertical .ui-spinner-input {
|
||||
width: calc( 100% - 2.4em );
|
||||
}
|
||||
.ui-controlgroup-vertical .ui-spinner .ui-spinner-up {
|
||||
border-top-style: solid;
|
||||
}
|
||||
|
||||
.ui-checkboxradio-label .ui-icon-background {
|
||||
box-shadow: inset 1px 1px 1px #ccc;
|
||||
border-radius: .12em;
|
||||
border: none;
|
||||
}
|
||||
.ui-checkboxradio-radio-label .ui-icon-background {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
border-radius: 1em;
|
||||
overflow: visible;
|
||||
border: none;
|
||||
}
|
||||
.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,
|
||||
.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon {
|
||||
background-image: none;
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-width: 4px;
|
||||
border-style: solid;
|
||||
}
|
||||
.ui-checkboxradio-disabled {
|
||||
pointer-events: none;
|
||||
}
|
||||
.ui-datepicker {
|
||||
width: 17em;
|
||||
padding: .2em .2em 0;
|
||||
display: none;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-header {
|
||||
position: relative;
|
||||
padding: .2em 0;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-prev,
|
||||
.ui-datepicker .ui-datepicker-next {
|
||||
position: absolute;
|
||||
top: 2px;
|
||||
width: 1.8em;
|
||||
height: 1.8em;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-prev-hover,
|
||||
.ui-datepicker .ui-datepicker-next-hover {
|
||||
top: 1px;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-prev {
|
||||
left: 2px;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-next {
|
||||
right: 2px;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-prev-hover {
|
||||
left: 1px;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-next-hover {
|
||||
right: 1px;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-prev span,
|
||||
.ui-datepicker .ui-datepicker-next span {
|
||||
display: block;
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
margin-left: -8px;
|
||||
top: 50%;
|
||||
margin-top: -8px;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-title {
|
||||
margin: 0 2.3em;
|
||||
line-height: 1.8em;
|
||||
text-align: center;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-title select {
|
||||
font-size: 1em;
|
||||
margin: 1px 0;
|
||||
}
|
||||
.ui-datepicker select.ui-datepicker-month,
|
||||
.ui-datepicker select.ui-datepicker-year {
|
||||
width: 45%;
|
||||
}
|
||||
.ui-datepicker table {
|
||||
width: 100%;
|
||||
font-size: .9em;
|
||||
border-collapse: collapse;
|
||||
margin: 0 0 .4em;
|
||||
}
|
||||
.ui-datepicker th {
|
||||
padding: .7em .3em;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
border: 0;
|
||||
}
|
||||
.ui-datepicker td {
|
||||
border: 0;
|
||||
padding: 1px;
|
||||
}
|
||||
.ui-datepicker td span,
|
||||
.ui-datepicker td a {
|
||||
display: block;
|
||||
padding: .2em;
|
||||
text-align: right;
|
||||
text-decoration: none;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-buttonpane {
|
||||
background-image: none;
|
||||
margin: .7em 0 0 0;
|
||||
padding: 0 .2em;
|
||||
border-left: 0;
|
||||
border-right: 0;
|
||||
border-bottom: 0;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-buttonpane button {
|
||||
float: right;
|
||||
margin: .5em .2em .4em;
|
||||
cursor: pointer;
|
||||
padding: .2em .6em .3em .6em;
|
||||
width: auto;
|
||||
overflow: visible;
|
||||
}
|
||||
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
|
||||
float: left;
|
||||
}
|
||||
|
||||
/* with multiple calendars */
|
||||
.ui-datepicker.ui-datepicker-multi {
|
||||
width: auto;
|
||||
}
|
||||
.ui-datepicker-multi .ui-datepicker-group {
|
||||
float: left;
|
||||
}
|
||||
.ui-datepicker-multi .ui-datepicker-group table {
|
||||
width: 95%;
|
||||
margin: 0 auto .4em;
|
||||
}
|
||||
.ui-datepicker-multi-2 .ui-datepicker-group {
|
||||
width: 50%;
|
||||
}
|
||||
.ui-datepicker-multi-3 .ui-datepicker-group {
|
||||
width: 33.3%;
|
||||
}
|
||||
.ui-datepicker-multi-4 .ui-datepicker-group {
|
||||
width: 25%;
|
||||
}
|
||||
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
|
||||
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
|
||||
border-left-width: 0;
|
||||
}
|
||||
.ui-datepicker-multi .ui-datepicker-buttonpane {
|
||||
clear: left;
|
||||
}
|
||||
.ui-datepicker-row-break {
|
||||
clear: both;
|
||||
width: 100%;
|
||||
font-size: 0;
|
||||
}
|
||||
|
||||
/* RTL support */
|
||||
.ui-datepicker-rtl {
|
||||
direction: rtl;
|
||||
}
|
||||
.ui-datepicker-rtl .ui-datepicker-prev {
|
||||
right: 2px;
|
||||
left: auto;
|
||||
}
|
||||
.ui-datepicker-rtl .ui-datepicker-next {
|
||||
left: 2px;
|
||||
right: auto;
|
||||
}
|
||||
.ui-datepicker-rtl .ui-datepicker-prev:hover {
|
||||
right: 1px;
|
||||
left: auto;
|
||||
}
|
||||
.ui-datepicker-rtl .ui-datepicker-next:hover {
|
||||
left: 1px;
|
||||
right: auto;
|
||||
}
|
||||
.ui-datepicker-rtl .ui-datepicker-buttonpane {
|
||||
clear: right;
|
||||
}
|
||||
.ui-datepicker-rtl .ui-datepicker-buttonpane button {
|
||||
float: left;
|
||||
}
|
||||
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
|
||||
.ui-datepicker-rtl .ui-datepicker-group {
|
||||
float: right;
|
||||
}
|
||||
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
|
||||
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
|
||||
border-right-width: 0;
|
||||
border-left-width: 1px;
|
||||
}
|
||||
|
||||
/* Icons */
|
||||
.ui-datepicker .ui-icon {
|
||||
display: block;
|
||||
text-indent: -99999px;
|
||||
overflow: hidden;
|
||||
background-repeat: no-repeat;
|
||||
left: .5em;
|
||||
top: .3em;
|
||||
}
|
||||
.ui-dialog {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
padding: .2em;
|
||||
outline: 0;
|
||||
}
|
||||
.ui-dialog .ui-dialog-titlebar {
|
||||
padding: .4em 1em;
|
||||
position: relative;
|
||||
}
|
||||
.ui-dialog .ui-dialog-title {
|
||||
float: left;
|
||||
margin: .1em 0;
|
||||
white-space: nowrap;
|
||||
width: 90%;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.ui-dialog .ui-dialog-titlebar-close {
|
||||
position: absolute;
|
||||
right: .3em;
|
||||
top: 50%;
|
||||
width: 20px;
|
||||
margin: -10px 0 0 0;
|
||||
padding: 1px;
|
||||
height: 20px;
|
||||
}
|
||||
.ui-dialog .ui-dialog-content {
|
||||
position: relative;
|
||||
border: 0;
|
||||
padding: .5em 1em;
|
||||
background: none;
|
||||
overflow: auto;
|
||||
}
|
||||
.ui-dialog .ui-dialog-buttonpane {
|
||||
text-align: left;
|
||||
border-width: 1px 0 0 0;
|
||||
background-image: none;
|
||||
margin-top: .5em;
|
||||
padding: .3em 1em .5em .4em;
|
||||
}
|
||||
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
|
||||
float: right;
|
||||
}
|
||||
.ui-dialog .ui-dialog-buttonpane button {
|
||||
margin: .5em .4em .5em 0;
|
||||
cursor: pointer;
|
||||
}
|
||||
.ui-dialog .ui-resizable-n {
|
||||
height: 2px;
|
||||
top: 0;
|
||||
}
|
||||
.ui-dialog .ui-resizable-e {
|
||||
width: 2px;
|
||||
right: 0;
|
||||
}
|
||||
.ui-dialog .ui-resizable-s {
|
||||
height: 2px;
|
||||
bottom: 0;
|
||||
}
|
||||
.ui-dialog .ui-resizable-w {
|
||||
width: 2px;
|
||||
left: 0;
|
||||
}
|
||||
.ui-dialog .ui-resizable-se,
|
||||
.ui-dialog .ui-resizable-sw,
|
||||
.ui-dialog .ui-resizable-ne,
|
||||
.ui-dialog .ui-resizable-nw {
|
||||
width: 7px;
|
||||
height: 7px;
|
||||
}
|
||||
.ui-dialog .ui-resizable-se {
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
.ui-dialog .ui-resizable-sw {
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
.ui-dialog .ui-resizable-ne {
|
||||
right: 0;
|
||||
top: 0;
|
||||
}
|
||||
.ui-dialog .ui-resizable-nw {
|
||||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
.ui-draggable .ui-dialog-titlebar {
|
||||
cursor: move;
|
||||
}
|
||||
.ui-draggable-handle {
|
||||
touch-action: none;
|
||||
}
|
||||
.ui-resizable {
|
||||
position: relative;
|
||||
}
|
||||
.ui-resizable-handle {
|
||||
position: absolute;
|
||||
font-size: 0.1px;
|
||||
display: block;
|
||||
touch-action: none;
|
||||
}
|
||||
.ui-resizable-disabled .ui-resizable-handle,
|
||||
.ui-resizable-autohide .ui-resizable-handle {
|
||||
display: none;
|
||||
}
|
||||
.ui-resizable-n {
|
||||
cursor: n-resize;
|
||||
height: 7px;
|
||||
width: 100%;
|
||||
top: -5px;
|
||||
left: 0;
|
||||
}
|
||||
.ui-resizable-s {
|
||||
cursor: s-resize;
|
||||
height: 7px;
|
||||
width: 100%;
|
||||
bottom: -5px;
|
||||
left: 0;
|
||||
}
|
||||
.ui-resizable-e {
|
||||
cursor: e-resize;
|
||||
width: 7px;
|
||||
right: -5px;
|
||||
top: 0;
|
||||
height: 100%;
|
||||
}
|
||||
.ui-resizable-w {
|
||||
cursor: w-resize;
|
||||
width: 7px;
|
||||
left: -5px;
|
||||
top: 0;
|
||||
height: 100%;
|
||||
}
|
||||
.ui-resizable-se {
|
||||
cursor: se-resize;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
right: 1px;
|
||||
bottom: 1px;
|
||||
}
|
||||
.ui-resizable-sw {
|
||||
cursor: sw-resize;
|
||||
width: 9px;
|
||||
height: 9px;
|
||||
left: -5px;
|
||||
bottom: -5px;
|
||||
}
|
||||
.ui-resizable-nw {
|
||||
cursor: nw-resize;
|
||||
width: 9px;
|
||||
height: 9px;
|
||||
left: -5px;
|
||||
top: -5px;
|
||||
}
|
||||
.ui-resizable-ne {
|
||||
cursor: ne-resize;
|
||||
width: 9px;
|
||||
height: 9px;
|
||||
right: -5px;
|
||||
top: -5px;
|
||||
}
|
||||
.ui-progressbar {
|
||||
height: 2em;
|
||||
text-align: left;
|
||||
overflow: hidden;
|
||||
}
|
||||
.ui-progressbar .ui-progressbar-value {
|
||||
margin: -1px;
|
||||
height: 100%;
|
||||
}
|
||||
.ui-progressbar .ui-progressbar-overlay {
|
||||
background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
|
||||
height: 100%;
|
||||
opacity: 0.25;
|
||||
}
|
||||
.ui-progressbar-indeterminate .ui-progressbar-value {
|
||||
background-image: none;
|
||||
}
|
||||
.ui-selectable {
|
||||
touch-action: none;
|
||||
}
|
||||
.ui-selectable-helper {
|
||||
position: absolute;
|
||||
z-index: 100;
|
||||
border: 1px dotted black;
|
||||
}
|
||||
.ui-selectmenu-menu {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
display: none;
|
||||
}
|
||||
.ui-selectmenu-menu .ui-menu {
|
||||
overflow: auto;
|
||||
overflow-x: hidden;
|
||||
padding-bottom: 1px;
|
||||
}
|
||||
.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
|
||||
font-size: 1em;
|
||||
font-weight: bold;
|
||||
line-height: 1.5;
|
||||
padding: 2px 0.4em;
|
||||
margin: 0.5em 0 0 0;
|
||||
height: auto;
|
||||
border: 0;
|
||||
}
|
||||
.ui-selectmenu-open {
|
||||
display: block;
|
||||
}
|
||||
.ui-selectmenu-text {
|
||||
display: block;
|
||||
margin-right: 20px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.ui-selectmenu-button.ui-button {
|
||||
text-align: left;
|
||||
white-space: nowrap;
|
||||
width: 14em;
|
||||
}
|
||||
.ui-selectmenu-icon.ui-icon {
|
||||
float: right;
|
||||
margin-top: 0;
|
||||
}
|
||||
.ui-slider {
|
||||
position: relative;
|
||||
text-align: left;
|
||||
}
|
||||
.ui-slider .ui-slider-handle {
|
||||
position: absolute;
|
||||
z-index: 2;
|
||||
width: 1.2em;
|
||||
height: 1.2em;
|
||||
cursor: pointer;
|
||||
touch-action: none;
|
||||
}
|
||||
.ui-slider .ui-slider-range {
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
font-size: .7em;
|
||||
display: block;
|
||||
border: 0;
|
||||
background-position: 0 0;
|
||||
}
|
||||
|
||||
.ui-slider-horizontal {
|
||||
height: .8em;
|
||||
}
|
||||
.ui-slider-horizontal .ui-slider-handle {
|
||||
top: -.3em;
|
||||
margin-left: -.6em;
|
||||
}
|
||||
.ui-slider-horizontal .ui-slider-range {
|
||||
top: 0;
|
||||
height: 100%;
|
||||
}
|
||||
.ui-slider-horizontal .ui-slider-range-min {
|
||||
left: 0;
|
||||
}
|
||||
.ui-slider-horizontal .ui-slider-range-max {
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.ui-slider-vertical {
|
||||
width: .8em;
|
||||
height: 100px;
|
||||
}
|
||||
.ui-slider-vertical .ui-slider-handle {
|
||||
left: -.3em;
|
||||
margin-left: 0;
|
||||
margin-bottom: -.6em;
|
||||
}
|
||||
.ui-slider-vertical .ui-slider-range {
|
||||
left: 0;
|
||||
width: 100%;
|
||||
}
|
||||
.ui-slider-vertical .ui-slider-range-min {
|
||||
bottom: 0;
|
||||
}
|
||||
.ui-slider-vertical .ui-slider-range-max {
|
||||
top: 0;
|
||||
}
|
||||
.ui-sortable-handle {
|
||||
touch-action: none;
|
||||
}
|
||||
.ui-spinner {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.ui-spinner-input {
|
||||
border: none;
|
||||
background: none;
|
||||
color: inherit;
|
||||
padding: .222em 0;
|
||||
margin: .2em 0;
|
||||
vertical-align: middle;
|
||||
margin-left: .4em;
|
||||
margin-right: 2em;
|
||||
}
|
||||
.ui-spinner-button {
|
||||
width: 1.6em;
|
||||
height: 50%;
|
||||
font-size: .5em;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
text-align: center;
|
||||
position: absolute;
|
||||
cursor: default;
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
right: 0;
|
||||
}
|
||||
/* more specificity required here to override default borders */
|
||||
.ui-spinner a.ui-spinner-button {
|
||||
border-top-style: none;
|
||||
border-bottom-style: none;
|
||||
border-right-style: none;
|
||||
}
|
||||
.ui-spinner-up {
|
||||
top: 0;
|
||||
}
|
||||
.ui-spinner-down {
|
||||
bottom: 0;
|
||||
}
|
||||
.ui-tabs {
|
||||
position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
|
||||
padding: .2em;
|
||||
}
|
||||
.ui-tabs .ui-tabs-nav {
|
||||
margin: 0;
|
||||
padding: .2em .2em 0;
|
||||
}
|
||||
.ui-tabs .ui-tabs-nav li {
|
||||
list-style: none;
|
||||
float: left;
|
||||
position: relative;
|
||||
top: 0;
|
||||
margin: 1px .2em 0 0;
|
||||
border-bottom-width: 0;
|
||||
padding: 0;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
|
||||
float: left;
|
||||
padding: .5em 1em;
|
||||
text-decoration: none;
|
||||
}
|
||||
.ui-tabs .ui-tabs-nav li.ui-tabs-active {
|
||||
margin-bottom: -1px;
|
||||
padding-bottom: 1px;
|
||||
}
|
||||
.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
|
||||
.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
|
||||
.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
|
||||
cursor: text;
|
||||
}
|
||||
.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
|
||||
cursor: pointer;
|
||||
}
|
||||
.ui-tabs .ui-tabs-panel {
|
||||
display: block;
|
||||
border-width: 0;
|
||||
padding: 1em 1.4em;
|
||||
background: none;
|
||||
}
|
||||
.ui-tooltip {
|
||||
padding: 8px;
|
||||
position: absolute;
|
||||
z-index: 9999;
|
||||
max-width: 300px;
|
||||
}
|
||||
body .ui-tooltip {
|
||||
border-width: 2px;
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
+439
@@ -0,0 +1,439 @@
|
||||
/*!
|
||||
* jQuery UI CSS Framework 1.14.2
|
||||
* https://jqueryui.com
|
||||
*
|
||||
* Copyright OpenJS Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* https://jquery.org/license
|
||||
*
|
||||
* https://api.jqueryui.com/category/theming/
|
||||
*
|
||||
* To view and modify this theme, visit https://jqueryui.com/themeroller/?bgColorDefault=%23f6f6f6&borderColorDefault=%23c5c5c5&fcDefault=%23454545&bgColorHover=%23ededed&borderColorHover=%23cccccc&fcHover=%232b2b2b&bgColorActive=%23007fff&borderColorActive=%23003eff&fcActive=%23ffffff&bgColorHeader=%23e9e9e9&borderColorHeader=%23dddddd&fcHeader=%23333333&bgColorContent=%23ffffff&borderColorContent=%23dddddd&fcContent=%23333333&bgColorHighlight=%23fffa90&borderColorHighlight=%23dad55e&fcHighlight=%23777620&bgColorError=%23fddfdf&borderColorError=%23f1a899&fcError=%235f3f3f&bgColorOverlay=%23aaaaaa&opacityOverlay=.3&bgColorShadow=%23666666&opacityShadow=.3&offsetTopShadow=0px&offsetLeftShadow=0px&thicknessShadow=5px&cornerRadiusShadow=8px&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif&fwDefault=normal&cornerRadius=3px&bgTextureDefault=flat&bgTextureHover=flat&bgTextureActive=flat&bgTextureHeader=flat&bgTextureContent=flat&bgTextureHighlight=flat&bgTextureError=flat&bgTextureOverlay=flat&bgTextureShadow=flat&bgImgOpacityDefault=75&bgImgOpacityHover=75&bgImgOpacityActive=65&bgImgOpacityHeader=75&bgImgOpacityContent=75&bgImgOpacityHighlight=55&bgImgOpacityError=95&bgImgOpacityOverlay=0&bgImgOpacityShadow=0&iconColorActive=%23ffffff&iconColorContent=%23444444&iconColorDefault=%23777777&iconColorError=%23cc0000&iconColorHeader=%23444444&iconColorHighlight=%23777620&iconColorHover=%23555555&opacityOverlayPerc=30&opacityShadowPerc=30&bgImgUrlActive=&bgImgUrlContent=&bgImgUrlDefault=&bgImgUrlError=&bgImgUrlHeader=&bgImgUrlHighlight=&bgImgUrlHover=&bgImgUrlOverlay=&bgImgUrlShadow=&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&bgDefaultRepeat=&bgHoverRepeat=&bgActiveRepeat=&bgHeaderRepeat=&bgContentRepeat=&bgHighlightRepeat=&bgErrorRepeat=&bgOverlayRepeat=&bgShadowRepeat=&bgDefaultYPos=&bgHoverYPos=&bgActiveYPos=&bgHeaderYPos=&bgContentYPos=&bgHighlightYPos=&bgErrorYPos=&bgOverlayYPos=&bgShadowYPos=&bgDefaultXPos=&bgHoverXPos=&bgActiveXPos=&bgHeaderXPos=&bgContentXPos=&bgHighlightXPos=&bgErrorXPos=&bgOverlayXPos=&bgShadowXPos=
|
||||
*/
|
||||
|
||||
|
||||
/* Component containers
|
||||
----------------------------------*/
|
||||
.ui-widget {
|
||||
font-family: Arial,Helvetica,sans-serif;
|
||||
font-size: 1em;
|
||||
}
|
||||
.ui-widget .ui-widget {
|
||||
font-size: 1em;
|
||||
}
|
||||
.ui-widget input,
|
||||
.ui-widget select,
|
||||
.ui-widget textarea,
|
||||
.ui-widget button {
|
||||
font-family: Arial,Helvetica,sans-serif;
|
||||
font-size: 1em;
|
||||
}
|
||||
.ui-widget.ui-widget-content {
|
||||
border: 1px solid #c5c5c5;
|
||||
}
|
||||
.ui-widget-content {
|
||||
border: 1px solid #dddddd;
|
||||
background: #ffffff;
|
||||
color: #333333;
|
||||
}
|
||||
.ui-widget-content a {
|
||||
color: #333333;
|
||||
}
|
||||
.ui-widget-header {
|
||||
border: 1px solid #dddddd;
|
||||
background: #e9e9e9;
|
||||
color: #333333;
|
||||
font-weight: bold;
|
||||
}
|
||||
.ui-widget-header a {
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
/* Interaction states
|
||||
----------------------------------*/
|
||||
.ui-state-default,
|
||||
.ui-widget-content .ui-state-default,
|
||||
.ui-widget-header .ui-state-default,
|
||||
.ui-button,
|
||||
|
||||
/* We use html here because we need a greater specificity to make sure disabled
|
||||
works properly when clicked or hovered */
|
||||
html .ui-button.ui-state-disabled:hover,
|
||||
html .ui-button.ui-state-disabled:active {
|
||||
border: 1px solid #c5c5c5;
|
||||
background: #f6f6f6;
|
||||
font-weight: normal;
|
||||
color: #454545;
|
||||
}
|
||||
.ui-state-default a,
|
||||
.ui-state-default a:link,
|
||||
.ui-state-default a:visited,
|
||||
a.ui-button,
|
||||
a:link.ui-button,
|
||||
a:visited.ui-button,
|
||||
.ui-button {
|
||||
color: #454545;
|
||||
text-decoration: none;
|
||||
}
|
||||
.ui-state-hover,
|
||||
.ui-widget-content .ui-state-hover,
|
||||
.ui-widget-header .ui-state-hover,
|
||||
.ui-state-focus,
|
||||
.ui-widget-content .ui-state-focus,
|
||||
.ui-widget-header .ui-state-focus,
|
||||
.ui-button:hover,
|
||||
.ui-button:focus {
|
||||
border: 1px solid #cccccc;
|
||||
background: #ededed;
|
||||
font-weight: normal;
|
||||
color: #2b2b2b;
|
||||
}
|
||||
.ui-state-hover a,
|
||||
.ui-state-hover a:hover,
|
||||
.ui-state-hover a:link,
|
||||
.ui-state-hover a:visited,
|
||||
.ui-state-focus a,
|
||||
.ui-state-focus a:hover,
|
||||
.ui-state-focus a:link,
|
||||
.ui-state-focus a:visited,
|
||||
a.ui-button:hover,
|
||||
a.ui-button:focus {
|
||||
color: #2b2b2b;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.ui-visual-focus {
|
||||
box-shadow: 0 0 3px 1px rgb(94, 158, 214);
|
||||
}
|
||||
.ui-state-active,
|
||||
.ui-widget-content .ui-state-active,
|
||||
.ui-widget-header .ui-state-active,
|
||||
a.ui-button:active,
|
||||
.ui-button:active,
|
||||
.ui-button.ui-state-active:hover {
|
||||
border: 1px solid #003eff;
|
||||
background: #007fff;
|
||||
font-weight: normal;
|
||||
color: #ffffff;
|
||||
}
|
||||
.ui-icon-background,
|
||||
.ui-state-active .ui-icon-background {
|
||||
border: #003eff;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
.ui-state-active a,
|
||||
.ui-state-active a:link,
|
||||
.ui-state-active a:visited {
|
||||
color: #ffffff;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Interaction Cues
|
||||
----------------------------------*/
|
||||
.ui-state-highlight,
|
||||
.ui-widget-content .ui-state-highlight,
|
||||
.ui-widget-header .ui-state-highlight {
|
||||
border: 1px solid #dad55e;
|
||||
background: #fffa90;
|
||||
color: #777620;
|
||||
}
|
||||
.ui-state-checked {
|
||||
border: 1px solid #dad55e;
|
||||
background: #fffa90;
|
||||
}
|
||||
.ui-state-highlight a,
|
||||
.ui-widget-content .ui-state-highlight a,
|
||||
.ui-widget-header .ui-state-highlight a {
|
||||
color: #777620;
|
||||
}
|
||||
.ui-state-error,
|
||||
.ui-widget-content .ui-state-error,
|
||||
.ui-widget-header .ui-state-error {
|
||||
border: 1px solid #f1a899;
|
||||
background: #fddfdf;
|
||||
color: #5f3f3f;
|
||||
}
|
||||
.ui-state-error a,
|
||||
.ui-widget-content .ui-state-error a,
|
||||
.ui-widget-header .ui-state-error a {
|
||||
color: #5f3f3f;
|
||||
}
|
||||
.ui-state-error-text,
|
||||
.ui-widget-content .ui-state-error-text,
|
||||
.ui-widget-header .ui-state-error-text {
|
||||
color: #5f3f3f;
|
||||
}
|
||||
.ui-priority-primary,
|
||||
.ui-widget-content .ui-priority-primary,
|
||||
.ui-widget-header .ui-priority-primary {
|
||||
font-weight: bold;
|
||||
}
|
||||
.ui-priority-secondary,
|
||||
.ui-widget-content .ui-priority-secondary,
|
||||
.ui-widget-header .ui-priority-secondary {
|
||||
opacity: .7;
|
||||
font-weight: normal;
|
||||
}
|
||||
.ui-state-disabled,
|
||||
.ui-widget-content .ui-state-disabled,
|
||||
.ui-widget-header .ui-state-disabled {
|
||||
opacity: .35;
|
||||
background-image: none;
|
||||
}
|
||||
|
||||
/* Icons
|
||||
----------------------------------*/
|
||||
|
||||
/* states and images */
|
||||
.ui-icon {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
.ui-icon,
|
||||
.ui-widget-content .ui-icon {
|
||||
background-image: url("images/ui-icons_444444_256x240.png");
|
||||
}
|
||||
.ui-widget-header .ui-icon {
|
||||
background-image: url("images/ui-icons_444444_256x240.png");
|
||||
}
|
||||
.ui-state-hover .ui-icon,
|
||||
.ui-state-focus .ui-icon,
|
||||
.ui-button:hover .ui-icon,
|
||||
.ui-button:focus .ui-icon {
|
||||
background-image: url("images/ui-icons_555555_256x240.png");
|
||||
}
|
||||
.ui-state-active .ui-icon,
|
||||
.ui-button:active .ui-icon {
|
||||
background-image: url("images/ui-icons_ffffff_256x240.png");
|
||||
}
|
||||
.ui-state-highlight .ui-icon,
|
||||
.ui-button .ui-state-highlight.ui-icon {
|
||||
background-image: url("images/ui-icons_777620_256x240.png");
|
||||
}
|
||||
.ui-state-error .ui-icon,
|
||||
.ui-state-error-text .ui-icon {
|
||||
background-image: url("images/ui-icons_cc0000_256x240.png");
|
||||
}
|
||||
.ui-button .ui-icon {
|
||||
background-image: url("images/ui-icons_777777_256x240.png");
|
||||
}
|
||||
|
||||
/* positioning */
|
||||
/* Three classes needed to override `.ui-button:hover .ui-icon` */
|
||||
.ui-icon-blank.ui-icon-blank.ui-icon-blank {
|
||||
background-image: none;
|
||||
}
|
||||
.ui-icon-caret-1-n { background-position: 0 0; }
|
||||
.ui-icon-caret-1-ne { background-position: -16px 0; }
|
||||
.ui-icon-caret-1-e { background-position: -32px 0; }
|
||||
.ui-icon-caret-1-se { background-position: -48px 0; }
|
||||
.ui-icon-caret-1-s { background-position: -65px 0; }
|
||||
.ui-icon-caret-1-sw { background-position: -80px 0; }
|
||||
.ui-icon-caret-1-w { background-position: -96px 0; }
|
||||
.ui-icon-caret-1-nw { background-position: -112px 0; }
|
||||
.ui-icon-caret-2-n-s { background-position: -128px 0; }
|
||||
.ui-icon-caret-2-e-w { background-position: -144px 0; }
|
||||
.ui-icon-triangle-1-n { background-position: 0 -16px; }
|
||||
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
|
||||
.ui-icon-triangle-1-e { background-position: -32px -16px; }
|
||||
.ui-icon-triangle-1-se { background-position: -48px -16px; }
|
||||
.ui-icon-triangle-1-s { background-position: -65px -16px; }
|
||||
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
|
||||
.ui-icon-triangle-1-w { background-position: -96px -16px; }
|
||||
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
|
||||
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
|
||||
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
|
||||
.ui-icon-arrow-1-n { background-position: 0 -32px; }
|
||||
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
|
||||
.ui-icon-arrow-1-e { background-position: -32px -32px; }
|
||||
.ui-icon-arrow-1-se { background-position: -48px -32px; }
|
||||
.ui-icon-arrow-1-s { background-position: -65px -32px; }
|
||||
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
|
||||
.ui-icon-arrow-1-w { background-position: -96px -32px; }
|
||||
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
|
||||
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
|
||||
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
|
||||
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
|
||||
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
|
||||
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
|
||||
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
|
||||
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
|
||||
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
|
||||
.ui-icon-arrowthick-1-n { background-position: 1px -48px; }
|
||||
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
|
||||
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
|
||||
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
|
||||
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
|
||||
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
|
||||
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
|
||||
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
|
||||
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
|
||||
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
|
||||
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
|
||||
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
|
||||
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
|
||||
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
|
||||
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
|
||||
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
|
||||
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
|
||||
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
|
||||
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
|
||||
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
|
||||
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
|
||||
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
|
||||
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
|
||||
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
|
||||
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
|
||||
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
|
||||
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
|
||||
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
|
||||
.ui-icon-arrow-4 { background-position: 0 -80px; }
|
||||
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
|
||||
.ui-icon-extlink { background-position: -32px -80px; }
|
||||
.ui-icon-newwin { background-position: -48px -80px; }
|
||||
.ui-icon-refresh { background-position: -64px -80px; }
|
||||
.ui-icon-shuffle { background-position: -80px -80px; }
|
||||
.ui-icon-transfer-e-w { background-position: -96px -80px; }
|
||||
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
|
||||
.ui-icon-folder-collapsed { background-position: 0 -96px; }
|
||||
.ui-icon-folder-open { background-position: -16px -96px; }
|
||||
.ui-icon-document { background-position: -32px -96px; }
|
||||
.ui-icon-document-b { background-position: -48px -96px; }
|
||||
.ui-icon-note { background-position: -64px -96px; }
|
||||
.ui-icon-mail-closed { background-position: -80px -96px; }
|
||||
.ui-icon-mail-open { background-position: -96px -96px; }
|
||||
.ui-icon-suitcase { background-position: -112px -96px; }
|
||||
.ui-icon-comment { background-position: -128px -96px; }
|
||||
.ui-icon-person { background-position: -144px -96px; }
|
||||
.ui-icon-print { background-position: -160px -96px; }
|
||||
.ui-icon-trash { background-position: -176px -96px; }
|
||||
.ui-icon-locked { background-position: -192px -96px; }
|
||||
.ui-icon-unlocked { background-position: -208px -96px; }
|
||||
.ui-icon-bookmark { background-position: -224px -96px; }
|
||||
.ui-icon-tag { background-position: -240px -96px; }
|
||||
.ui-icon-home { background-position: 0 -112px; }
|
||||
.ui-icon-flag { background-position: -16px -112px; }
|
||||
.ui-icon-calendar { background-position: -32px -112px; }
|
||||
.ui-icon-cart { background-position: -48px -112px; }
|
||||
.ui-icon-pencil { background-position: -64px -112px; }
|
||||
.ui-icon-clock { background-position: -80px -112px; }
|
||||
.ui-icon-disk { background-position: -96px -112px; }
|
||||
.ui-icon-calculator { background-position: -112px -112px; }
|
||||
.ui-icon-zoomin { background-position: -128px -112px; }
|
||||
.ui-icon-zoomout { background-position: -144px -112px; }
|
||||
.ui-icon-search { background-position: -160px -112px; }
|
||||
.ui-icon-wrench { background-position: -176px -112px; }
|
||||
.ui-icon-gear { background-position: -192px -112px; }
|
||||
.ui-icon-heart { background-position: -208px -112px; }
|
||||
.ui-icon-star { background-position: -224px -112px; }
|
||||
.ui-icon-link { background-position: -240px -112px; }
|
||||
.ui-icon-cancel { background-position: 0 -128px; }
|
||||
.ui-icon-plus { background-position: -16px -128px; }
|
||||
.ui-icon-plusthick { background-position: -32px -128px; }
|
||||
.ui-icon-minus { background-position: -48px -128px; }
|
||||
.ui-icon-minusthick { background-position: -64px -128px; }
|
||||
.ui-icon-close { background-position: -80px -128px; }
|
||||
.ui-icon-closethick { background-position: -96px -128px; }
|
||||
.ui-icon-key { background-position: -112px -128px; }
|
||||
.ui-icon-lightbulb { background-position: -128px -128px; }
|
||||
.ui-icon-scissors { background-position: -144px -128px; }
|
||||
.ui-icon-clipboard { background-position: -160px -128px; }
|
||||
.ui-icon-copy { background-position: -176px -128px; }
|
||||
.ui-icon-contact { background-position: -192px -128px; }
|
||||
.ui-icon-image { background-position: -208px -128px; }
|
||||
.ui-icon-video { background-position: -224px -128px; }
|
||||
.ui-icon-script { background-position: -240px -128px; }
|
||||
.ui-icon-alert { background-position: 0 -144px; }
|
||||
.ui-icon-info { background-position: -16px -144px; }
|
||||
.ui-icon-notice { background-position: -32px -144px; }
|
||||
.ui-icon-help { background-position: -48px -144px; }
|
||||
.ui-icon-check { background-position: -64px -144px; }
|
||||
.ui-icon-bullet { background-position: -80px -144px; }
|
||||
.ui-icon-radio-on { background-position: -96px -144px; }
|
||||
.ui-icon-radio-off { background-position: -112px -144px; }
|
||||
.ui-icon-pin-w { background-position: -128px -144px; }
|
||||
.ui-icon-pin-s { background-position: -144px -144px; }
|
||||
.ui-icon-play { background-position: 0 -160px; }
|
||||
.ui-icon-pause { background-position: -16px -160px; }
|
||||
.ui-icon-seek-next { background-position: -32px -160px; }
|
||||
.ui-icon-seek-prev { background-position: -48px -160px; }
|
||||
.ui-icon-seek-end { background-position: -64px -160px; }
|
||||
.ui-icon-seek-start { background-position: -80px -160px; }
|
||||
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
|
||||
.ui-icon-seek-first { background-position: -80px -160px; }
|
||||
.ui-icon-stop { background-position: -96px -160px; }
|
||||
.ui-icon-eject { background-position: -112px -160px; }
|
||||
.ui-icon-volume-off { background-position: -128px -160px; }
|
||||
.ui-icon-volume-on { background-position: -144px -160px; }
|
||||
.ui-icon-power { background-position: 0 -176px; }
|
||||
.ui-icon-signal-diag { background-position: -16px -176px; }
|
||||
.ui-icon-signal { background-position: -32px -176px; }
|
||||
.ui-icon-battery-0 { background-position: -48px -176px; }
|
||||
.ui-icon-battery-1 { background-position: -64px -176px; }
|
||||
.ui-icon-battery-2 { background-position: -80px -176px; }
|
||||
.ui-icon-battery-3 { background-position: -96px -176px; }
|
||||
.ui-icon-circle-plus { background-position: 0 -192px; }
|
||||
.ui-icon-circle-minus { background-position: -16px -192px; }
|
||||
.ui-icon-circle-close { background-position: -32px -192px; }
|
||||
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
|
||||
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
|
||||
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
|
||||
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
|
||||
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
|
||||
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
|
||||
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
|
||||
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
|
||||
.ui-icon-circle-zoomin { background-position: -176px -192px; }
|
||||
.ui-icon-circle-zoomout { background-position: -192px -192px; }
|
||||
.ui-icon-circle-check { background-position: -208px -192px; }
|
||||
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
|
||||
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
|
||||
.ui-icon-circlesmall-close { background-position: -32px -208px; }
|
||||
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
|
||||
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
|
||||
.ui-icon-squaresmall-close { background-position: -80px -208px; }
|
||||
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
|
||||
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
|
||||
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
|
||||
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
|
||||
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
|
||||
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
|
||||
|
||||
|
||||
/* Misc visuals
|
||||
----------------------------------*/
|
||||
|
||||
/* Corner radius */
|
||||
.ui-corner-all,
|
||||
.ui-corner-top,
|
||||
.ui-corner-left,
|
||||
.ui-corner-tl {
|
||||
border-top-left-radius: 3px;
|
||||
}
|
||||
.ui-corner-all,
|
||||
.ui-corner-top,
|
||||
.ui-corner-right,
|
||||
.ui-corner-tr {
|
||||
border-top-right-radius: 3px;
|
||||
}
|
||||
.ui-corner-all,
|
||||
.ui-corner-bottom,
|
||||
.ui-corner-left,
|
||||
.ui-corner-bl {
|
||||
border-bottom-left-radius: 3px;
|
||||
}
|
||||
.ui-corner-all,
|
||||
.ui-corner-bottom,
|
||||
.ui-corner-right,
|
||||
.ui-corner-br {
|
||||
border-bottom-right-radius: 3px;
|
||||
}
|
||||
|
||||
/* Overlays */
|
||||
.ui-widget-overlay {
|
||||
background: #aaaaaa;
|
||||
opacity: .3;
|
||||
}
|
||||
.ui-widget-shadow {
|
||||
box-shadow: 0px 0px 5px #666666;
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"name": "jquery-ui",
|
||||
"title": "jQuery UI",
|
||||
"description": "A curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library.",
|
||||
"version": "1.14.2",
|
||||
"homepage": "https://jqueryui.com",
|
||||
"author": {
|
||||
"name": "OpenJS Foundation and other contributors",
|
||||
"url": "https://github.com/jquery/jquery-ui/blob/1.14.2/AUTHORS.txt"
|
||||
},
|
||||
"main": "ui/widget.js",
|
||||
"maintainers": [
|
||||
{
|
||||
"name": "Jörn Zaefferer",
|
||||
"email": "joern.zaefferer@gmail.com",
|
||||
"url": "https://bassistance.de"
|
||||
},
|
||||
{
|
||||
"name": "Mike Sherov",
|
||||
"email": "mike.sherov@gmail.com",
|
||||
"url": "https://mike.sherov.com"
|
||||
},
|
||||
{
|
||||
"name": "TJ VanToll",
|
||||
"email": "tj.vantoll@gmail.com",
|
||||
"url": "https://www.tjvantoll.com"
|
||||
},
|
||||
{
|
||||
"name": "Felix Nagel",
|
||||
"email": "info@felixnagel.com",
|
||||
"url": "https://www.felixnagel.com"
|
||||
},
|
||||
{
|
||||
"name": "Alex Schmitz",
|
||||
"email": "arschmitz@gmail.com",
|
||||
"url": "https://github.com/arschmitz"
|
||||
}
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/jquery/jquery-ui.git"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/jquery/jquery-ui/issues"
|
||||
},
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"build": "grunt build",
|
||||
"lint": "grunt lint",
|
||||
"test:server": "jtr serve",
|
||||
"test:unit": "jtr",
|
||||
"test": "grunt && npm run test:unit -- --headless"
|
||||
},
|
||||
"dependencies": {
|
||||
"jquery": ">=1.12.0 <5.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@swc/core": "1.15.2",
|
||||
"commitplease": "3.2.0",
|
||||
"eslint-config-jquery": "3.0.2",
|
||||
"globals": "16.5.0",
|
||||
"grunt": "1.6.1",
|
||||
"grunt-bowercopy": "1.2.5",
|
||||
"grunt-compare-size": "0.4.2",
|
||||
"grunt-contrib-concat": "2.1.0",
|
||||
"grunt-contrib-csslint": "2.0.0",
|
||||
"grunt-contrib-requirejs": "1.0.0",
|
||||
"grunt-eslint": "26.0.0",
|
||||
"grunt-git-authors": "3.2.0",
|
||||
"grunt-html": "18.0.2",
|
||||
"jquery-test-runner": "0.2.8",
|
||||
"load-grunt-tasks": "5.1.0",
|
||||
"rimraf": "6.1.0"
|
||||
},
|
||||
"keywords": []
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
<%@ Page Title="" Language="C#" MasterPageFile="~/admin/Templates/TBS5ADM001/MasterPage.master" AutoEventWireup="true" CodeFile="detail.aspx.cs" Inherits="admin_order_detail" %>
|
||||
|
||||
<asp:Content ID="Content1" ContentPlaceHolderID="page_header" Runat="Server">
|
||||
</asp:Content>
|
||||
<asp:Content ID="Content2" ContentPlaceHolderID="page_nav" Runat="Server">
|
||||
</asp:Content>
|
||||
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
|
||||
</asp:Content>
|
||||
<asp:Content ID="Content4" ContentPlaceHolderID="offCanvasRight" Runat="Server">
|
||||
</asp:Content>
|
||||
<asp:Content ID="Content5" ContentPlaceHolderID="footer_script" Runat="Server">
|
||||
</asp:Content>
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
|
||||
public partial class admin_order_detail : System.Web.UI.Page
|
||||
{
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,861 @@
|
||||
<%@ Page Title="" Language="C#" MasterPageFile="~/admin/Templates/TBS5ADM001/MasterPage.master" AutoEventWireup="true" CodeFile="index3.aspx.cs" Inherits="admin_order_index3" %>
|
||||
<%@ Register Src="~/admin/_uc/alert.ascx" TagPrefix="uc1" TagName="alert" %>
|
||||
<asp:Content ID="Content1" ContentPlaceHolderID="page_header" runat="Server">
|
||||
</asp:Content>
|
||||
<asp:Content ID="Content2" ContentPlaceHolderID="page_nav" runat="Server">
|
||||
|
||||
</asp:Content>
|
||||
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
|
||||
<uc1:alert runat="server" ID="L_msg" Text="" />
|
||||
|
||||
<keep-alive>
|
||||
<component
|
||||
:is="currentView" :form-data="$data">
|
||||
|
||||
</component>
|
||||
</keep-alive>
|
||||
|
||||
|
||||
<div id="print_data">
|
||||
</div>
|
||||
</asp:Content>
|
||||
<asp:Content ID="Content4" ContentPlaceHolderID="offCanvasRight" runat="Server">
|
||||
|
||||
</asp:Content>
|
||||
<asp:Content ID="Content5" ContentPlaceHolderID="footer_script" runat="Server">
|
||||
<script>
|
||||
Vue.filter('timeString', function (value, myFormat) {
|
||||
return value == null || value == "" ? "" : moment(value).format(myFormat || 'YYYY-MM-DD, HH:mm:ss');
|
||||
});
|
||||
|
||||
|
||||
Vue.component('step-one', {
|
||||
|
||||
template: `
|
||||
<div class="container-fluid">
|
||||
<v-data-table
|
||||
v-model="data_table.selected"
|
||||
:items="data_table.list"
|
||||
:search-props="search"
|
||||
item-key="order_no"
|
||||
:options.sync="options"
|
||||
:headers="data_table.header"
|
||||
:footer-props="data_table.footer"
|
||||
:server-items-length="data_table.count"
|
||||
:loading="data_table.loading"
|
||||
:single-select="data_table.singleSelect"
|
||||
show-select
|
||||
hide-default-footer
|
||||
:page.sync="data_table.page"
|
||||
:items-per-page.sync="data_table.pageSize"
|
||||
class="elevation-1">
|
||||
<template #item.up_time="{ item }" >
|
||||
{{ item.up_time|timeString('YYYY/MM/DD') }}
|
||||
</template>
|
||||
<template #item.u_name="{ item }" >
|
||||
<a v-if="item.f_num != null && item.activity_num != null" @click="checkInMsg(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-account-check"></i>報到</a>
|
||||
{{ item.u_name }}
|
||||
</template>
|
||||
<template #item.slot_btn="{ item }">
|
||||
<a @click="$root.currentView='step-two';$root.selected_act=item.num" class="btn btn-outline-secondary btn-sm">明細</a>
|
||||
<a @click="deleteItem(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></i>刪除</a>
|
||||
</template>
|
||||
</v-data-table>
|
||||
<v-container>
|
||||
<v-row class="align-baseline" wrap>
|
||||
<v-col cols="12" md="9">
|
||||
<v-pagination
|
||||
v-model="data_table.page"
|
||||
:length="pageCount">
|
||||
</v-pagination>
|
||||
</v-col>
|
||||
<v-col class="text-truncate text-right" cols="12" md="2">
|
||||
共 {{ data_table.count }} 筆, 頁數:
|
||||
</v-col>
|
||||
<v-col cols="6" md="1">
|
||||
<v-text-field
|
||||
v-model="data_table.page"
|
||||
type="number"
|
||||
hide-details
|
||||
dense
|
||||
min="1"
|
||||
:max="pageCount"
|
||||
@input="data_table.page = parseInt($event, 10)"
|
||||
></v-text-field>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-container>
|
||||
</div>`,
|
||||
props: ['formData'],
|
||||
data() {
|
||||
return {
|
||||
this_act: '<%= Request["act_id"]%>',
|
||||
options: { multiSort: false },
|
||||
search_options: { multiSort: false },
|
||||
|
||||
data_table: {
|
||||
loading: true,
|
||||
list: [],
|
||||
selected: [],
|
||||
singleSelect: false,
|
||||
count: 0,
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
header: [
|
||||
{ text: '活動分類', value: 'kindsTxt' },
|
||||
{ text: '活動名稱', value: 'subject' },
|
||||
{ text: '開始日期', value: 'startDate_solar' },
|
||||
{ text: '結束日期', value: 'endDate_solar', align: 'start' },
|
||||
{ text: '報名人數', value: 'orderCounts' },
|
||||
{ text: '', value: 'slot_btn', sortable: false, align: 'end' }
|
||||
],
|
||||
footer: {
|
||||
showFirstLastPage: true,
|
||||
itemsPerPageOptions: [5, 10, 20, 30],
|
||||
},
|
||||
},
|
||||
//列印管理報表
|
||||
print_conditions: 'yy',
|
||||
print_search: {
|
||||
year: '',
|
||||
month: '',
|
||||
season: '',
|
||||
chk_hasact: false,
|
||||
chk_noact: false,
|
||||
select_act: '',
|
||||
select_actitem: '',
|
||||
|
||||
},
|
||||
select_act_list: [],
|
||||
select_items: {
|
||||
month: [{
|
||||
text: "請選擇",
|
||||
val: 0
|
||||
},],
|
||||
season: [{
|
||||
text: "請選擇",
|
||||
val: 0
|
||||
},],
|
||||
},
|
||||
print_dialog: {
|
||||
show: false,
|
||||
},
|
||||
search_dialog: {
|
||||
controls: {
|
||||
search1: {
|
||||
id: 'search1',
|
||||
title: '國籍',
|
||||
text_prop: 'name_zh',
|
||||
value_prop: 'id',
|
||||
keys: [
|
||||
{ id: 'keyword', title: '關鍵字' },
|
||||
],
|
||||
api_url: HTTP_HOST + 'api/country/GetList',
|
||||
columns: [
|
||||
{ id: 'id', title: '代碼' },
|
||||
{ id: 'name_en', title: '英文短名稱' },
|
||||
{ id: 'name_zh', title: '中文名稱' },
|
||||
],
|
||||
selected: {},
|
||||
select(item, t) {
|
||||
//console.log("select search1", t);
|
||||
t.search.country = item.id;
|
||||
t.search.country2 = '';
|
||||
}
|
||||
},
|
||||
search2: {
|
||||
id: 'search2',
|
||||
title: '報名活動',
|
||||
text_prop: 'subject',
|
||||
value_prop: 'num',
|
||||
keys: [
|
||||
{ id: 'subject', title: '活動名稱', value: '' },
|
||||
{ id: 'kindTxt', title: '活動分類' },
|
||||
],
|
||||
api_url: HTTP_HOST + 'api/activity/GetList',
|
||||
columns: [
|
||||
{ id: 'subject', title: '活動名稱' },
|
||||
{ id: 'kindTxt', title: '活動分類' },
|
||||
],
|
||||
selected: {},
|
||||
select(item, t) {
|
||||
t.print_search.select_act = item.num;
|
||||
}
|
||||
},
|
||||
search3: {
|
||||
id: 'search3',
|
||||
title: '活動品項',
|
||||
text_prop: 'subject',
|
||||
value_prop: 'num',
|
||||
keys: [
|
||||
{ id: 'subject', title: '項目名稱', value: '' },
|
||||
{ id: 'kindTxt', title: '項目分類' },
|
||||
{ id: 'num', visible: false },
|
||||
],
|
||||
api_url: HTTP_HOST + 'api/activity/GetOrderList',
|
||||
columns: [
|
||||
{ id: 'subject', title: '項目名稱' },
|
||||
{ id: 'kindTxt', title: '項目分類' },
|
||||
],
|
||||
selected: {},
|
||||
select(item, t) {
|
||||
t.print_search.select_actitem = item.num;
|
||||
}
|
||||
}
|
||||
|
||||
}, show: false,
|
||||
current: {},
|
||||
list: [],
|
||||
count: 0,
|
||||
page: 1,
|
||||
loading: false,
|
||||
footer: {
|
||||
showFirstLastPage: true,
|
||||
disableItemsPerPage: true,
|
||||
itemsPerPageAllText: '',
|
||||
itemsPerPageText: '',
|
||||
},
|
||||
},
|
||||
search: {
|
||||
keyin1: '',
|
||||
order_no: '',
|
||||
subject: '',
|
||||
u_name: '',
|
||||
up_time1: '',
|
||||
up_time2: '',
|
||||
actItemTxt: '',
|
||||
introducerTxt: '',
|
||||
activity_num: '',
|
||||
country: '',
|
||||
country2: '',
|
||||
hasPrice: '',
|
||||
}
|
||||
//報到
|
||||
, check_dialog: {
|
||||
show: false,
|
||||
},
|
||||
check_data: {
|
||||
f_num: 0,
|
||||
u_name: '',
|
||||
activity_num: 0,
|
||||
activity_name: '',
|
||||
qty: 1,
|
||||
status: {
|
||||
text: '',
|
||||
val: 1
|
||||
},
|
||||
},
|
||||
keyin1_items: [//狀態
|
||||
//{
|
||||
//text: "請選擇",
|
||||
//val: 0
|
||||
//},
|
||||
],
|
||||
};
|
||||
},
|
||||
mounted() {
|
||||
this.detalKeyinArray();
|
||||
this.search_dialog.current = this.search_dialog.controls.search1 ///default
|
||||
if (this.this_act != '')
|
||||
this.search.activity_num = this.this_act;
|
||||
//this.initPrintSearch();
|
||||
//this.initActivity();
|
||||
const navEntries = performance.getEntriesByType("navigation");
|
||||
const isReload = navEntries.length > 0 && navEntries[0].type === "reload";
|
||||
if (isReload) {
|
||||
sessionStorage.removeItem("orderpage");
|
||||
}
|
||||
else {
|
||||
const savedPage = parseInt(sessionStorage.getItem('orderpage'));
|
||||
if (savedPage) {
|
||||
this.options.page = savedPage;
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
options: {
|
||||
handler() {
|
||||
this.getDefault()
|
||||
},
|
||||
deep: true,
|
||||
},
|
||||
search_options: {
|
||||
handler() {
|
||||
this.search_get()
|
||||
},
|
||||
deep: true,
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
search_show(curr) {
|
||||
//console.log("btn_click:", curr, curr.api_url);
|
||||
this.search_dialog.current = curr;
|
||||
this.search_clear()
|
||||
//this.search_get()//清除完自動會重抓, 故取消
|
||||
this.search_dialog.show = true;
|
||||
},
|
||||
search_clear() {
|
||||
if (!this.search_dialog.current.keys) return;
|
||||
this.search_dialog.current.keys.forEach((t, i) => { t.value = '' })
|
||||
this.search_get()
|
||||
},
|
||||
search_get() {
|
||||
if (!this.search_dialog.current.keys) return;
|
||||
let api_url = this.search_dialog.current.api_url;
|
||||
let keys = this.search_dialog.current.keys;
|
||||
//const { page, itemsPerPage } = this.options
|
||||
//const { sortBy, sortDesc, page, itemsPerPage } = this.options
|
||||
this.search_dialog.page = this.search_options.page ?? 1
|
||||
let params = { page: this.search_dialog.page, pageSize: 10 };//url params
|
||||
var search = {};//post body
|
||||
keys.forEach((t, i) => {
|
||||
search[t.id] = t.value;
|
||||
});
|
||||
//necessary parameter===
|
||||
if (this.search_dialog.current.id == 'search2') {
|
||||
params = { sortBy: 'startDate_solar', sortDesc: true, page: this.search_dialog.page, pageSize: 10 };//url params
|
||||
}
|
||||
|
||||
console.log("search_get", api_url, search, params, this.search_options);
|
||||
this.search_dialog.loading = true
|
||||
axios.post(api_url, search, { params: params })
|
||||
.then(response => {
|
||||
this.search_dialog.list = response.data.list
|
||||
this.search_dialog.count = response.data.count
|
||||
this.search_dialog.loading = false
|
||||
})
|
||||
.catch(error => {
|
||||
console.log(error)
|
||||
this.search_dialog.list = []
|
||||
this.search_dialog.count = 0
|
||||
this.search_dialog.loading = false
|
||||
this.snackbar.text = "錯誤:" + error
|
||||
this.snackbar.show = true
|
||||
})
|
||||
},
|
||||
search_headers() {
|
||||
if (!this.search_dialog.current.columns) return;
|
||||
r = [];
|
||||
this.search_dialog.current.columns.forEach((t, i) => {
|
||||
r.push({
|
||||
text: t.title,
|
||||
align: 'start',
|
||||
sortable: false,
|
||||
value: t.id,
|
||||
})
|
||||
})
|
||||
return r
|
||||
},
|
||||
search_select(row) {
|
||||
let curr = this.search_dialog.current;
|
||||
let target = $(`[data-search-control=${curr.id}]`);
|
||||
curr.selected = row;
|
||||
target.children("input.search-text").val(curr.selected[curr.text_prop])//text
|
||||
target.children("input:hidden").val(curr.selected[curr.value_prop])//value
|
||||
if (curr.select instanceof Function) {
|
||||
curr.select(row, this);
|
||||
}
|
||||
this.search_dialog.show = false;
|
||||
//console.log(row, row["u_name"], row["f_number"], curr.id, target);
|
||||
},
|
||||
getDetail(clearpage = false) {
|
||||
console.log("test");
|
||||
const { sortBy, sortDesc, page, itemsPerPage } = this.options
|
||||
const params = {
|
||||
sortBy: sortBy[0], sortDesc: sortDesc[0],
|
||||
page: clearpage ? '1' : page, pageSize: itemsPerPage
|
||||
};
|
||||
this.detail_table.loading = true
|
||||
sessionStorage.setItem('orderpage', clearpage ? '1' : page);
|
||||
axios
|
||||
//.post(HTTP_HOST + 'api/order/GetList', this.search, { params: params })
|
||||
.post(HTTP_HOST + 'api/order/GetList', this.search, { params: params })
|
||||
.then(response => {
|
||||
this.detail_table.list = response.data.list
|
||||
this.detail_table.count = response.data.count;
|
||||
this.detail_table.loading = false
|
||||
})
|
||||
.catch(error => console.log(error))
|
||||
},
|
||||
getDefault(clearpage = false) {
|
||||
const { sortBy, sortDesc, page, itemsPerPage } = this.options
|
||||
const params = {
|
||||
sortBy: sortBy[0], sortDesc: sortDesc[0],
|
||||
page: clearpage ? '1' : page, pageSize: itemsPerPage
|
||||
};
|
||||
this.data_table.loading = true
|
||||
sessionStorage.setItem('orderpage', clearpage ? '1' : page);
|
||||
axios
|
||||
//.post(HTTP_HOST + 'api/order/GetList', this.search, { params: params })
|
||||
.post(HTTP_HOST + 'api/activity/GetList', this.search, { params: params })
|
||||
.then(response => {
|
||||
this.data_table.list = response.data.list
|
||||
this.data_table.count = response.data.count;
|
||||
this.data_table.loading = false
|
||||
})
|
||||
.catch(error => console.log(error))
|
||||
},
|
||||
detalKeyinArray() {
|
||||
var getArray = <%=Newtonsoft.Json.JsonConvert.SerializeObject(_keyin1Item, Newtonsoft.Json.Formatting.Indented) %>;
|
||||
var keys = Object.keys(getArray);
|
||||
for (let i = 0; i < keys.length; i++) {
|
||||
//console.log(`${keys[i]}:${getArray[keys[i]]}`); //value : text
|
||||
var _tmp = {
|
||||
text: getArray[keys[i]],
|
||||
val: parseInt(keys[i]),
|
||||
}
|
||||
this.keyin1_items.push(_tmp);
|
||||
}
|
||||
|
||||
},
|
||||
editItem(item) {
|
||||
console.log("edit", item);
|
||||
},
|
||||
deleteItem(item) {
|
||||
if (confirm('是否確定刪除此筆資料?')) {
|
||||
const index = this.data_table.list.indexOf(item)
|
||||
if (index != -1) {
|
||||
axios
|
||||
.delete(HTTP_HOST + 'api/order/' + item.order_no)
|
||||
.then(response => {
|
||||
console.log("del", item);
|
||||
this.data_table.list.splice(index, 1);
|
||||
this.data_table.count = this.data_table.list.length
|
||||
})
|
||||
.catch(error => console.log(error))
|
||||
}
|
||||
}
|
||||
},
|
||||
deleteAll() {
|
||||
if (confirm('是否確定刪除已勾選的資料?')) {
|
||||
axios
|
||||
.delete(HTTP_HOST + 'api/order/DeleteAll/' + this.data_table.selected.map(x => x.order_no))
|
||||
.then(response => {
|
||||
//console.log("delAll");
|
||||
|
||||
//for (var i = 0; i < this.data_table.selected.length; i++) {
|
||||
// const index = this.data_table.list.indexOf(this.data_table.selected[i]);
|
||||
// this.data_table.list.splice(index, 1);
|
||||
//}
|
||||
//this.data_table.selected = [];
|
||||
//this.data_table.count = this.data_table.list.length
|
||||
location.reload();
|
||||
})
|
||||
.catch(error => console.log(error))
|
||||
}
|
||||
},
|
||||
btn_search() {
|
||||
this.this_act = '';
|
||||
this.search.activity_num = '';
|
||||
|
||||
this.getDefault(true)
|
||||
},
|
||||
btn_all() {
|
||||
this.this_act = '';
|
||||
this.search.activity_num = '';
|
||||
clearObjProps(this.search);
|
||||
this.btn_search()
|
||||
},
|
||||
checkInMsg(item) {
|
||||
this.check_data.f_num = item.f_num;
|
||||
this.check_data.u_name = item.u_name;
|
||||
this.check_data.activity_num = item.activity_num;
|
||||
this.check_data.activity_name = item.subject;
|
||||
this.check_dialog.show = true;
|
||||
},
|
||||
checkIn() {
|
||||
if (this.check_data.qty > 0 && this.check_data.status.val > 0) {
|
||||
var chechdata =
|
||||
{
|
||||
f_num: this.check_data.f_num,
|
||||
activity_num: this.check_data.activity_num,
|
||||
status: this.check_data.status.val,
|
||||
qty: this.check_data.qty,
|
||||
}
|
||||
axios
|
||||
.post(HTTP_HOST + 'api/activity/OrderCheckIn', chechdata)
|
||||
.then(response => {
|
||||
//清空
|
||||
this.check_data.f_num = 0;
|
||||
this.check_data.u_name = '';
|
||||
this.check_data.activity_num = 0;
|
||||
this.check_data.activity_name = '';
|
||||
this.check_data.qty = 1;
|
||||
this.check_data.status.text = '';
|
||||
this.check_data.status.val = 1;
|
||||
|
||||
this.check_dialog.show = false;
|
||||
msgtop('簽到成功')
|
||||
})
|
||||
.catch(
|
||||
error => {
|
||||
console.log(error)
|
||||
msgtop('簽到失敗', 'error')
|
||||
}
|
||||
)
|
||||
} else {
|
||||
msgbox('報到資訊請填寫完整');
|
||||
}
|
||||
}, goPrint() {
|
||||
let _qry = "";
|
||||
Object.keys(this.search).forEach(key => {
|
||||
//console.log(`${key}: ${this.search[key]}`);
|
||||
if (this.search[key] != undefined && this.search[key] != null && this.search[key] != '') {
|
||||
_qry += (_qry != '' ? '&' : '?') + (key + '=' + this.search[key]);
|
||||
}
|
||||
});
|
||||
window.open("print.aspx" + _qry, '_blank');
|
||||
},
|
||||
countryChange() {
|
||||
this.search.country = '';
|
||||
$('#country_txt').val('')
|
||||
},
|
||||
//列印管理報表
|
||||
print_close() {
|
||||
this.print_dialog.show = false;
|
||||
}
|
||||
,
|
||||
initPrintSearch() {
|
||||
//下拉選單
|
||||
for (let i = 1; i <= 12; i++) {
|
||||
var _tmp = {
|
||||
text: i,
|
||||
val: i,
|
||||
}
|
||||
this.select_items.month.push(_tmp);
|
||||
}
|
||||
for (let i = 1; i <= 4; i++) {
|
||||
var _tmp = {
|
||||
text: i,
|
||||
val: i,
|
||||
}
|
||||
this.select_items.season.push(_tmp);
|
||||
}
|
||||
|
||||
//預設值
|
||||
const Today = new Date();//現在日期時間
|
||||
const first_date = new Date(Today.getFullYear(), Today.getMonth(), 1); //本月第一天
|
||||
const last_month_date = new Date(first_date - 1); //上個月最後一天
|
||||
|
||||
this.print_search.year = last_month_date.getFullYear();
|
||||
this.print_search.month = last_month_date.getMonth() + 1 //預設上個月的年份
|
||||
|
||||
let _season = 1;
|
||||
const _month = first_date.getMonth() + 1; //本月
|
||||
if (_month >= 1 && _month <= 3) {
|
||||
_season = 4;
|
||||
} else if (_month >= 4 && _month <= 6) {
|
||||
_season = 1;
|
||||
} else if (_month >= 7 && _month <= 9) {
|
||||
_season = 2;
|
||||
} else if (_month >= 10 && _month <= 12) {
|
||||
_season = 3;
|
||||
}
|
||||
this.print_search.season = _season; //預設上一季
|
||||
|
||||
},
|
||||
goPrint2() {
|
||||
if (this.print_search.year != '') {
|
||||
if (this.print_search.chk_noact || this.print_search.chk_hasact) {
|
||||
let _qry = "";
|
||||
Object.keys(this.print_search).forEach(key => {
|
||||
if (this.print_search[key] != undefined && this.print_search[key] != null && this.print_search[key] != '') {
|
||||
if (key == 'month') {
|
||||
if (this.print_conditions == 'mm') {
|
||||
_qry += "&month=" + this.print_search.month;
|
||||
}
|
||||
} else if (key == 'season') {
|
||||
if (this.print_conditions == 'ss') {
|
||||
_qry += "&season=" + this.print_search.season;
|
||||
}
|
||||
}
|
||||
else {
|
||||
_qry += (_qry != '' ? '&' : '?') + (key + '=' + this.print_search[key]);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
this.print_dialog.show = false;
|
||||
window.open("print.aspx" + _qry, '_blank');
|
||||
} else {
|
||||
msgbox('活動/非活動至少勾選一項');
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
msgbox('請輸入年份');
|
||||
}
|
||||
|
||||
}, chk_hasact_change() {
|
||||
if (!this.print_search.chk_hasact) {
|
||||
//$('#activity_num_txt').val('')
|
||||
//this.print_search.select_act = '';
|
||||
this.clear_select_act();
|
||||
$('#activity_num_txt').attr("placeholder", "可選擇單一活動(需先勾選活動報名)");
|
||||
} else {
|
||||
$('#activity_num_txt').attr("placeholder", "可選擇單一活動");
|
||||
}
|
||||
|
||||
},
|
||||
clear_select_act() {
|
||||
$('#activity_num_txt').val('')
|
||||
this.print_search.select_act = '';
|
||||
}, clear_select_actitem() {
|
||||
$('#actItem_num_txt').val('')
|
||||
this.print_search.select_actitem = '';
|
||||
},
|
||||
initActivity() {
|
||||
axios.get(HTTP_HOST + 'api/activity')
|
||||
.then(response => {
|
||||
this.select_act_list = response.data
|
||||
})
|
||||
.catch(error => {
|
||||
console.log(error)
|
||||
})
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
pageCount() {
|
||||
return Math.ceil(this.data_table.count / this.data_table.pageSize)
|
||||
},
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
Vue.component('step-two', {
|
||||
template: `
|
||||
<div class="container-fluid">
|
||||
<v-data-table
|
||||
v-model="detail_table.selected"
|
||||
:items="detail_table.list"
|
||||
:search-props="search"
|
||||
item-key="order_no"
|
||||
:options.sync="options"
|
||||
:headers="detail_table.header"
|
||||
:footer-props="detail_table.footer"
|
||||
:server-items-length="detail_table.count"
|
||||
:loading="detail_table.loading"
|
||||
:single-select="detail_table.singleSelect"
|
||||
show-select
|
||||
hide-default-footer
|
||||
:page.sync="detail_table.page"
|
||||
:items-per-page.sync="detail_table.pageSize"
|
||||
class="elevation-1">
|
||||
<template #item.slot_btn="{ item }">
|
||||
<a :href="'reg.aspx?order_no='+item.order_no" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-pencil-box-outline"></i>修改</a>
|
||||
<a @click="$root.currentView='step-three';$root.selected_order=item.order_no" class="btn btn-outline-secondary btn-sm">明細</a>
|
||||
<a @click="deleteItem(item)" class="btn btn-outline-secondary btn-sm"><i class="mdi mdi-trash-can"></i>刪除</a>
|
||||
</template>
|
||||
</v-data-table>
|
||||
<v-container>
|
||||
<v-row class="align-baseline" wrap>
|
||||
<v-col cols="12" md="9">
|
||||
<v-pagination
|
||||
v-model="detail_table.page"
|
||||
:length="pageCount">
|
||||
</v-pagination>
|
||||
</v-col>
|
||||
<v-col class="text-truncate text-right" cols="12" md="2">
|
||||
共 {{ detail_table.count }} 筆, 頁數:
|
||||
</v-col>
|
||||
<v-col cols="6" md="1">
|
||||
<v-text-field
|
||||
v-model="detail_table.page"
|
||||
type="number"
|
||||
hide-details
|
||||
dense
|
||||
min="1"
|
||||
:max="pageCount"
|
||||
@input="detail_table.page = parseInt($event, 10)"
|
||||
></v-text-field>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-container>
|
||||
</div>`,
|
||||
|
||||
props: ['twoData'],
|
||||
activated() {
|
||||
console.log("yes ,go go");
|
||||
this.getDetail();
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
options: { multiSort: false },
|
||||
search_options: { multiSort: false },
|
||||
detail_table: {
|
||||
loading: true,
|
||||
list: [],
|
||||
selected: [],
|
||||
singleSelect: false,
|
||||
count: 0,
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
header: [
|
||||
{ text: '單號', value: 'order_no' },
|
||||
{ text: '姓名', value: 'u_name' },
|
||||
{ text: '報名日期', value: 'up_time' },
|
||||
{ text: '單據狀態', value: 'keyin1_txt', align: 'start' },
|
||||
{ text: '', value: 'slot_btn', sortable: false, align: 'end' }
|
||||
],
|
||||
footer: {
|
||||
showFirstLastPage: true,
|
||||
itemsPerPageOptions: [5, 10, 20, 30],
|
||||
},
|
||||
},
|
||||
search: {
|
||||
keyin1: '',
|
||||
order_no: '',
|
||||
subject: '',
|
||||
u_name: '',
|
||||
up_time1: '',
|
||||
up_time2: '',
|
||||
actItemTxt: '',
|
||||
introducerTxt: '',
|
||||
activity_num: '',
|
||||
country: '',
|
||||
country2: '',
|
||||
hasPrice: '',
|
||||
}
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
options: {
|
||||
handler() {
|
||||
this.getDetail()
|
||||
},
|
||||
deep: true,
|
||||
},
|
||||
|
||||
},
|
||||
methods: {
|
||||
getDetail() {
|
||||
const { sortBy, sortDesc, page, itemsPerPage } = this.options
|
||||
const params = {
|
||||
//sortBy: sortBy == undefined ? "order_no" : sortBy[0],
|
||||
//sortDesc: sortDesc == undefined ? "" : sortDesc[0],
|
||||
//page: clearpage ? '1' : page, pageSize: itemsPerPage,
|
||||
page:'1',pageSize:10,
|
||||
|
||||
};
|
||||
this.search = { activity_num: this.$root.selected_act }
|
||||
this.detail_table.loading = true
|
||||
sessionStorage.setItem('orderpage','1');// clearpage ? '1' : page
|
||||
axios
|
||||
.post(HTTP_HOST + 'api/order/GetList', this.search, { params: params })
|
||||
.then(response => {
|
||||
this.detail_table.list = response.data.list
|
||||
this.detail_table.count = response.data.count;
|
||||
this.detail_table.loading = false
|
||||
})
|
||||
.catch(error => console.log(error))
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
pageCount() {
|
||||
return Math.ceil(this.detail_table.count / this.detail_table.pageSize)
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Vue.component('step-three', {
|
||||
template: `<div>放報名資料</div>`,
|
||||
props:['signData']
|
||||
});
|
||||
let VueApp = new Vue({
|
||||
el: '#app',
|
||||
vuetify: new Vuetify(),
|
||||
data() {
|
||||
return {
|
||||
currentView: 'step-one',
|
||||
selected_act: '',
|
||||
selected_order:'',
|
||||
};
|
||||
},activated() {
|
||||
console.log("yes ,go go");
|
||||
this.getDetail();
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
options: { multiSort: false },
|
||||
search_options: { multiSort: false },
|
||||
sign_table: {
|
||||
loading: true,
|
||||
list: [],
|
||||
selected: [],
|
||||
singleSelect: false,
|
||||
count: 0,
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
header: [
|
||||
{ text: '單號', value: 'order_no' },
|
||||
{ text: '姓名', value: 'u_name' },
|
||||
{ text: '報名日期', value: 'up_time' },
|
||||
{ text: '單據狀態', value: 'keyin1_txt', align: 'start' },
|
||||
{ text: '', value: 'slot_btn', sortable: false, align: 'end' }
|
||||
],
|
||||
footer: {
|
||||
showFirstLastPage: true,
|
||||
itemsPerPageOptions: [5, 10, 20, 30],
|
||||
},
|
||||
},
|
||||
search: {
|
||||
keyin1: '',
|
||||
order_no: '',
|
||||
subject: '',
|
||||
u_name: '',
|
||||
up_time1: '',
|
||||
up_time2: '',
|
||||
actItemTxt: '',
|
||||
introducerTxt: '',
|
||||
activity_num: '',
|
||||
country: '',
|
||||
country2: '',
|
||||
hasPrice: '',
|
||||
}
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
options: {
|
||||
handler() {
|
||||
this.getDetail()
|
||||
},
|
||||
deep: true,
|
||||
},
|
||||
|
||||
},
|
||||
methods: {
|
||||
getDetail() {
|
||||
const { sortBy, sortDesc, page, itemsPerPage } = this.options
|
||||
const params = {
|
||||
//sortBy: sortBy == undefined ? "order_no" : sortBy[0],
|
||||
//sortDesc: sortDesc == undefined ? "" : sortDesc[0],
|
||||
//page: clearpage ? '1' : page, pageSize: itemsPerPage,
|
||||
page: '1', pageSize: 10,
|
||||
|
||||
};
|
||||
this.search = { activity_num: this.$root.selected_act }
|
||||
this.detail_table.loading = true
|
||||
sessionStorage.setItem('orderpage', '1');// clearpage ? '1' : page
|
||||
axios
|
||||
.post(HTTP_HOST + 'api/order/GetList', this.search, { params: params })
|
||||
.then(response => {
|
||||
this.detail_table.list = response.data.list
|
||||
this.detail_table.count = response.data.count;
|
||||
this.detail_table.loading = false
|
||||
})
|
||||
.catch(error => console.log(error))
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
pageCount() {
|
||||
return Math.ceil(this.detail_table.count / this.detail_table.pageSize)
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
</asp:Content>
|
||||
|
||||
@@ -0,0 +1,284 @@
|
||||
using DocumentFormat.OpenXml;
|
||||
using DocumentFormat.OpenXml.Packaging;
|
||||
using DocumentFormat.OpenXml.Spreadsheet;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using static Model.activity_check;
|
||||
|
||||
public partial class admin_order_index3 : MyWeb.config
|
||||
{
|
||||
private Model.ezEntities _db = new Model.ezEntities();
|
||||
public Dictionary<int, string> _keyin1Item = null;
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
if (!IsPostBack)
|
||||
{
|
||||
|
||||
Model.pro_order order = new Model.pro_order();
|
||||
ArrayList options = order.keyin1_list();
|
||||
foreach (Model.pro_order.keyin optionKey in options)
|
||||
{
|
||||
ListItem item = new ListItem(optionKey.Text, optionKey.Value);
|
||||
item.Attributes.Add("style", "color:" + optionKey.Color);
|
||||
//s_keyin1.Items.Add(item);
|
||||
}
|
||||
|
||||
_keyin1Item = publicFun.enum_desc<Model.activity_check.keyin1>(); //狀態
|
||||
BuildKind();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public void detailButton_click(object sender, EventArgs e)
|
||||
{
|
||||
}
|
||||
public void BuildKind()
|
||||
{
|
||||
//國籍
|
||||
//s_country.Items.Clear();
|
||||
//s_country.Items.Add(new ListItem("請選擇", ""));
|
||||
var qry = _db.countries.OrderBy(x => x.range).ThenBy(x => x.name_en).ToList();
|
||||
if (qry.Count > 0)
|
||||
{
|
||||
//foreach (var x in qry)
|
||||
//s_country.Items.Add(new ListItem(x.name_zh, x.ID));
|
||||
}
|
||||
|
||||
}
|
||||
protected void excel_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
||||
//var memoryStream = new MemoryStream();
|
||||
//using (var doc = SpreadsheetDocument.Create(memoryStream, SpreadsheetDocumentType.Workbook))
|
||||
//{
|
||||
// var wb = doc.AddWorkbookPart();
|
||||
// wb.Workbook = new Workbook();
|
||||
// var sheets = wb.Workbook.AppendChild(new Sheets());
|
||||
|
||||
// //建立第一個頁籤
|
||||
// var ws = wb.AddNewPart<WorksheetPart>();
|
||||
// ws.Worksheet = new Worksheet();
|
||||
// sheets.Append(new Sheet()
|
||||
// {
|
||||
// Id = wb.GetIdOfPart(ws),
|
||||
// SheetId = 1,
|
||||
// Name = "報名"
|
||||
// });
|
||||
|
||||
// //設定欄寬
|
||||
// var cu = new Columns();
|
||||
// cu.Append(
|
||||
// new Column { Min = 1, Max = 1, Width = 15, CustomWidth = true },
|
||||
// new Column { Min = 2, Max = 4, Width = 10, CustomWidth = true },
|
||||
// new Column { Min = 5, Max = 5, Width = 15, CustomWidth = true },
|
||||
// new Column { Min = 6, Max = 8, Width = 25, CustomWidth = true },
|
||||
// new Column { Min = 9, Max = 9, Width = 15, CustomWidth = true },
|
||||
// new Column { Min = 10, Max = 10, Width = 10, CustomWidth = true },
|
||||
// new Column { Min = 11, Max = 11, Width = 25, CustomWidth = true },
|
||||
// new Column { Min = 12, Max = 16, Width = 10, CustomWidth = true },
|
||||
// new Column { Min = 17, Max = 20, Width = 10, CustomWidth = true }
|
||||
// );
|
||||
// ws.Worksheet.Append(cu);
|
||||
|
||||
// //建立資料頁
|
||||
// var sd = new SheetData();
|
||||
// ws.Worksheet.AppendChild(sd);
|
||||
|
||||
// //第一列資料
|
||||
// var tr = new Row();
|
||||
// tr.Append(
|
||||
// new Cell() { CellValue = new CellValue("單號"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("報名日期"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("單據狀態"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("姓名/名稱"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("聯絡電話"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("報名活動"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("收件地址"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("備註"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("項目名稱"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("姓名"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("代表地址"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("陽上/報恩者"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("開始日期"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("期滿日期"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("應續約日"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("劃位狀態"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("預設金額"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("數量"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("小計"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("已收金額"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("未收金額"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("付款期限"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("報名狀態"), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("狀態備註"), DataType = CellValues.String }
|
||||
// );
|
||||
// sd.AppendChild(tr);
|
||||
|
||||
// //查詢要匯出的資料
|
||||
// // ❌ 錯誤寫法: var aIDt = _db.actItems.Where(f => f.subject.Contains(s_actItemTxt.Value.Trim())).Select(f => f.num.ToString());
|
||||
// // 改為整數陣列,避免後續查詢中使用 .ToString()
|
||||
// var aIDt = _db.actItems.Where(f => f.subject.Contains(s_actItemTxt.Value.Trim())).Select(f => f.num).ToArray();//品項
|
||||
// var qry = _db.pro_order.AsQueryable();
|
||||
|
||||
// if (!isStrNull(s_order_no.Value))
|
||||
// qry = qry.Where(o => o.order_no.Contains(s_order_no.Value.Trim()));
|
||||
// if (!isStrNull(s_u_name.Value))
|
||||
// qry = qry.Where(o => o.f_num.HasValue && o.follower.u_name.Contains(s_u_name.Value.Trim()));
|
||||
// if (!isStrNull(s_introducerTxt.Value))
|
||||
// qry = qry.Where(o => o.f_num.HasValue && o.follower1.u_name.Contains(s_introducerTxt.Value.Trim()));
|
||||
// if (!isStrNull(s_subject.Value))
|
||||
// qry = qry.Where(o => o.activity_num.HasValue && o.activity.subject.Contains(s_subject.Value.Trim()));
|
||||
// if (!isStrNull(s_actItemTxt.Value))
|
||||
// {
|
||||
// // ❌ 錯誤寫法: qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.order_no == o.order_no && aIDt.ToArray().Contains(f2.actItem_num.ToString())).Count() > 0);
|
||||
// // ✅ 實際比較:僅在 actItem_num 有值時才與整數陣列比對
|
||||
// qry = qry.Where(o => o.pro_order_detail.Any(f2 =>
|
||||
// f2.order_no == o.order_no &&
|
||||
// f2.actItem_num.HasValue &&
|
||||
// aIDt.Contains(f2.actItem_num.Value)));
|
||||
// }
|
||||
// if (!isStrNull(s_keyin1.SelectedValue))
|
||||
// qry = qry.Where(o => o.keyin1 == s_keyin1.SelectedValue);
|
||||
|
||||
// if (!isStrNull(s_up_time1.Value) && isDate(s_up_time1.Value))
|
||||
// qry = qry.Where(o => o.up_time >= ValDate(s_up_time1.Value));
|
||||
// if (!isStrNull(s_up_time2.Value) && isDate(s_up_time2.Value))
|
||||
// qry = qry.Where(o => o.up_time < Convert.ToDateTime(s_up_time2.Value).AddDays(1));
|
||||
|
||||
// qry = qry.OrderByDescending(o => o.reg_time);
|
||||
|
||||
// MyWeb.encrypt encrypt = new MyWeb.encrypt();
|
||||
// var tdesc = publicFun.enum_desc<Model.pro_order.detailKeyin1>();
|
||||
|
||||
// var bedDt = _db.bed_order_detail.AsQueryable();//掛單明細
|
||||
|
||||
|
||||
// //left join 使用 GroupJoin
|
||||
// //var list = qry.Join
|
||||
// var list = qry.GroupJoin(
|
||||
// _db.pro_order_detail, o => o.order_no, p => p.order_no, (o, c) =>
|
||||
// new
|
||||
// {
|
||||
// //訂單資料
|
||||
// order_no = o.order_no,
|
||||
// up_time = o.up_time,
|
||||
// keyin1 = o.keyin1,
|
||||
// f_num = o.follower != null ? o.follower.u_name : "", //姓名/名稱
|
||||
// phone = o.phone,
|
||||
// activity_num = o.activity_num.HasValue ? o.activity.subject : "",
|
||||
// address = o.address,
|
||||
// demo = o.demo,
|
||||
// c
|
||||
// }).SelectMany(o => o.c.DefaultIfEmpty(), (o, d) => //SelectMany 展開
|
||||
// new
|
||||
// {
|
||||
// //訂單資料
|
||||
// order_no = o.order_no,
|
||||
// up_time = o.up_time,
|
||||
// keyin1 = o.keyin1,
|
||||
// f_num = o.f_num, //姓名/名稱
|
||||
// phone = o.phone,
|
||||
// activity_num = o.activity_num,
|
||||
// address = o.address,
|
||||
// demo = o.demo,
|
||||
|
||||
// //訂單明細
|
||||
// //使用DefaultIfEmpty 因匿名型別無法輸出NULL(無法轉換成強型別),需特別注意Null的處理
|
||||
// d_actItem_num = d == null ? "" : (d.actItem_num.HasValue ? d.actItem.subject : ""), //項目名稱
|
||||
// d_category = d == null ? "" : (d.actItem_num.HasValue ? d.actItem.category.ToString() : ""),
|
||||
// d_f_num = d == null ? "" : (d.f_num.HasValue ? d.follower.u_name : ""), //姓名
|
||||
// d_address = d == null ? "" : d.address,
|
||||
// d_from_id = d == null ? "" : (d.from_id.HasValue ? d.follower1.u_name : ""), //陽上/報恩者
|
||||
// d_start_date = d == null ? "" : (d.start_date.HasValue ? d.start_date.Value.ToString("yyyy/MM/dd") : ""), //開始日期
|
||||
// d_due_date = d == null ? "" : (d.due_date.HasValue ? d.due_date.Value.ToString("yyyy/MM/dd") : ""), //期滿日期
|
||||
// d_extend_date = d == null ? "" : (d.extend_date.HasValue ? d.extend_date.Value.ToString("yyyy/MM/dd") : ""), //應續約日
|
||||
// d_price = d == null ? "" : (d.price.HasValue ? d.price.Value.ToString() : "0"), //預設金額
|
||||
// d_qty = d == null ? "" : (d.qty.HasValue ? d.qty.Value.ToString() : "0"), //數量
|
||||
// d_writeBedQty = d == null ? 0 : bedDt.Where(b => (b.bed_order.o_detail_id.Value == d.num) && b.checkIn_date.HasValue && b.bed_kind_detail_id.HasValue).Count(), //已劃數量
|
||||
// d_notBedQty = d == null ? 0 : bedDt.Where(b => b.bed_order.o_detail_id.Value == d.num && (!b.checkIn_date.HasValue || !b.bed_kind_detail_id.HasValue)).Count(), //未劃數量
|
||||
// d_pay = d == null ? "" : (d.pay.HasValue ? d.pay.Value.ToString() : "0"), //已收金額
|
||||
// d_pay_date = d == null ? "" : (d.pay_date.HasValue ? d.pay_date.Value.ToString("yyyy/MM/dd") : ""), //付款期限
|
||||
// d_keyin1 = d == null ? "" : (d.keyin1.HasValue && d.keyin1.Value > 0 ? tdesc[d.keyin1 ?? 1] : ""), //報名狀態
|
||||
// d_demo = d == null ? "" : d.demo, //狀態備註
|
||||
// }).ToList();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// if (list.Count > 0)
|
||||
// {
|
||||
// foreach (var item in list)
|
||||
// {
|
||||
// //新增資料列
|
||||
// tr = new Row();
|
||||
// tr.Append(
|
||||
// new Cell() { CellValue = new CellValue(item.order_no), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue(item.up_time.Value.ToString("yyyy/MM/dd")), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue(Model.pro_order.keyin1_value_to_text(item.keyin1)), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue(item.f_num), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue(encrypt.DecryptAutoKey(item.phone)), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue(item.activity_num), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue(item.address), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue(item.demo), DataType = CellValues.String },
|
||||
|
||||
// new Cell() { CellValue = new CellValue(item.d_actItem_num), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue(item.d_f_num), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue(item.d_address), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue(item.d_from_id), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue(item.d_start_date), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue(item.d_due_date), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue(item.d_extend_date), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue((Val(item.d_category) == (int)Model.activity.category.Order) ? (item.d_notBedQty + "/" + item.d_writeBedQty) : ""), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("$" + ValMoney(item.d_price)), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue(item.d_qty), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("$" + ValMoney(ValFloat(item.d_price) * Val(item.d_qty))), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("$" + ValMoney(item.d_pay)), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue("$" + ValMoney(ValFloat(item.d_price) * Val(item.d_qty) - ValFloat(item.d_pay))), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue(item.d_pay_date), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue(item.d_keyin1), DataType = CellValues.String },
|
||||
// new Cell() { CellValue = new CellValue(item.d_demo), DataType = CellValues.String }
|
||||
// );
|
||||
// sd.AppendChild(tr);
|
||||
// }
|
||||
|
||||
|
||||
// Model.admin_log admin_log = new Model.admin_log();
|
||||
// admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Order, (int)Model.admin_log.Status.Excel, admin_log.LogViewBtn(list.Select(x => x.order_no).ToList()));
|
||||
|
||||
|
||||
// }
|
||||
|
||||
//}
|
||||
|
||||
//HttpContext.Current.Response.Clear();
|
||||
//HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=報名.xlsx");
|
||||
//HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
|
||||
//HttpContext.Current.Response.BinaryWrite(memoryStream.ToArray());
|
||||
//HttpContext.Current.Response.End();
|
||||
|
||||
|
||||
}
|
||||
|
||||
private string GetCellReference(int column, int row)
|
||||
{
|
||||
int dividend = column;
|
||||
string cellReference = string.Empty;
|
||||
|
||||
while (dividend > 0)
|
||||
{
|
||||
int modulo = (dividend - 1) % 26;
|
||||
char columnChar = (char)('A' + modulo);
|
||||
cellReference = columnChar + cellReference;
|
||||
dividend = (dividend - modulo) / 26;
|
||||
}
|
||||
|
||||
return cellReference + row.ToString();
|
||||
}
|
||||
}
|
||||
+147
-3
@@ -11,9 +11,9 @@
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
</style>
|
||||
|
||||
</asp:Content>
|
||||
<asp:Content ID="Content4" ContentPlaceHolderID="footer_script" runat="Server">
|
||||
|
||||
<script>
|
||||
Vue.filter('timeString', function (value, myFormat) {
|
||||
return value == null || value == "" ? "" : moment(value).format(myFormat || 'YYYY-MM-DD, HH:mm:ss');
|
||||
@@ -464,6 +464,11 @@
|
||||
initialized: false,
|
||||
currentItem: {}
|
||||
},
|
||||
tablet_edit_new: {
|
||||
show: false,
|
||||
initialized: false,
|
||||
currentItem: {}
|
||||
},
|
||||
//收款註記
|
||||
cash_dialog: {
|
||||
show: false,
|
||||
@@ -538,7 +543,8 @@
|
||||
//currentItem.f_num_tablet = JSON.stringify(receivedData.tablet_data);
|
||||
this.editedItem = {
|
||||
...currentItem,
|
||||
f_num_tablet: JSON.stringify(receivedData.tablet_data)
|
||||
f_num_tablet: JSON.stringify(receivedData.tablet_data),
|
||||
style: receivedData.style
|
||||
};
|
||||
// 呼叫 save 方法
|
||||
await this.save();
|
||||
@@ -546,10 +552,38 @@
|
||||
|
||||
// 關閉編輯對話框
|
||||
this.tablet_edit.show = false;
|
||||
this.tablet_edit_new.show = false;
|
||||
|
||||
// 顯示成功訊息
|
||||
this.snackbar.text = '牌位資料已更新';
|
||||
this.snackbar.show = true;
|
||||
} else if (event.data.source === 'editorNew.btn.click') {
|
||||
|
||||
const receivedData = event.data.data;
|
||||
|
||||
// 更新編輯中的項目
|
||||
//if (receivedData.tabletItem && this.editedIndex > -1) {
|
||||
if (receivedData.tabletItem) {
|
||||
// 將 tablet_data 轉換為 JSON 字串
|
||||
//this.editedItem.f_num_tablet = JSON.stringify(receivedData.tablet_data);
|
||||
|
||||
// 確保其他必要欄位保持不變
|
||||
const currentItem = this.desserts[this.editedIndex];
|
||||
//currentItem.f_num_tablet = JSON.stringify(receivedData.tablet_data);
|
||||
this.editedItem = {
|
||||
...currentItem,
|
||||
f_num_tablet: JSON.stringify(receivedData.tablet_data),
|
||||
style: receivedData.style
|
||||
};
|
||||
// 呼叫 save 方法
|
||||
await this.save();
|
||||
}
|
||||
this.tablet_edit_new.show = false;
|
||||
|
||||
// 顯示成功訊息
|
||||
this.snackbar.text = '牌位資料已更新';
|
||||
this.snackbar.show = true;
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
@@ -560,6 +594,13 @@
|
||||
this.tablet_edit.initialized = true;
|
||||
};
|
||||
}
|
||||
|
||||
const iframe1 = document.querySelector('iframe#tablet_edit_new_iframe');
|
||||
if (iframe1) {
|
||||
iframe1.onload = () => {
|
||||
this.tablet_edit_new.initialized = true;
|
||||
};
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
options: {
|
||||
@@ -571,6 +612,17 @@
|
||||
'tablet_edit.show': {
|
||||
handler(newVal) {
|
||||
if (!newVal && this._savedEditedItem) {
|
||||
// console.log("三小");
|
||||
this.editedItem = $.extend(true, {}, this._savedEditedItem);
|
||||
this._savedEditedItem = null;
|
||||
}
|
||||
}
|
||||
},
|
||||
'tablet_edit_new.show': {
|
||||
handler(newVal) {
|
||||
if (!newVal && this._savedEditedItem) {
|
||||
//console.log("不合理");
|
||||
//$("#tablet_edit_new_iframe").src = $("#tablet_edit_new_iframe").src;
|
||||
this.editedItem = $.extend(true, {}, this._savedEditedItem);
|
||||
this._savedEditedItem = null;
|
||||
}
|
||||
@@ -819,6 +871,34 @@
|
||||
this.editedItem = $.extend(true, {}, item);
|
||||
this.file_dialog.show = true;
|
||||
},
|
||||
async editTabletNew(item) {
|
||||
this.editedIndex = this.desserts.indexOf(item);
|
||||
this.editedItem = $.extend(true, {}, item);
|
||||
|
||||
try {
|
||||
//document.getElementById("tablet_edit_new_iframe").contentWindow.location.reload();
|
||||
// 如果是新項目,先保存
|
||||
if (this.editedItem.num <= 0 || this.editedItem.num === null || this.editedItem.num === undefined) {
|
||||
this.editedItem.qty = 1;
|
||||
const savedItem = await this.save(false);
|
||||
if (savedItem) {
|
||||
this.$set(this.desserts, this.editedIndex, savedItem);
|
||||
this.editedItem = $.extend(true, {}, savedItem);
|
||||
}
|
||||
}
|
||||
// 先發送消息
|
||||
await this.sendMessageToIframeNew();
|
||||
// 保存當前的 editedItem 數據
|
||||
const currentData = $.extend(true, {}, this.editedItem);
|
||||
// 顯示對話框
|
||||
|
||||
this.tablet_edit_new.show = true;
|
||||
// 立即恢復數據
|
||||
this.editedItem = $.extend(true, {}, currentData);
|
||||
} catch (error) {
|
||||
console.error('Error in editTablet:', error);
|
||||
}
|
||||
},
|
||||
async editTablet(item) {
|
||||
this.editedIndex = this.desserts.indexOf(item);
|
||||
this.editedItem = $.extend(true, {}, item);
|
||||
@@ -845,6 +925,54 @@
|
||||
console.error('Error in editTablet:', error);
|
||||
}
|
||||
},
|
||||
async sendMessageToIframeNew() {
|
||||
const iframe = document.querySelector('iframe#tablet_edit_new_iframe');
|
||||
|
||||
// 在這裡深度複製 editedItem,確保數據不會被修改
|
||||
const itemToSend = $.extend(true, {}, this.editedItem);
|
||||
|
||||
if (iframe) {
|
||||
try {
|
||||
// 準備要發送的數據
|
||||
let familyMembers = [];
|
||||
|
||||
try {
|
||||
// 嘗試獲取家族成員數據
|
||||
const response = await axios.get(HTTP_HOST + 'api/familymembers/follower/' + this.follower_id);
|
||||
familyMembers = response.data;
|
||||
} catch (error) {
|
||||
console.warn('error:', error);
|
||||
}
|
||||
|
||||
// 準備發送的數據
|
||||
const itemInfo = {
|
||||
source: 'order.btn.click',
|
||||
tabletItem: {
|
||||
...itemToSend,
|
||||
title: this.titleword() // 確保標題被包含
|
||||
},
|
||||
familyMembers: familyMembers,
|
||||
host: HTTP_HOST,
|
||||
follower_id:this.follower_id
|
||||
};
|
||||
|
||||
iframe.contentWindow.postMessage(itemInfo, '*');
|
||||
|
||||
// 發送後確認數據完整性
|
||||
|
||||
// 如果數據被清除,立即恢復
|
||||
if (!this.editedItem.num && itemToSend.num) {
|
||||
this.$nextTick(() => {
|
||||
this.editedItem = $.extend(true, {}, itemToSend);
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error in sendMessageToIframe:', error);
|
||||
}
|
||||
} else {
|
||||
console.error('iframe not found');
|
||||
}
|
||||
},
|
||||
async sendMessageToIframe() {
|
||||
const iframe = document.querySelector('iframe#tablet_edit_iframe');
|
||||
|
||||
@@ -965,6 +1093,7 @@
|
||||
async save(shouldClose = true) {
|
||||
if (this.editedIndex > -1) {
|
||||
if (this.order_no != '') {
|
||||
console.log("ok:",this.editedItem);
|
||||
//chcck necessary params
|
||||
if (this.editedItem.actitem_num_selected.val != 0 &&
|
||||
this.editedItem.keyin1_selected.val !=0 &&
|
||||
@@ -1004,6 +1133,7 @@
|
||||
pay: this.editedItem.pay,
|
||||
pay_date: this.editedItem.pay_date,
|
||||
customize_data: this.editedItem.customize_data,
|
||||
style: this.editedItem.style
|
||||
}
|
||||
await axios
|
||||
.post(HTTP_HOST + 'api/order/SaveDetailData', pro_order_detail)
|
||||
@@ -2002,6 +2132,9 @@
|
||||
<v-icon title="編輯牌位" color="blue" class="mr-2" @click="editTablet(item);">
|
||||
mdi-file-document-edit-outline
|
||||
</v-icon>
|
||||
<v-icon title="編輯牌位New" color="blue" class="mr-2" @click="editTabletNew(item);">
|
||||
mdi-file-document-edit-outline
|
||||
</v-icon>
|
||||
<v-icon title="列印" color="blue" class="mr-2" @click="printItem(item);" v-if="canPrint || lists.length==0" >
|
||||
mdi-printer
|
||||
</v-icon>
|
||||
@@ -2569,6 +2702,17 @@
|
||||
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
<v-dialog v-model="tablet_edit_new.show" min-width="100vw" min-height="100vh" persistent eager :class="{'d-none': !tablet_edit_new.initialized}">
|
||||
<v-card>
|
||||
<v-card-title class="justify-space-between grey lighten-2">
|
||||
<span class="fs-6 text text-dark">編輯牌位 : {{editedItem.actitem_num_selected.text}} - {{editedItem.print_id}}</span>
|
||||
<v-btn icon @click="tablet_edit_new.show=false"><v-icon>mdi-close</v-icon></v-btn>
|
||||
</v-card-title>
|
||||
<v-card-text>
|
||||
<iframe id="tablet_edit_new_iframe" src="../print/tablet_edit/editorNewOne.html" style="width: 100%; height: 100%;min-height:100vh;min-width:100vw" frameborder="0"></iframe>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
<v-dialog v-model="tablet_edit.show" max-width="1000px" persistent eager :class="{'d-none': !tablet_edit.initialized}">
|
||||
<v-card>
|
||||
<v-card-title class="justify-space-between grey lighten-2">
|
||||
@@ -2576,7 +2720,7 @@
|
||||
<v-btn icon @click="tablet_edit.show=false"><v-icon>mdi-close</v-icon></v-btn>
|
||||
</v-card-title>
|
||||
<v-card-text>
|
||||
<iframe id="tablet_edit_iframe" src="../print/tablet_edit/editor.html" style="width: 100%; height: 550px;" frameborder="0"></iframe>
|
||||
<iframe id="tablet_edit_iframe" src="../print/tablet_edit/editornew.html" style="width: 100%; height: 580px;" frameborder="0"></iframe>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user