3 Commits

Author SHA1 Message Date
EnChia 9a7c30bd21 1. 更新法會活動品項中的牌位陽上與超度人數限制功能 2026-05-04 13:48:51 +08:00
EnChia 29f2902119 1. 更新法會活動品項中的牌位陽上與超度人數限制功能 2026-05-04 13:44:16 +08:00
EnChia 11a8c3e932 1. 新增法會活動品項:牌位陽上與超度人數限制功能
2. 信眾資料新增全年性選項以及開始參加活動日期,自動報名並代入前一次的報名資料(品項)
2026-05-04 11:43:57 +08:00
117 changed files with 1085 additions and 117271 deletions
-4223
View File
File diff suppressed because it is too large Load Diff
-8045
View File
File diff suppressed because it is too large Load Diff
-351
View File
@@ -1,351 +0,0 @@
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;
}
}
-92
View File
@@ -1,92 +0,0 @@
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; }
}
+1 -1
View File
@@ -1,4 +1,4 @@
// 已啟用模型 'D:\17168ERP\web\App_Code\Model\Model.edmx' 的 T4 程式碼產生。
// 已啟用模型 'E:\17168ERP\web\App_Code\Model\Model.edmx' 的 T4 程式碼產生。
// 若要啟用舊版程式碼產生,請將 [程式碼產生策略] 設計工具屬性的值
//變更為 [舊版 ObjectContext]。當模型在設計工具中開啟時,這個屬性便可
//以在 [屬性] 視窗中使用。
+9 -4
View File
@@ -184,9 +184,6 @@ 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; }
@@ -409,6 +406,10 @@ namespace Model
public Nullable<float> price { get; set; }
public Nullable<int> qty { get; set; }
public Nullable<System.DateTime> reg_time { get; set; }
public Nullable<bool> has_yang_limit { get; set; }
public Nullable<bool> has_chao_limit { get; set; }
public Nullable<int> yang_limit_count { get; set; }
public Nullable<int> chao_limit_count { get; set; }
public virtual actItem actItem { get; set; }
public virtual activity activity { get; set; }
@@ -941,6 +942,11 @@ namespace Model
public Nullable<int> appellation_id { get; set; }
public string follower_hash { get; set; }
public string search_keywords { get; set; }
public Nullable<bool> is_auto_enroll { get; set; }
public Nullable<System.DateTime> auto_enroll_start_date { get; set; }
public string auto_enroll_receipt_title { get; set; }
public string auto_enroll_receipt_address { get; set; }
public Nullable<bool> auto_enroll_is_receipt { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<activity_check> activity_check { get; set; }
@@ -1393,7 +1399,6 @@ 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")]
+28 -13
View File
@@ -91,9 +91,6 @@
<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">
@@ -193,6 +190,10 @@
<Property Name="price" Type="real" />
<Property Name="qty" Type="int" />
<Property Name="reg_time" Type="datetime" />
<Property Name="has_yang_limit" Type="bit" />
<Property Name="has_chao_limit" Type="bit" />
<Property Name="yang_limit_count" Type="int" />
<Property Name="chao_limit_count" Type="int" />
</EntityType>
<EntityType Name="activity_spares">
<Key>
@@ -485,6 +486,11 @@
<Property Name="appellation_id" Type="int" />
<Property Name="follower_hash" Type="nvarchar" MaxLength="100" />
<Property Name="search_keywords" Type="varchar(max)" />
<Property Name="is_auto_enroll" Type="bit" />
<Property Name="auto_enroll_start_date" Type="datetime" />
<Property Name="auto_enroll_receipt_title" Type="nvarchar" MaxLength="50" />
<Property Name="auto_enroll_receipt_address" Type="nchar" MaxLength="200" />
<Property Name="auto_enroll_is_receipt" Type="bit" />
</EntityType>
<EntityType Name="followers_tablet">
<Key>
@@ -728,7 +734,6 @@
<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>
@@ -2612,10 +2617,7 @@
<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="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" />
<Property Name="sort_order" Type="Int32" />
</EntityType>
<EntityType Name="actItem_files">
<Key>
@@ -2736,6 +2738,10 @@
<Property Name="reg_time" Type="DateTime" Precision="3" />
<NavigationProperty Name="actItem" Relationship="Self.FK_activity_relating_actItem" FromRole="activity_relating" ToRole="actItem" />
<NavigationProperty Name="activity" Relationship="Self.FK_activity_relating_activity" FromRole="activity_relating" ToRole="activity" />
<Property Name="has_yang_limit" Type="Boolean" />
<Property Name="has_chao_limit" Type="Boolean" />
<Property Name="yang_limit_count" Type="Int32" />
<Property Name="chao_limit_count" Type="Int32" />
</EntityType>
<EntityType Name="activity_spares">
<Key>
@@ -2977,6 +2983,11 @@
<NavigationProperty Name="GuaDanOrder" Relationship="Model.FK_GuaDanOrder_Followers" FromRole="follower" ToRole="GuaDanOrder" />
<Property Name="search_keywords" Type="String" MaxLength="Max" FixedLength="false" Unicode="false" />
<NavigationProperty Name="GuaDanOrderGuest" Relationship="Model.FK_GuaDanOrderGuest_FOLLOWERS" FromRole="follower" ToRole="GuaDanOrderGuest" />
<Property Name="is_auto_enroll" Type="Boolean" />
<Property Name="auto_enroll_start_date" Type="DateTime" Precision="3" />
<Property Name="auto_enroll_receipt_title" Type="String" MaxLength="50" FixedLength="false" Unicode="true" />
<Property Name="auto_enroll_receipt_address" Type="String" MaxLength="200" FixedLength="true" Unicode="true" />
<Property Name="auto_enroll_is_receipt" Type="Boolean" />
</EntityType>
<EntityType Name="followers_tablet">
<Key>
@@ -3191,7 +3202,6 @@
<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>
@@ -5339,9 +5349,6 @@
<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" />
@@ -5456,6 +5463,10 @@
<EntitySetMapping Name="activity_relating">
<EntityTypeMapping TypeName="Model.activity_relating">
<MappingFragment StoreEntitySet="activity_relating">
<ScalarProperty Name="chao_limit_count" ColumnName="chao_limit_count" />
<ScalarProperty Name="yang_limit_count" ColumnName="yang_limit_count" />
<ScalarProperty Name="has_chao_limit" ColumnName="has_chao_limit" />
<ScalarProperty Name="has_yang_limit" ColumnName="has_yang_limit" />
<ScalarProperty Name="num" ColumnName="num" />
<ScalarProperty Name="activity_num" ColumnName="activity_num" />
<ScalarProperty Name="actItem_num" ColumnName="actItem_num" />
@@ -5646,6 +5657,11 @@
<EntitySetMapping Name="followers">
<EntityTypeMapping TypeName="Model.follower">
<MappingFragment StoreEntitySet="followers">
<ScalarProperty Name="auto_enroll_is_receipt" ColumnName="auto_enroll_is_receipt" />
<ScalarProperty Name="auto_enroll_receipt_address" ColumnName="auto_enroll_receipt_address" />
<ScalarProperty Name="auto_enroll_receipt_title" ColumnName="auto_enroll_receipt_title" />
<ScalarProperty Name="auto_enroll_start_date" ColumnName="auto_enroll_start_date" />
<ScalarProperty Name="is_auto_enroll" ColumnName="is_auto_enroll" />
<ScalarProperty Name="search_keywords" ColumnName="search_keywords" />
<ScalarProperty Name="follower_hash" ColumnName="follower_hash" />
<ScalarProperty Name="num" ColumnName="num" />
@@ -5871,7 +5887,6 @@
<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>
+2 -2
View File
@@ -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="116">
<Diagram DiagramId="b267a343dc0c4bf0ae194b775754b108" Name="Diagram1" ZoomLevel="78">
<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="11.25" PointY="9.875" IsExpanded="true" />
<EntityTypeShape EntityType="Model.activity_relating" Width="1.5" PointX="10.5" 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" />
+26
View File
@@ -10,6 +10,7 @@ using System.Collections;
using DocumentFormat.OpenXml.Office2010.Excel;
using MyWeb;
using System.Data.Entity;
using System.Diagnostics;
// api/Follower
//[ezAuthorize(Roles = "admin")]//群組:*
@@ -672,6 +673,31 @@ public class FollowerController : ApiController
return Ok(data);
}
[HttpPost]
[Route("api/follower/pending_orders")]
public IHttpActionResult GetPendingOrders(int id, string targetDate)
{
DateTime today = DateTime.Today;
if (!DateTime.TryParse(targetDate, out DateTime limitDate))
{
limitDate = new DateTime(2099, 12, 31);
}
var orderrecord = _db.pro_order
.Where(x => x.f_num == id && x.activity.startDate_solar >= today && x.activity.startDate_solar < limitDate)
.Include(x => x.activity)
.ToList();
var data = new
{
list = orderrecord.Select(x => new
{
orderno = x.order_no,
activitydate = x.activity.startDate_solar.Value.ToString("yyyy/MM/dd"),
activityname = x.activity.subject,
})
};
return Ok(data);
}
[HttpPost]
[Route("api/follower/totalorderamount")]
public IHttpActionResult GetTotalOrderCount(int id)
{
+15 -4
View File
@@ -7,6 +7,7 @@ using System;
using System.Collections;
using System.Collections.Generic;
using System.Data.Entity;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Http;
@@ -298,7 +299,6 @@ 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
@@ -318,10 +318,9 @@ 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
};
@@ -960,6 +959,10 @@ public class activityController : ApiController
},
price = x.price ?? 0,
qty = x.qty ?? 0,
has_yang_limit = x.has_yang_limit?? false,
has_chao_limit = x.has_yang_limit?? false,
yang_limit_count = x.yang_limit_count?? 0,
chao_limit_count = x.chao_limit_count?? 0,
files = x.actItem?.actItem_files.Select(f => new
{
num = f.file.num,
@@ -1177,6 +1180,10 @@ public class activityController : ApiController
if (item.qty.HasValue) { _data.qty = item.qty.Value; }
else { _data.qty = null; }
_data.reg_time = DateTime.Now;
if (item.has_yang_limit.HasValue) { _data.has_yang_limit = item.has_yang_limit; }
if (item.yang_limit_count >= 0) { _data.yang_limit_count = item.yang_limit_count.Value; }
if (item.has_chao_limit.HasValue) { _data.has_chao_limit = item.has_chao_limit; }
if (item.chao_limit_count >= 0) { _data.chao_limit_count = item.chao_limit_count.Value; }
_db.SaveChanges();
var ret = _data.num;
@@ -1197,6 +1204,10 @@ public class activityController : ApiController
if (item.qty.HasValue) { _data.qty = item.qty.Value; }
else { _data.qty = null; }
_data.reg_time = DateTime.Now;
if (item.has_yang_limit.HasValue) { _data.has_yang_limit = item.has_yang_limit; }
if (item.yang_limit_count >= 0) { _data.yang_limit_count = item.yang_limit_count.Value; }
if (item.has_chao_limit.HasValue) { _data.has_chao_limit = item.has_chao_limit; }
if (item.chao_limit_count >= 0) { _data.chao_limit_count = item.chao_limit_count.Value; }
_db.activity_relating.Add(_data);
_db.SaveChanges();
-302
View File
@@ -1,302 +0,0 @@
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"});
}
}
}
+22 -6
View File
@@ -7,6 +7,8 @@ using System;
using System.Activities.Expressions;
using System.Collections;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Core.Objects;
using System.Diagnostics;
using System.IdentityModel.Metadata;
using System.Linq;
@@ -351,7 +353,7 @@ public class orderController : ApiController
//var qry1 = _db.pro_order_detail.AsEnumerable();
//qry1 = qry1.Where(o => o.order_no == order_no);
//var qry1 = prod.pro_order_detail.AsEnumerable();
var qry1 = prod.pro_order_detail.AsQueryable();
var qry1 = prod.pro_order_detail.AsQueryable().Include(o => o.pro_order.activity.activity_relating);
//if (!string.IsNullOrEmpty(q.subject))
// qry = qry.Where(o => o.subject.Contains(q.subject));
@@ -381,7 +383,7 @@ public class orderController : ApiController
}
var tdesc = publicFun.enum_desc<Model.pro_order.detailKeyin1>();
var tdesc = publicFun.enum_desc<Model.pro_order.detailKeyin1>();;
int i = 1;
//已有值
@@ -390,10 +392,18 @@ public class orderController : ApiController
(List<pro_order_detail>)qry1_list.ToPagedList(page, pageSize);
var count = qry1_list.Count();
var ret = new
{
list = qry1_list.Select(x => new
list = qry1_list.Select(x => {
var tmpActivityRelating = x.pro_order?.activity?.activity_relating?.Where(a => a.actItem_num == x.actItem_num).FirstOrDefault();
return new
{
has_yang_limit = tmpActivityRelating?.has_yang_limit ?? false,
has_chao_limit = tmpActivityRelating?.has_chao_limit ?? false,
yang_limit_count = tmpActivityRelating?.yang_limit_count ?? 0,
chao_limit_count = tmpActivityRelating?.chao_limit_count ?? 0,
id = i++,
num = x.num,
order_no = x.order_no,
@@ -460,12 +470,12 @@ 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],
//}),
};
})
.ToList()
.OrderByDescending(x => (x.isPackage + (x.parent_num == null ? 0 : 1)))
@@ -512,6 +522,10 @@ public class orderController : ApiController
text = ar.actItem.subject,
val = ar.actItem_num,
},
has_yang_limit = ar.has_yang_limit ?? false,
has_chao_limit = ar.has_chao_limit ?? false,
yang_limit_count = ar.yang_limit_count ?? 0,
chao_limit_count = ar.chao_limit_count ?? 0,
parent_num = q.num,
f_num_selected = new
{
@@ -592,6 +606,10 @@ public class orderController : ApiController
text = x.actItem.subject,
val = x.actItem.num,
},
has_yang_limit = x.has_yang_limit,
has_chao_limit = x.has_chao_limit,
yang_limit_count = x.yang_limit_count,
chao_limit_count = x.chao_limit_count,
f_num_selected = new
{
text = "",
@@ -726,7 +744,6 @@ 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
{
@@ -780,7 +797,6 @@ 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();
+5 -44
View File
@@ -1,18 +1,14 @@
using com.itextpdf.text.pdf;
using Model;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using PagedList;
using System;
using System.Collections;
using System;
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 的摘要说明
@@ -63,39 +59,4 @@ 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,7 +10,6 @@ using System.Collections;
using MyWeb;
using System.Web.WebPages;
using System.Data.Entity;
using Model;
[ezAuthorize]
public class transfer_registerController : ApiController
@@ -270,7 +269,6 @@ 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]
@@ -317,7 +315,7 @@ public class transfer_registerController : ApiController
{
uptime = dto.check_date,
category = 1, // 收入
kind = dto.kind,//27, // 固定值:法會收入/功德項目
kind = 27, // 固定值:法會收入/功德項目
kind2 = dto.acc_num,
price = (float)(dto.check_amount ?? 0),
tax = 0,
@@ -348,7 +346,6 @@ public class transfer_registerController : ApiController
item.check_memo = dto.check_memo;
item.draft = dto.draft;
item.acc_kind = dto.acc_kind;
}
}
_db.SaveChanges();
@@ -961,10 +958,7 @@ 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,
@@ -1281,22 +1275,3 @@ 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>C:\17168web</PublishUrl>
<PublishUrl>D:\17168web</PublishUrl>
<WebPublishMethod>FileSystem</WebPublishMethod>
<_TargetId>Folder</_TargetId>
<SiteUrlToLaunchAfterPublish />
@@ -23,8 +23,6 @@
<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>
@@ -69,14 +67,14 @@
let HTTP_HOST = "<%=UrlHost()%>";
</script>
<script src="<%=ResolveUrl("~/js/bootstrap5/js/bootstrap.bundle.min.js")%>"></script>
<script src="<%=ResolveUrl("~/js/jquery-4.0.0.min.js")%>"></script>
<script src="<%=ResolveUrl("~/js/jquery-3.6.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', {
-76
View File
@@ -23,8 +23,6 @@
data() {
return {
this_id: '<%= Request["num"] %>',
paperlist: [],
stylelist: [],
options: {},
optionsDetail: {
multiSort: false,
@@ -336,50 +334,6 @@
)
}
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);
@@ -571,15 +525,6 @@
}
}
},
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: {
},
@@ -680,27 +625,6 @@
<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>
-51
View File
@@ -44,21 +44,6 @@ 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;
@@ -137,18 +122,6 @@ 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; }
@@ -197,18 +170,6 @@ 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; }
@@ -287,16 +248,4 @@ 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);
//}
}
+64 -87
View File
@@ -165,6 +165,8 @@
{ text: '* 品項名稱', value: 'act_item_selected.text', sortable: false },
{ text: '預設金額', value: 'price', sortable: false },
{ text: '數量', value: 'qty', sortable: false },
{ text: '陽上/祈福人數限制', value: 'limit_yang', sortable: false },
{ text: '超渡人數限制', value: 'limit_chao', sortable: false },
{ text: '', value: 'actions', sortable: false, width: "200px" },
],
footersDetail: {
@@ -191,6 +193,10 @@
price: 0,
qty: 0,
files: [],
has_yang_limit: false,
has_chao_limit: false,
yang_limit_count: 0,
chao_limit_count: 0,
},
defaultItem: {
id: 0,
@@ -203,6 +209,10 @@
price: 0,
qty: 0,
files: [],
has_yang_limit: false,
has_chao_limit: false,
yang_limit_count: 0,
chao_limit_count: 0,
},
//列印
data_table: {
@@ -434,7 +444,6 @@
this.close();
},
spliceNullData() {
//if new data ,then splice it
if (this.editedItem.num == 0) {
for (var i = 0; i < this.desserts.map(x => x.id).length; i++) {
@@ -482,6 +491,10 @@
actItem_num: this.editedItem.act_item_selected.val,
price: this.editedItem.price,
qty: this.editedItem.qty,
has_yang_limit: this.editedItem.has_yang_limit,
has_chao_limit: this.editedItem.has_chao_limit,
yang_limit_count: this.editedItem.yang_limit_count,
chao_limit_count: this.editedItem.chao_limit_count,
}
axios
.post(HTTP_HOST + 'api/activity/SaveRelatingData', pro_order_detail)
@@ -590,8 +603,7 @@
this.data_table.selected.push(this.data_table.editFilesItem[i])
}
}
},
multiPrintNew() {
}, multiPrint() {
var params = {
item: this.thisItemSelected.val,
file: this.thisFilesSelected.val,
@@ -602,82 +614,9 @@
//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))
.sort((a, b) => a.print_id.localeCompare(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) {
// 記錄已列印
let _url = HTTP_HOST + 'api/order/printMultiFileLog';
@@ -713,14 +652,10 @@
};
// 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));
/*
var hiddenField = document.createElement("input");
@@ -1097,6 +1032,54 @@
<v-text-field v-model="editedItem.qty" :hide-details="true" dense single-line v-if="item.id === editedItem.id" ></v-text-field>
<span v-else>{{item.qty}}</span>
</template>
<template v-slot:item.limit_yang="{ item }">
<div class="d-flex align-center">
<v-text-field v-model="editedItem.yang_limit_count" v-if="item.id === editedItem.id"
type="number"
dense
:hide-details="true"
single-line
:disabled="!editedItem.has_yang_limit"
suffix="人" >
</v-text-field>
<v-checkbox v-if="item.id === editedItem.id"
v-model="editedItem.has_yang_limit"
label="不限"
hide-details
class="ml-2 mt-0"
:true-value="false"
:false-value="true"
:disabled="item.id !== editedItem.id">
</v-checkbox>
<span v-if="item.id !== editedItem.id && !item.has_yang_limit">不限</span>
<span v-if="item.id !== editedItem.id && item.has_yang_limit">{{item.yang_limit_count}} 人</span>
</div>
</template>
<template v-slot:item.limit_chao="{ item }">
<div class="d-flex align-center">
<v-text-field v-model="editedItem.chao_limit_count" v-if="item.id === editedItem.id"
type="number"
dense
:hide-details="true"
single-line
:disabled="!editedItem.has_chao_limit"
suffix="人" >
</v-text-field>
<v-checkbox v-if="item.id === editedItem.id"
v-model="editedItem.has_chao_limit"
label="不限"
hide-details
class="ml-2 mt-0"
:true-value="false"
:false-value="true"
:disabled="item.id !== editedItem.id">
</v-checkbox>
<span v-if="item.id !== editedItem.id && !item.has_chao_limit">不限</span>
<span v-if="item.id !== editedItem.id && item.has_chao_limit">{{item.chao_limit_count}} 人</span>
</div>
</template>
<template v-slot:item.actions="{ item }">
<template v-if="item.id === editedItem.id">
<v-icon color="red" class="mr-2" @click="cancel">
@@ -1277,12 +1260,6 @@
@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>
+84
View File
@@ -235,6 +235,36 @@ public partial class admin_activity_reg : MyWeb.config
#endregion
#region
protected string createOrderNumber()
{
Application.Lock();
string order_no = "AA" + DateTime.Now.ToString("yyMMdd");
var qry = _db.companies.AsQueryable();
//var prod = qry.Where(q => q.last_order_no.Contains(order_no)).FirstOrDefault();
var prod = qry.Where(q => q.num == 1).FirstOrDefault();
if (prod != null)
{
if (!isStrNull(prod.last_order_no) && prod.last_order_no.Contains(order_no))
{
int tmp = Convert.ToInt32(prod.last_order_no.Replace(order_no, "")) + 1;
order_no = order_no + tmp.ToString("0000");
}
else
{
order_no = order_no + "0001";
}
prod.last_order_no = order_no;
_db.SaveChanges();
}
else
order_no = "";
Application.UnLock();
return order_no;
}
protected void add_Click(object sender, EventArgs e)
{
@@ -293,6 +323,60 @@ public partial class admin_activity_reg : MyWeb.config
Model.admin_log admin_log = new Model.admin_log();
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Activity, (int)Model.admin_log.Status.Insert, subject.Text);
// 自動報名的信眾報名
var qry = _db.followers.Where(f => f.is_auto_enroll == true).AsQueryable();
var followers = qry.ToList();
if (followers != null)
{
try
{
foreach (var follower in followers)
{
Model.pro_order pro_order = new Model.pro_order(); //新增
pro_order.order_no = createOrderNumber();
pro_order.up_time = DateTime.Now;
pro_order.reg_time = DateTime.Now;
pro_order.keyin1 = "A01";
pro_order.f_num = follower.num;
if (!isStrNull(follower.phone)) { pro_order.phone = follower.phone; }
if (!isStrNull(follower.cellphone)) { pro_order.phone = follower.cellphone; }
if (IsNumeric(activity.num)) { pro_order.activity_num = activity.num; }
pro_order.address = isStrNull(follower.auto_enroll_receipt_address) ? "" : follower.auto_enroll_receipt_address;
pro_order.receipt_title = isStrNull(follower.auto_enroll_receipt_title) ? "" : follower.auto_enroll_receipt_title;
pro_order.send_receipt = isStrNull(follower.auto_enroll_is_receipt) ? false : follower.auto_enroll_is_receipt;
pro_order.demo = "";
pro_order.customize_data = "";
try
{
if (!isStrNull(pro_order.order_no))
{
bool isRegistered = _db.pro_order.Any(x => x.f_num == pro_order.f_num && x.activity_num == pro_order.activity_num);
if (isRegistered) // 重複報名
{
continue;
}
else
{
_db.pro_order.Add(pro_order);
_db.SaveChanges();
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Order, (int)Model.admin_log.Status.Insert, pro_order.order_no);
}
}
}
catch (Exception ex)
{
}
}
}
catch (Exception ex)
{
}
}
Response.Redirect("index.aspx");
}
else
-868
View File
@@ -1,868 +0,0 @@
<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>
-300
View File
@@ -1,300 +0,0 @@
<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>
-657
View File
@@ -1,657 +0,0 @@
<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>
-295
View File
@@ -1,295 +0,0 @@
<%@ 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>
-15
View File
@@ -1,15 +0,0 @@
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)
{
}
}
-510
View File
@@ -1,510 +0,0 @@
<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>
-193
View File
@@ -1,193 +0,0 @@
<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>
-461
View File
@@ -1,461 +0,0 @@
<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>
@@ -1,382 +0,0 @@
<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>
+213 -5
View File
@@ -116,6 +116,15 @@
vuetify: new Vuetify(vuetify_options),
data() {
return {
init_is_auto_enroll: false,
is_auto_enroll: false,
auto_enroll_date: '',
auto_enroll_config: {
is_receipt: true, // 是否寄送收據
receipt_title: '', // 收據抬頭
receipt_address: '', // 收據地址
},
last_confirmed_date: '',
tabArray: tabtmp,
tabArray2: "",
follower_id: '<%= Request["num"] %>',
@@ -124,6 +133,18 @@
multiSort: false,
//itemsPerPage: -1,
},
confirm_dialog: {
show: false,
headers: [
{ text: '活動日期', value: 'activitydate' },
{ text: '活動名稱', value: 'activityname'},
],
title: '',
desc: '',
orders: [],
btn_cancel_text: '', // 「取消報名」按鈕文字
btn_keep_text: '' // 「保留活動」按鈕文字
},
search_dialog: {
controls: {
search1: {
@@ -485,7 +506,16 @@
]
}
},
mounted() {//一開始就載入
mounted() {
//一開始就載入
this.$nextTick(() => {
this.auto_enroll_date = document.getElementById('<%= hid_auto_enroll_start_date.ClientID %>').value;
this.is_auto_enroll = (document.getElementById('<%= hid_is_auto_enroll.ClientID %>').value.toLowerCase() === "true");
this.init_is_auto_enroll = this.is_auto_enroll;
this.auto_enroll_config.is_receipt = (document.getElementById('<%= hid_auto_enroll_is_receipt.ClientID %>').value.toLowerCase() === "true");
this.auto_enroll_config.receipt_title = document.getElementById('<%= hid_auto_enroll_receipt_title.ClientID %>').value;
this.auto_enroll_config.receipt_address = document.getElementById('<%= hid_auto_enroll_receipt_address.ClientID %>').value;
})
this.search_dialog.current = this.search_dialog.controls.search1 ///default
//console.log("mounted");
//this.initialize();
@@ -496,6 +526,30 @@
this.onCityChange();
},
watch: {
auto_enroll_config: {
handler(newVal) {
document.getElementById('<%= hid_auto_enroll_is_receipt.ClientID %>').value = newVal.is_receipt;
document.getElementById('<%= hid_auto_enroll_receipt_title.ClientID %>').value = newVal.receipt_title;
document.getElementById('<%= hid_auto_enroll_receipt_address.ClientID %>').value = newVal.receipt_address;
},
deep: true,
},
is_auto_enroll(newVal, oldVal) {
if (newVal === true) {
if (!this.auto_enroll_date) {
this.auto_enroll_date = new Date().toISOString().substr(0, 10);
this.last_confirmed_date = this.auto_enroll_date;
}
} else {
if (this.init_is_auto_enroll === true) {
this.open_confirm_dialog('CANCEL_AUTO_ENROLL');
}
}
document.getElementById('<%=hid_is_auto_enroll.ClientID%>').value = newVal;
},
auto_enroll_date(newVal) {
document.getElementById('<%=hid_auto_enroll_start_date.ClientID%>').value = newVal;
},
options: {
handler() {
//console.log("watch1", this.search_dialog, this.search_dialog.page);
@@ -537,6 +591,58 @@
}
},
methods: {
syncAddress() {
const sourceAddr = document.getElementById('<%=address.ClientID%>').value;
this.auto_enroll_config.receipt_address = sourceAddr;
},
open_confirm_dialog(type) {
const targetDate = (type === 'CANCEL_AUTO_ENROLL') ? '2099-12-31' : this.auto_enroll_date;
api_url = 'api/follower/pending_orders?id=' + '<%= Request["num"] %>' + '&targetDate=' + targetDate;
if (type === "CANCEL_AUTO_ENROLL") {
axios
.post(HTTP_HOST + api_url)
.then(response => {
this.confirm_dialog.orders = response.data.list;
this.confirm_dialog.title = "取消自動報名";
this.confirm_dialog.desc = "以下活動已報名,是否一併取消?";
this.confirm_dialog.btn_cancel_text = "取消全部活動";
this.confirm_dialog.btn_keep_text = "保留現有活動";
const orderNos = this.confirm_dialog.orders.map(o => o.orderno).join(',');
document.getElementById('<%= hid_delete_order_list.ClientID %>').value = orderNos;
if (this.confirm_dialog.orders.length > 0) this.confirm_dialog.show = true;
})
}
else if (type === "UPDATE_START_DATE") {
axios
.post(HTTP_HOST + api_url)
.then(response => {
this.confirm_dialog.orders = response.data.list;
this.confirm_dialog.title = "生效日期延後確認";
this.confirm_dialog.desc = "以下活動已報名,是否一併取消?";
this.confirm_dialog.btn_cancel_text = "取消活動";
this.confirm_dialog.btn_keep_text = "保留現有活動";
const orderNos = this.confirm_dialog.orders.map(o => o.orderno).join(',');
document.getElementById('<%= hid_delete_order_list.ClientID %>').value = orderNos;
if (this.confirm_dialog.orders.length > 0) this.confirm_dialog.show = true;
})
}
},
close_confirm_dialog() {
this.auto_enroll_date = this.last_confirmed_date;
if (!this.is_auto_enroll)this.is_auto_enroll = true;
this.confirm_dialog.show = false;
},
keep_auto_enroll_order() {
document.getElementById('<%= hid_is_delete_all_order.ClientID %>').value = "false";
this.last_confirmed_date = this.auto_enroll_date;
this.confirm_dialog.show = false;
},
delete_auto_enroll_order() {
document.getElementById('<%= hid_is_delete_all_order.ClientID %>').value = "true";
console.log("TRUE");
this.last_confirmed_date = this.auto_enroll_date;
this.confirm_dialog.show = false;
},
search_show(curr) {
console.log("btn_click:", curr, curr.api_url);
this.search_dialog.current = curr;
@@ -1340,6 +1446,7 @@
</script>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="page_nav" runat="Server">
<asp:HiddenField ID="hid_delete_order_list" runat="server" />
<div class="scroll-nav nav nav-tabs mb-2 mb-sm-0 d-none d-sm-flex">
<template v-if="follower_id !='' "> {{titleword()}} </template>
</div>
@@ -1564,16 +1671,42 @@
<asp:RegularExpressionValidator ControlToValidate="contactor_phone" ErrorMessage="格式有誤" ID="RegularExpressionValidator3" runat="server" ValidationExpression="^[+-]?\d+([+-]?\d*)*$" Display="Dynamic" SetFocusOnError="true" />
</div>
</div>
<div class="row mb-1 label-sm-right">
<label class="col-sm-2 col-lg-1 col-form-label">自訂標籤</label>
<div class="col-sm-2 col-lg-1 d-flex align-center justify-content-end pr-2">
<input type="checkbox"
v-model="is_auto_enroll"
style="width: 18px; height: 18px; cursor: pointer;"
class="mr-2">
<label class="col-form-label">全年報名</label>
<asp:HiddenField ID="hid_is_auto_enroll" runat="server" Value="false" />
<asp:HiddenField ID="hid_is_delete_all_order" runat="server" Value="false" />
</div>
<div class="col-sm-10 col-lg-3">
<input ID="auto_enroll_start_date" type="date"
class="form-control"
v-model="auto_enroll_date"
:disabled="!is_auto_enroll"
@change="open_confirm_dialog('UPDATE_START_DATE')">
<asp:HiddenField ID="hid_auto_enroll_start_date" runat="server" Value="" />
<small class="text-muted" v-if="is_auto_enroll">請設定生效日期</small>
</div>
<label class="col-sm-2 col-lg-1 col-form-label text-right">自訂標籤</label>
<div class="col-sm-4 col-lg-3">
<div class="input-group">
<input type="text" class="form-control" v-model="tabArray2" v-on:keyup.enter="addTab" title="可自由輸入標籤名稱,輸入完成請按「+」,或「Enter」" placeholder="自訂標籤名稱">
<asp:HiddenField ID="tab" runat="server" />
<a class="btn btn-default" @click="addTab" ><i class="mdi mdi-plus"></i></a>
<div class="input-group-append">
<button type="button" class="btn btn-default" @click="addTab"><i class="mdi mdi-plus"></i></button>
</div>
</div>
<div class="col-sm-12 col-lg-7">
</div>
<div class="col-sm-12 col-lg-4">
<template>
<div class="">
<v-chip v-for="item,index in tabArray"
@@ -1590,6 +1723,40 @@
</div>
</div>
<v-expand-transition>
<div v-show="is_auto_enroll" class="row rounded grey lighten-4 border py-4">
<div class="row mb-1 label-sm-right">
<div class="col-sm-2 col-lg-1 d-flex align-center justify-content-end pr-2">
<input type="checkbox" v-model="auto_enroll_config.is_receipt" style="width:18px; height:18px; cursor: pointer;" class="mr-2">
<label class="col-form-label">寄送收據</label>
<asp:HiddenField ID="hid_auto_enroll_is_receipt" runat="server" />
</div>
<div class="col-sm-12 col-lg-3">
<input type="text" class="form-control"
placeholder="收據抬頭" v-model="auto_enroll_config.receipt_title" :disabled="!auto_enroll_config.is_receipt">
<asp:HiddenField ID="hid_auto_enroll_receipt_title" runat="server" />
</div>
<div class="col-sm-12 col-lg-6">
<div class="input-group mb-3">
<input type="text" class="form-control"
placeholder="收據地址" v-model="auto_enroll_config.receipt_address" :disabled="!auto_enroll_config.is_receipt">
<asp:HiddenField ID="hid_auto_enroll_receipt_address" runat="server" />
<button class="btn btn-outline-secondary" type="button" @click="syncAddress" :disabled="!auto_enroll_config.is_receipt">同收件地址</button>
</div>
</div>
</div>
<div class="py-1 px-8 mb-2 text-muted" style="font-size: 0.85rem; line-height: 1.5;">
<div class="font-weight-bold mb-1">
<v-icon small color="info" class="mr-1">mdi-information</v-icon> 自動報名須知:
</div>
<ul class="pl-4 mb-0">
<li><strong>生效範疇:</strong>此處修改僅影響<strong>往後</strong>產生的訂單;既有訂單請至「報名管理」手動調整。</li>
<li><strong>品項帶入:</strong>系統將自動沿用該信眾<strong>距今最近一次</strong>的報名品項(若無歷史紀錄則不自動帶入)。</li>
</ul>
</div>
</div>
</v-expand-transition>
<div class="row mb-1">
<label class="col-form-label">備註</label>
@@ -2123,7 +2290,7 @@
<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-btn icon @click="search_dialog.show=false;"><v-icon>mdi-close</v-icon></v-btn>
</v-card-title>
<v-card-text >
<v-row>
@@ -2173,6 +2340,47 @@
</v-btn>
</template>
</v-snackbar>
<v-dialog v-model="confirm_dialog.show" max-width="500px" persistent>
<v-card>
<v-card-title class="justify-space-between grey lighten-2">
<span>{{ confirm_dialog.title }}</span>
<v-btn icon @click="close_confirm_dialog"><v-icon>mdi-close</v-icon></v-btn>
</v-card-title>
<v-card-text class="pt-4">
<p class="body-1">{{ confirm_dialog.desc }}</p>
<v-data-table
:headers="confirm_dialog.headers"
:items="confirm_dialog.orders"
:items-per-page="5"
class="elevation-1 grey lighten-5"
:footer-props="{
'items-per-page-text': '每頁顯示',
'items-per-page-options': [5, 10]
}"
>
<template v-slot:item.activitydate="{ item }">
<span>{{ item.activitydate }}</span>
</template>
</v-data-table>
</v-card-text>
<v-divider class="pa-0 ma-0"></v-divider>
<v-card-actions class="pa-4 justify-end">
<v-btn color="primary" @click="keep_auto_enroll_order">
{{ confirm_dialog.btn_keep_text }}
</v-btn>
<v-btn color="red" dark @click="delete_auto_enroll_order">
{{ confirm_dialog.btn_cancel_text }}
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</div>
</asp:Content>
+412 -3
View File
@@ -11,9 +11,11 @@ using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using static Model.activity_check;
public partial class admin_follower_reg : MyWeb.config
{
@@ -153,6 +155,30 @@ public partial class admin_follower_reg : MyWeb.config
modify_time.Text = prod.admin_log;
}
if (!isStrNull(prod.is_auto_enroll))
{
hid_is_auto_enroll.Value = prod.is_auto_enroll.ToString();
}
if (prod.auto_enroll_start_date.HasValue)
{
hid_auto_enroll_start_date.Value = prod.auto_enroll_start_date.Value.ToString("yyyy-MM-dd");
}
if (prod.auto_enroll_is_receipt.HasValue)
{
hid_auto_enroll_is_receipt.Value = prod.auto_enroll_is_receipt.ToString();
}
if (!isStrNull(prod.auto_enroll_receipt_title))
{
hid_auto_enroll_receipt_title.Value = prod.auto_enroll_receipt_title.ToString();
}
if (!isStrNull(prod.auto_enroll_receipt_address))
{
hid_auto_enroll_receipt_address.Value = prod.auto_enroll_receipt_address.ToString();
}
edit.Visible = true;
goback.Visible = true;
@@ -181,7 +207,36 @@ public partial class admin_follower_reg : MyWeb.config
#region
protected string createOrderNumber()
{
Application.Lock();
string order_no = "AA" + DateTime.Now.ToString("yyMMdd");
var qry = _db.companies.AsQueryable();
//var prod = qry.Where(q => q.last_order_no.Contains(order_no)).FirstOrDefault();
var prod = qry.Where(q => q.num == 1).FirstOrDefault();
if (prod != null)
{
if (!isStrNull(prod.last_order_no) && prod.last_order_no.Contains(order_no))
{
int tmp = Convert.ToInt32(prod.last_order_no.Replace(order_no, "")) + 1;
order_no = order_no + tmp.ToString("0000");
}
else
{
order_no = order_no + "0001";
}
prod.last_order_no = order_no;
_db.SaveChanges();
}
else
order_no = "";
Application.UnLock();
return order_no;
}
protected void add_Click(object sender, EventArgs e)
{
if (Page.IsValid) {
@@ -237,12 +292,77 @@ public partial class admin_follower_reg : MyWeb.config
//tab
followers.tab = tab.Value.Trim(',');
if (!isStrNull(hid_is_auto_enroll.Value)) followers.is_auto_enroll = hid_is_auto_enroll.Value == "true";
if (!isStrNull(hid_auto_enroll_start_date.Value)) followers.auto_enroll_start_date = Convert.ToDateTime(hid_auto_enroll_start_date.Value);
if (!isStrNull(hid_auto_enroll_is_receipt.Value)) followers.auto_enroll_is_receipt = hid_auto_enroll_is_receipt.Value == "true";
if (!isStrNull(hid_auto_enroll_receipt_title.Value)) followers.auto_enroll_receipt_title = hid_auto_enroll_receipt_title.Value;
if (!isStrNull(hid_auto_enroll_receipt_address.Value)) followers.auto_enroll_receipt_address = hid_auto_enroll_receipt_address.Value;
string ChkNewMsg = Model.follower.ChkNewFollower(followers);
if(string.IsNullOrEmpty(ChkNewMsg))
{
_db.followers.Add(followers);
_db.SaveChanges();
if (hid_is_auto_enroll.Value == "true")
{
// 信眾自動報名
var qry = _db.activities.Where(a => a.startDate_solar >= followers.auto_enroll_start_date).AsQueryable();
var activities = qry.ToList();
if (activities != null)
{
try
{
foreach (var activity in activities)
{
Model.pro_order pro_order = new Model.pro_order(); //新增
bool isRegistered = _db.pro_order.Any(x => x.f_num == followers.num && x.activity_num == activity.num);
if (isRegistered) continue; // 重複報名
pro_order.order_no = createOrderNumber();
pro_order.up_time = DateTime.Now;
pro_order.reg_time = DateTime.Now;
pro_order.keyin1 = "A01";
pro_order.f_num = followers.num;
if (!isStrNull(followers.phone)) { pro_order.phone = followers.phone; }
if (!isStrNull(followers.cellphone)) { pro_order.phone = followers.cellphone; }
if (IsNumeric(activity.num)) { pro_order.activity_num = activity.num; }
pro_order.address = isStrNull(followers.auto_enroll_receipt_address) ? "" : followers.auto_enroll_receipt_address;
pro_order.receipt_title = isStrNull(followers.auto_enroll_receipt_title) ? "" : followers.auto_enroll_receipt_title;
pro_order.send_receipt = isStrNull(followers.auto_enroll_is_receipt) ? false : followers.auto_enroll_is_receipt;
pro_order.demo = "";
pro_order.customize_data = "";
try
{
if (!isStrNull(pro_order.order_no))
{
_db.pro_order.Add(pro_order);
_db.SaveChanges();
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.Insert, pro_order.order_no);
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
}
//if (prod.Count > 0)
//{
// var orderNumbers = prod.Select(x => x.order_no).ToList();
// var qry = _db.pro_order_detail
// .Where(o => orderNumbers.Contains(o.order_no))
// }
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
}
}
int _id = followers.num;
@@ -301,6 +421,10 @@ public partial class admin_follower_reg : MyWeb.config
{
try
{
// 記錄修改前的舊值,供後續流程判斷
bool old_is_auto_enroll = followers.is_auto_enroll ?? false;
DateTime? old_auto_enroll_start_date = followers.auto_enroll_start_date;
foreach (Control obj in cardBodyPanel.Controls)
{
if (obj is TextBox)
@@ -318,10 +442,7 @@ public partial class admin_follower_reg : MyWeb.config
}
else
ObjValue.SetValue(followers, null);
}
}
followers.identity_type = Val(identity_type.SelectedValue);
@@ -333,6 +454,294 @@ public partial class admin_follower_reg : MyWeb.config
//followers.admin_log = admin.info.u_id + " " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
followers.follower_hash = encrypt.followerHash(followers.phone, followers.id_code);
if (!isStrNull(hid_is_auto_enroll.Value)) followers.is_auto_enroll = hid_is_auto_enroll.Value == "true";
if (!isStrNull(hid_auto_enroll_start_date.Value)) followers.auto_enroll_start_date = Convert.ToDateTime(hid_auto_enroll_start_date.Value);
if (!isStrNull(hid_auto_enroll_is_receipt.Value)) followers.auto_enroll_is_receipt = hid_auto_enroll_is_receipt.Value == "true";
if (!isStrNull(hid_auto_enroll_receipt_title.Value)) followers.auto_enroll_receipt_title = hid_auto_enroll_receipt_title.Value;
if (!isStrNull(hid_auto_enroll_receipt_address.Value)) followers.auto_enroll_receipt_address = hid_auto_enroll_receipt_address.Value;
// is_auto_enroll 從關 → 開,執行自動報名
bool new_is_auto_enroll = followers.is_auto_enroll ?? false;
bool isAutoEnrollTurnedOn = !old_is_auto_enroll && new_is_auto_enroll;
bool isAutoEnrollTurnedOff = old_is_auto_enroll && !new_is_auto_enroll;
// auto_enroll_start_date 有變更,確認是否刪除已有訂單
bool isStartDateChanged = followers.auto_enroll_start_date != old_auto_enroll_start_date;
// 關 → 開,執行自動報名
if (isAutoEnrollTurnedOn)
{
var qry = _db.activities.Where(a => a.startDate_solar >= followers.auto_enroll_start_date).AsQueryable();
var latestOrder = _db.pro_order.Where(o => o.f_num == followers.num).OrderByDescending(o => o.order_no).FirstOrDefault(); // 最近一次訂單
var activities = qry.ToList();
if (activities != null)
{
try
{
foreach (var activity in activities)
{
Model.pro_order pro_order = new Model.pro_order(); //新增
bool isRegistered = _db.pro_order.Any(x => x.f_num == followers.num && x.activity_num == activity.num);
if (isRegistered) continue; // 重複報名
pro_order.order_no = createOrderNumber();
pro_order.up_time = DateTime.Now;
pro_order.reg_time = DateTime.Now;
pro_order.keyin1 = "A01";
pro_order.f_num = followers.num;
if (!isStrNull(followers.phone)) { pro_order.phone = followers.phone; }
if (!isStrNull(followers.cellphone)) { pro_order.phone = followers.cellphone; }
if (IsNumeric(activity.num)) { pro_order.activity_num = activity.num; }
pro_order.address = isStrNull(followers.auto_enroll_receipt_address) ? "" : followers.auto_enroll_receipt_address;
pro_order.receipt_title = isStrNull(followers.auto_enroll_receipt_title) ? "" : followers.auto_enroll_receipt_title;
pro_order.send_receipt = isStrNull(followers.auto_enroll_is_receipt) ? false : followers.auto_enroll_is_receipt;
pro_order.demo = "";
pro_order.customize_data = "";
try
{
if (!isStrNull(pro_order.order_no))
{
_db.pro_order.Add(pro_order);
_db.SaveChanges();
// 報名品項(最近一次訂單內容)
if (latestOrder != null)
{
var last_order_details = _db.pro_order_detail.Where(o => o.order_no == latestOrder.order_no).ToList();
foreach (var last_order_detail in last_order_details)
{
Model.pro_order_detail order_detail = new Model.pro_order_detail();
order_detail.order_no = pro_order.order_no;
order_detail.actItem = last_order_detail.actItem;
order_detail.parent_num = last_order_detail.parent_num;
order_detail.print_id = last_order_detail.print_id;
order_detail.f_num = last_order_detail.f_num;
order_detail.f_num_tablet = last_order_detail.f_num_tablet;
order_detail.address = last_order_detail.address;
order_detail.from_id = last_order_detail.from_id;
order_detail.from_id_tablet = last_order_detail.from_id_tablet;
order_detail.bed_type = last_order_detail.bed_type;
order_detail.qty = last_order_detail.qty;
order_detail.price = last_order_detail.price;
order_detail.start_date = DateTime.Today;
order_detail.pay = last_order_detail.pay;
order_detail.bed_type = last_order_detail.bed_type;
order_detail.keyin1 = last_order_detail.keyin1;
order_detail.demo = last_order_detail.demo;
order_detail.customize_data = last_order_detail.customize_data;
order_detail.printed_files = last_order_detail.printed_files;
order_detail.UpdateTime = DateTime.Now;
_db.pro_order_detail.Add(order_detail);
}
}
_db.SaveChanges();
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.Insert, pro_order.order_no);
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
}
// 開 → 關,刪除自動報名訂單
if (isAutoEnrollTurnedOff && hid_is_delete_all_order.Value == "true")
{
if (!string.IsNullOrEmpty(hid_delete_order_list.Value))
{
var ids = hid_delete_order_list.Value.TrimEnd(',').Split(',');
var prod = _db.pro_order.Where(q => ids.Contains(q.order_no)).ToList();
if (prod.Count() > 0)
{
var prod2 = _db.pro_order_detail.Where(q => ids.Contains(q.order_no)).ToList();
if (prod2.Count > 0)
{
foreach (var item2 in prod2)
{
var prod3 = _db.bed_order.Where(q => q.order_no == item2.order_no && q.o_detail_id == item2.num).ToList();
if (prod3.Count > 0)
{
foreach (var item3 in prod3)
{
var prod4 = _db.bed_order_detail.Where(q => q.bed_order_no == item3.bed_order_no).ToList();
if (prod4.Count > 0)
{
_db.bed_order_detail.RemoveRange(prod4);
}
}
_db.bed_order.RemoveRange(prod3);
}
}
_db.pro_order_detail.RemoveRange(prod2);
_db.SaveChanges();
}
_db.pro_order.RemoveRange(prod);
_db.SaveChanges();
Model.admin_log admin_log = new Model.admin_log();
if (admin.isLoign())
{
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Order, (int)Model.admin_log.Status.Delete, admin_log.LogViewBtn(prod.Select(x => x.order_no).ToList()));
}
}
}
}
if (isStartDateChanged && old_auto_enroll_start_date.HasValue && !isAutoEnrollTurnedOff)
{
bool isDateMovedLater = followers.auto_enroll_start_date > old_auto_enroll_start_date; // 變晚
bool isDateMovedEarlier = followers.auto_enroll_start_date < old_auto_enroll_start_date; // 變早
// 日期變晚,刪除指定訂單
if (isDateMovedLater && hid_is_delete_all_order.Value == "true")
{
if (!string.IsNullOrEmpty(hid_delete_order_list.Value))
{
var ids = hid_delete_order_list.Value.TrimEnd(',').Split(',');
var prod = _db.pro_order.Where(q => ids.Contains(q.order_no)).ToList();
if (prod.Count() > 0)
{
//var prod2 = _db.pro_order_detail.ToList().Where(q => ids.Contains(Convert.ToString(q.order_no))).ToList();
var prod2 = _db.pro_order_detail.Where(q => ids.Contains(q.order_no)).ToList();
if (prod2.Count > 0)
{
foreach (var item2 in prod2)
{
var prod3 = _db.bed_order.Where(q => q.order_no == item2.order_no && q.o_detail_id == item2.num).ToList();
if (prod3.Count > 0)
{
foreach (var item3 in prod3)
{
var prod4 = _db.bed_order_detail.Where(q => q.bed_order_no == item3.bed_order_no).ToList();
if (prod4.Count > 0)
{
_db.bed_order_detail.RemoveRange(prod4);
}
}
_db.bed_order.RemoveRange(prod3);
}
}
_db.pro_order_detail.RemoveRange(prod2);
_db.SaveChanges();
}
_db.pro_order.RemoveRange(prod);
_db.SaveChanges();
Model.admin_log admin_log = new Model.admin_log();
if (admin.isLoign())
{
admin_log.writeLog(admin.info.u_id, (int)Model.admin_log.Systems.Order, (int)Model.admin_log.Status.Delete, admin_log.LogViewBtn(prod.Select(x => x.order_no).ToList()));
}
}
}
}
// 日期變早,補報名
else if (isDateMovedEarlier && !isAutoEnrollTurnedOn)
{
var qry = _db.activities.Where(a =>
a.startDate_solar >= followers.auto_enroll_start_date &&
a.startDate_solar < old_auto_enroll_start_date);
var latestOrder = _db.pro_order.Where(o => o.f_num == followers.num).OrderByDescending(o => o.order_no).FirstOrDefault(); // 最近一次訂單
var activities = qry.ToList();
if (activities != null)
{
try
{
foreach (var activity in activities)
{
Model.pro_order pro_order = new Model.pro_order(); //新增
bool isRegistered = _db.pro_order.Any(x => x.f_num == followers.num && x.activity_num == activity.num);
if (isRegistered) continue; // 重複報名
pro_order.order_no = createOrderNumber();
pro_order.up_time = DateTime.Now;
pro_order.reg_time = DateTime.Now;
pro_order.keyin1 = "A01";
pro_order.f_num = followers.num;
if (!isStrNull(followers.phone)) { pro_order.phone = followers.phone; }
if (!isStrNull(followers.cellphone)) { pro_order.phone = followers.cellphone; }
if (IsNumeric(activity.num)) { pro_order.activity_num = activity.num; }
pro_order.address = isStrNull(followers.auto_enroll_receipt_address) ? "" : followers.auto_enroll_receipt_address;
pro_order.receipt_title = isStrNull(followers.auto_enroll_receipt_title) ? "" : followers.auto_enroll_receipt_title;
pro_order.send_receipt = isStrNull(followers.auto_enroll_is_receipt) ? false : followers.auto_enroll_is_receipt;
pro_order.demo = "";
pro_order.customize_data = "";
try
{
if (!isStrNull(pro_order.order_no))
{
_db.pro_order.Add(pro_order);
_db.SaveChanges();
// 報名品項(最近一次訂單內容)
if (latestOrder != null)
{
var last_order_details = _db.pro_order_detail.Where(o => o.order_no == latestOrder.order_no).ToList();
foreach (var last_order_detail in last_order_details)
{
Model.pro_order_detail order_detail = new Model.pro_order_detail();
order_detail.order_no = pro_order.order_no;
order_detail.actItem = last_order_detail.actItem;
order_detail.parent_num = last_order_detail.parent_num;
order_detail.print_id = last_order_detail.print_id;
order_detail.f_num = last_order_detail.f_num;
order_detail.f_num_tablet = last_order_detail.f_num_tablet;
order_detail.address = last_order_detail.address;
order_detail.from_id = last_order_detail.from_id;
order_detail.from_id_tablet = last_order_detail.from_id_tablet;
order_detail.bed_type = last_order_detail.bed_type;
order_detail.qty = last_order_detail.qty;
order_detail.price = last_order_detail.price;
order_detail.start_date = DateTime.Today;
order_detail.pay = last_order_detail.pay;
order_detail.bed_type = last_order_detail.bed_type;
order_detail.keyin1 = last_order_detail.keyin1;
order_detail.demo = last_order_detail.demo;
order_detail.customize_data = last_order_detail.customize_data;
order_detail.printed_files = last_order_detail.printed_files;
order_detail.UpdateTime = DateTime.Now;
_db.pro_order_detail.Add(order_detail);
}
}
_db.SaveChanges();
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.Insert, pro_order.order_no);
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
}
}
// 如果啟用 search_keywords 功能,生成並更新 search_keywords
if (GlobalVariables.UseSearchKeywords)
{
File diff suppressed because it is too large Load Diff
-104
View File
@@ -1,104 +0,0 @@
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);
}
}
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
-601
View File
@@ -1,601 +0,0 @@
/*!
* 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
-598
View File
@@ -1,598 +0,0 @@
/*!
* 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
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
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
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
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
-6
View File
@@ -1,6 +0,0 @@
.floating-box{
position:fixed;
width:260px;
z-index:9999;
max-height:calc(100vh-100px);
}
-61
View File
@@ -1,61 +0,0 @@
/* 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;
-250
View File
@@ -1,250 +0,0 @@
: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
}
-384
View File
@@ -1,384 +0,0 @@
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>
-43
View File
@@ -1,43 +0,0 @@
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.
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

-503
View File
@@ -1,503 +0,0 @@
<!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 &quot;a&quot;">
</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&apos;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>
File diff suppressed because it is too large Load Diff
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
-863
View File
@@ -1,863 +0,0 @@
/*!
* 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
View File
@@ -1,439 +0,0 @@
/*!
* 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
-76
View File
@@ -1,76 +0,0 @@
{
"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": []
}
-13
View File
@@ -1,13 +0,0 @@
<%@ 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>

Some files were not shown because too many files have changed in this diff Show More