2021-01-03

This commit is contained in:
Steve 2025-01-05 17:24:37 +00:00
commit 18468be006
68 changed files with 19143 additions and 0 deletions

View File

@ -0,0 +1,22 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.30110.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "SharePrices", "SharePrices\SharePrices.vbproj", "{AB459D42-2246-47E4-8F1B-F8325E8B780A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{AB459D42-2246-47E4-8F1B-F8325E8B780A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AB459D42-2246-47E4-8F1B-F8325E8B780A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AB459D42-2246-47E4-8F1B-F8325E8B780A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AB459D42-2246-47E4-8F1B-F8325E8B780A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

Binary file not shown.

View File

@ -0,0 +1,216 @@
Imports System.Diagnostics
Imports System.Data
Imports System.Data.SqlClient
Imports SharePrices.SharePricesUtils
Public Class DataAccessLayer
Public Class PriceData
Public DT As Int64
Public Open As Double
Public High As Double
Public Low As Double
Public Close As Double
Public Volume As Int64
End Class
Public Shared Function GetInstruments() As String
Dim c As SqlCommand = GetSQLCommand("usp_GetInstruments")
Dim Instruments As String = DataReaderToJSONString(c.ExecuteReader())
c = GetSQLCommand("usp_GetHoldings")
Dim Holdings As String = DataReaderToJSONString(c.ExecuteReader())
c = GetSQLCommand("usp_GetHoldingsHistory")
Dim HoldingsHistory As String = DataReaderToJSONString(c.ExecuteReader())
c = GetSQLCommand("usp_GetAccounts")
Dim Accounts As String = DataReaderToJSONString(c.ExecuteReader())
GetInstruments = "{""Instruments"": " + Instruments + ", ""Holdings"": " + Holdings + ", ""HoldingsHistory"": " + HoldingsHistory + ", ""Accounts"": " + Accounts + "}"
DisposeSQLCommand(c)
End Function
Public Shared Function AddInstrument(Symbol As String, FullName As String) As String
Dim c As SqlCommand = GetSQLCommand("usp_InsertInstrument")
c.Parameters.AddWithValue("Symbol", Symbol)
c.Parameters.AddWithValue("FullName", FullName)
AddInstrument = DataReaderToJSONString(c.ExecuteReader())
DisposeSQLCommand(c)
End Function
Public Shared Function AddHolding(AccountName As String, Symbol As String, NoUnits As Integer, PurchasePricePerUnit As Double, PurchaseDate As Int64) As String
Dim c As SqlCommand = GetSQLCommand("usp_InsertHolding")
c.Parameters.AddWithValue("Account", AccountName)
c.Parameters.AddWithValue("Symbol", Symbol)
c.Parameters.AddWithValue("NoUnits", NoUnits)
c.Parameters.AddWithValue("PurchasePricePerUnit", PurchasePricePerUnit)
c.Parameters.AddWithValue("PurchaseDate", FromEpochTime(PurchaseDate))
AddHolding = DataReaderToJSONString(c.ExecuteReader())
DisposeSQLCommand(c)
End Function
Public Shared Function GetDailyData(Symbol As String, StartDate As DateTime, EndDate As DateTime) As String
Dim c As SqlCommand = GetSQLCommand("usp_GetDailyData")
c.Parameters.AddWithValue("Symbol", Symbol)
c.Parameters.AddWithValue("StartDate", StartDate)
c.Parameters.AddWithValue("EndDate", EndDate)
GetDailyData = DataReaderToJSONString(c.ExecuteReader())
DisposeSQLCommand(c)
End Function
Public Shared Function GetAllDailyData(StartDate As DateTime, EndDate As DateTime) As String
Dim result As String = ""
Dim s As SqlCommand = GetSQLCommand("usp_GetInstruments")
Dim r As SqlDataReader = s.ExecuteReader
While r.Read
result += ",{ ""Symbol"": """ + r("Symbol") + """, ""DailyData"": "
Dim c As SqlCommand = GetSQLCommand("usp_GetDailyData")
c.Parameters.AddWithValue("Symbol", r("Symbol"))
c.Parameters.AddWithValue("StartDate", StartDate)
c.Parameters.AddWithValue("EndDate", EndDate)
Dim dd As String = DataReaderToJSONString(c.ExecuteReader())
If dd = "" Then dd = "[]"
result += dd + "}"
DisposeSQLCommand(c)
End While
DisposeSQLCommand(s)
result = "[" + result.Substring(1) + "]"
Return result
End Function
Public Shared Function GetIntradayData(Symbol As String, StartDate As DateTime, EndDate As DateTime) As String
Dim c As SqlCommand = GetSQLCommand("usp_GetIntradayData")
c.Parameters.AddWithValue("Symbol", Symbol)
c.Parameters.AddWithValue("StartDate", StartDate)
c.Parameters.AddWithValue("EndDate", EndDate)
GetIntradayData = DataReaderToJSONString(c.ExecuteReader())
DisposeSQLCommand(c)
End Function
Public Shared Function GetAllIntradayData(StartDate As DateTime, EndDate As DateTime) As String
Dim result As String = ""
Dim s As SqlCommand = GetSQLCommand("usp_GetInstruments")
Dim r As SqlDataReader = s.ExecuteReader
While r.Read
result += ",{ ""Symbol"": """ + r("Symbol") + """, ""IntradayData"": "
Dim c As SqlCommand = GetSQLCommand("usp_GetIntradayData")
c.Parameters.AddWithValue("Symbol", r("Symbol"))
c.Parameters.AddWithValue("StartDate", StartDate)
c.Parameters.AddWithValue("EndDate", EndDate)
Dim id As String = DataReaderToJSONString(c.ExecuteReader())
If id = "" Then id = "[]"
result += id + "}"
DisposeSQLCommand(c)
End While
DisposeSQLCommand(s)
result = "[" + result.Substring(1) + "]"
Return result
End Function
Public Shared Function InsertDailyData(Symbol As String, DailyPrices As List(Of PriceData)) As String
Dim dt As New DataTable("DailyPrices")
dt.Columns.Add(New DataColumn("PriceDT", System.Type.GetType("System.DateTime")))
dt.Columns.Add(New DataColumn("OpenPrice", System.Type.GetType("System.Double")))
dt.Columns.Add(New DataColumn("HighPrice", System.Type.GetType("System.Double")))
dt.Columns.Add(New DataColumn("LowPrice", System.Type.GetType("System.Double")))
dt.Columns.Add(New DataColumn("ClosePrice", System.Type.GetType("System.Double")))
dt.Columns.Add(New DataColumn("Volume", System.Type.GetType("System.Int64")))
For Each p As PriceData In DailyPrices
Dim d As DateTime = FromEpochTime(p.DT)
If d < New DateTime(1980, 1, 1) Or d > Now() Then
Debug.Print("Bad date: " + d)
Else
dt.Rows.Add(FromEpochTime(p.DT), p.Open, p.High, p.Low, p.Close, p.Volume)
End If
Next
Dim c As SqlCommand = GetSQLCommand("usp_InsertDailyData")
c.Parameters.AddWithValue("Symbol", Symbol)
c.Parameters.AddWithValue("PriceData", dt)
Try
InsertDailyData = DataReaderToJSONString(c.ExecuteReader())
Catch ex As Exception
InsertDailyData = "{""ErrorMSG"":'" + ex.ToString + "'}"
End Try
DisposeSQLCommand(c)
End Function
Public Shared Function InsertIntradayData(Symbol As String, DailyPrices As List(Of PriceData)) As String
Dim dt As New DataTable("IntradayPrices")
dt.Columns.Add(New DataColumn("PriceDT", System.Type.GetType("System.DateTime")))
dt.Columns.Add(New DataColumn("OpenPrice", System.Type.GetType("System.Double")))
dt.Columns.Add(New DataColumn("HighPrice", System.Type.GetType("System.Double")))
dt.Columns.Add(New DataColumn("LowPrice", System.Type.GetType("System.Double")))
dt.Columns.Add(New DataColumn("ClosePrice", System.Type.GetType("System.Double")))
dt.Columns.Add(New DataColumn("Volume", System.Type.GetType("System.Int64")))
For Each p As PriceData In DailyPrices
Dim d As DateTime = FromEpochTime(p.DT)
If d < New DateTime(1980, 1, 1) Or d > Now() Then
Debug.Print("Bad date: " + d)
Else
dt.Rows.Add(FromEpochTime(p.DT), p.Open, p.High, p.Low, p.Close, p.Volume)
End If
Next
Dim c As SqlCommand = GetSQLCommand("usp_InsertIntradayData")
c.Parameters.AddWithValue("Symbol", Symbol)
c.Parameters.AddWithValue("PriceData", dt)
Try
InsertIntradayData = DataReaderToJSONString(c.ExecuteReader())
Catch ex As Exception
InsertIntradayData = "{""ErrorMSG"":'" + ex.ToString + "'}"
End Try
DisposeSQLCommand(c)
End Function
Public Shared Function DeleteHolding(HoldingID) As String
Dim c As SqlCommand = GetSQLCommand("usp_DeleteHolding")
c.Parameters.AddWithValue("HoldingID", HoldingID)
DeleteHolding = DataReaderToJSONString(c.ExecuteReader())
DisposeSQLCommand(c)
End Function
Private Shared Function GetSQLConnection() As SqlConnection
Dim c As New SqlConnection("Server=OZHOST1\SQL2008;Database=SharePrices;Trusted_Connection=True;Application Name=Share Prices Web;")
c.Open()
Return c
End Function
Private Shared Function GetSQLCommand(StoredProcedureName As String) As SqlCommand
Dim c As New SqlCommand(StoredProcedureName, GetSQLConnection())
c.CommandType = Data.CommandType.StoredProcedure
Return c
End Function
Private Shared Sub DisposeSQLCommand(c As SqlCommand)
c.Connection.Close()
c.Connection.Dispose()
c.Dispose()
End Sub
Private Shared Function DataReaderToJSONString(dr As SqlDataReader) As String
Dim fieldNo As Integer
Dim noRows As Integer = 0
Dim result As String = ""
Dim thisRow As String
While dr.Read
noRows += 1
thisRow = ""
For fieldNo = 0 To dr.FieldCount - 1
'Debug.Print(" Field " + fieldNo.ToString + "(" + dr.GetName(fieldNo) + "): " + dr.GetDataTypeName(fieldNo))
thisRow += ",""" + dr.GetName(fieldNo) + """:"
If IsDBNull(dr(fieldNo)) Then
thisRow += "null"
Else
Select Case dr.GetDataTypeName(fieldNo).ToUpper
Case "CHAR", "VARCHAR" : thisRow += """" + dr(fieldNo) + """"
Case "DATETIME", "SMALLDATETIME", "DATETIME2", "DATE" : thisRow += ToEpochTime(dr(fieldNo)).ToString()
Case Else : thisRow += dr(fieldNo).ToString()
End Select
End If
Next
result += "," + "{" + thisRow.Substring(1) + "}"
End While
If result <> "" Then result = result.Substring(1)
If noRows > 1 Then result = "[" + result + "]"
'Debug.Print("Result: " + result)
Return result
End Function
End Class

View File

@ -0,0 +1,40 @@
Imports System.Diagnostics
Public Class SharePricesUtils
Private Shared JavascriptEpochTimeBase As New Date(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)
Public Shared Function ToEpochTime(DT As Date) As Long
Return (DT - JavascriptEpochTimeBase).TotalMilliseconds
End Function
Public Shared Function FromEpochTime(DT As Long) As Date
Return JavascriptEpochTimeBase.AddMilliseconds(DT)
End Function
Public Shared Sub SetResponseAndCompleteRequest(CurrentRequest As HttpContext, ContentType As String, ResponseText As String)
'System.Diagnostics.Debug.Print("ReponseText: " + ResponseText)
With CurrentRequest
.Response.Clear()
.Response.ContentType = ContentType
.Response.Write(ResponseText)
.Response.Flush()
.Response.SuppressContent = True
.ApplicationInstance.CompleteRequest()
End With
End Sub
Public Shared Sub SetResponseAndCompleteRequest(CurrentRequest As HttpContext, ContentType As String, BinaryResponse() As Byte)
Try
With CurrentRequest
.Response.Clear()
.Response.ContentType = ContentType
.Response.BinaryWrite(BinaryResponse)
.Response.Flush()
.Response.SuppressContent = True
.ApplicationInstance.CompleteRequest()
End With
Catch ex As Exception
Debug.Print("SetResponseAndCompleteRequest (binary) error: " + ex.ToString())
End Try
End Sub
End Class

View File

@ -0,0 +1,649 @@
USE SharePrices
GO
/*
DROP VIEW vHolding
DROP PROCEDURE usp_GetHoldingsHistory
DROP PROCEDURE usp_DeleteHolding
DROP PROCEDURE usp_GetAccounts
DROP PROCEDURE usp_GetHoldings
DROP PROCEDURE usp_InsertHolding
DROP PROCEDURE usp_InsertIntradayData
DROP PROCEDURE usp_InsertDailyData
DROP PROCEDURE usp_GetDailyData
DROP PROCEDURE usp_GetIntradayData
DROP PROCEDURE usp_InsertInstrument
DROP PROCEDURE usp_GetInstruments
DROP TYPE PriceDataType
DROP TABLE Holding
DROP TABLE Account
DROP TABLE InstrumentHistory_Daily
DROP TABLE InstrumentHistory_Intraday
DROP TABLE Instrument
--DROP TABLE Exchange
*/
GO
/*
CREATE LOGIN [OZDOMAIN\SharePrices_WebApp] FROM WINDOWS
CREATE USER [OZDOMAIN\SharePrices_WebApp] FOR LOGIN [OZDOMAIN\SharePrices_WebApp]
CREATE ROLE WebApp_Role
EXEC sp_addrolemember 'WebApp_Role', 'OZDOMAIN\SharePrices_WebApp'
*/
/*
CREATE TABLE Exchange (
ExchangeID tinyint IDENTITY NOT NULL,
ShortName varchar(10) NOT NULL,
FullName varchar(50) NULL,
CONSTRAINT PK_Exchange PRIMARY KEY CLUSTERED (ExchangeID)
)
GO
INSERT Exchange (ShortName, FullName)
VALUES ('N/A', 'N/A'),
('ASX', 'Australian Stock Exchange'),
('LSE', 'London Stock Exchange'),
('NYSE', 'New York Stock Exchange'),
('NASDAQ', 'NASDAQ')
GO
*/
CREATE TABLE Instrument (
InstrumentID smallint IDENTITY NOT NULL,
--ExchangeID tinyint NOT NULL,
Symbol VARCHAR(8) NOT NULL,
FullName VARCHAR(100) NULL,
DisplayOrder TINYINT NULL,
CONSTRAINT PK_Instrument PRIMARY KEY CLUSTERED (InstrumentID),
--CONSTRAINT FK_Instrument_Exchange FOREIGN KEY (ExchangeID) REFERENCES Exchange (ExchangeID)
)
GO
--CREATE NONCLUSTERED INDEX IDX_Instrument_ExchangeID_Symbol ON Instrument (ExchangeID, Symbol)
CREATE NONCLUSTERED INDEX IDX_Instrument_Symbol ON Instrument (Symbol)
CREATE NONCLUSTERED INDEX IDX_Instrument_DisplayOrder ON Instrument (DisplayOrder)
GO
CREATE TABLE InstrumentHistory_Daily (
InstrumentID smallint NOT NULL,
HistoryDT date NOT NULL,
OpenPrice money NULL,
HighPrice money NULL,
LowPrice money NULL,
ClosePrice money NULL,
Volume bigint NULL,
CONSTRAINT PK_InstrumentHistory_Daily PRIMARY KEY CLUSTERED (InstrumentID, HistoryDT),
CONSTRAINT FK_InstrumentHistory_Daily_Instrument FOREIGN KEY (InstrumentID) REFERENCES Instrument (InstrumentID)
)
GO
CREATE TABLE InstrumentHistory_Intraday (
InstrumentID smallint NOT NULL,
HistoryDT smalldatetime NOT NULL,
OpenPrice money NULL,
HighPrice money NULL,
LowPrice money NULL,
ClosePrice money NULL,
Volume bigint NULL,
CONSTRAINT PK_InstrumentHistory_Intraday PRIMARY KEY CLUSTERED (InstrumentID, HistoryDT),
CONSTRAINT FK_InstrumentHistory_Intraday_Instrument FOREIGN KEY (InstrumentID) REFERENCES Instrument (InstrumentID)
)
GO
CREATE TABLE Account (
AccountID tinyint IDENTITY NOT NULL,
ShortName varchar(20) NOT NULL,
CONSTRAINT PK_Account PRIMARY KEY CLUSTERED (AccountID),
CONSTRAINT UC_Account_ShortName UNIQUE NONCLUSTERED (ShortName)
)
GO
INSERT Account (ShortName) VALUES
('Steve HL ISA'),
('Steve HL Trd'),
('Steph HL Trd'),
('Steph ii ISA'),
('Steph ii Trd'),
('Steve ii Trd'),
('Steve AJB'),
('Steph AJB')
GO
CREATE TABLE Holding (
HoldingID int IDENTITY NOT NULL,
AccountID tinyint NOT NULL,
InstrumentID smallint NOT NULL,
NoUnits int NOT NULL,
PurchasePricePerUnit money NOT NULL,
PurchaseDate datetime NOT NULL,
SoldDate datetime NULL,
CONSTRAINT PK_Holding PRIMARY KEY CLUSTERED (HoldingID),
CONSTRAINT FK_Holding_Account FOREIGN KEY (AccountID) REFERENCES Account (AccountID),
CONSTRAINT FK_Holding_Instrument FOREIGN KEY (InstrumentID) REFERENCES Instrument (InstrumentID)
)
GO
CREATE TYPE PriceDataType
AS TABLE (
PriceDT datetime NOT NULL,
OpenPrice money NULL,
HighPrice money NULL,
LowPrice money NULL,
ClosePrice money NULL,
Volume bigint NULL
)
GO
GRANT EXECUTE ON TYPE::PriceDataType TO WebApp_Role
GO
--CREATE PROCEDURE usp_InsertInstrument (@ExchangeShortName varchar(10), @Symbol varchar(7), @FullName varchar(100))
CREATE PROCEDURE usp_InsertInstrument (@Symbol varchar(8), @FullName varchar(100))
AS
BEGIN
SET NOCOUNT ON
DECLARE @DisplayOrder tinyint
IF NOT EXISTS (SELECT NULL FROM Instrument WHERE Symbol = @Symbol)
BEGIN
SELECT @DisplayOrder = MAX(DisplayOrder)+1 FROM Instrument
SELECT @DisplayOrder = ISNULL(@DisplayOrder, 1)
--INSERT Instrument (ExchangeID, Symbol, FullName, DisplayOrder) SELECT @ExchangeID, @Symbol, @FullName, @DisplayOrder WHERE NOT EXISTS (SELECT NULL FROM Instrument WHERE ExchangeID = @ExchangeID AND Symbol = @Symbol)
INSERT Instrument (Symbol, FullName, DisplayOrder) SELECT @Symbol, @FullName, @DisplayOrder
SELECT
i.DisplayOrder,
i.FullName as [InstrumentName],
i.Symbol as [Symbol],
CONVERT(DATETIME, '2030-12-31') as [MinDailyDate],
CONVERT(DATETIME, '1970-01-01') as [MaxDailyDate],
CONVERT(DATETIME, '2030-12-31') as [MinIntradayDate],
CONVERT(DATETIME, '1970-01-01') as [MaxIntradayDate]
FROM
Instrument i
WHERE
Symbol = @Symbol
END
END
GO
GRANT EXECUTE ON usp_InsertInstrument TO WebApp_Role
GO
EXEC usp_InsertInstrument '^AXJO', 'S&P ASX 200'
EXEC usp_InsertInstrument 'QAN.AX', 'Qantas'
EXEC usp_InsertInstrument 'WEB.AX', 'Webjet'
EXEC usp_InsertInstrument 'WBC.AX', 'Westpac'
EXEC usp_InsertInstrument 'CBA.AX', 'Commonwealth Bank'
EXEC usp_InsertInstrument 'FLT.AX', 'Flight Centre'
EXEC usp_InsertInstrument '^FTSE', 'FTSE 100'
EXEC usp_InsertInstrument '^FTAS', 'FTSE All-Share'
EXEC usp_InsertInstrument 'TMPL.L', 'Temple Bar Investment Trust'
EXEC usp_InsertInstrument 'SDV.L', 'Cherverton Investment Trust'
EXEC usp_InsertInstrument 'MKS.L', 'Marks & Spencer'
EXEC usp_InsertInstrument 'BP.L', 'BP'
EXEC usp_InsertInstrument 'RDSB.L', 'Royal Dutch Shell'
EXEC usp_InsertInstrument 'LLOY.L', 'Lloyds Bank'
EXEC usp_InsertInstrument 'BARC.L', 'Barclays Bank'
EXEC usp_InsertInstrument 'AML.L', 'Aston Martin Lagonda'
EXEC usp_InsertInstrument 'TUI.L', 'TUI'
EXEC usp_InsertInstrument 'RR.L', 'Rolls Royce'
EXEC usp_InsertInstrument 'IAG.L', 'International Consolidated Airlines'
EXEC usp_InsertInstrument 'CCL.L', 'Carnival Cruises (LSE)'
EXEC usp_InsertInstrument '^GSPC', 'S&P 500'
EXEC usp_InsertInstrument '^DJI', 'Dow Jones Industrial Average'
EXEC usp_InsertInstrument '^IXIC', 'NASDAQ Composite'
EXEC usp_InsertInstrument 'CCL', 'Carnival Cruises (NYSE)'
EXEC usp_InsertInstrument 'RCL', 'Royal Caribbean Cruises'
EXEC usp_InsertInstrument 'NCLH', 'Norwegian Cruise Line Holdings'
EXEC usp_InsertInstrument 'AAL', 'American Airlines'
EXEC usp_InsertInstrument 'EBAY', 'E-bay'
--EXEC usp_InsertInstrument 'AMZN', 'Amazon'
EXEC usp_InsertInstrument 'GBPUSD=X', 'GBP/USD'
EXEC usp_InsertInstrument 'GBPAUD=X', 'GBP/AUD'
GO
/*
delete InstrumentHistory_Intraday where InstrumentID>31
delete InstrumentHistory_Daily where InstrumentID>31
delete Instrument where InstrumentID>31
*/
CREATE PROCEDURE usp_GetAccounts
AS
BEGIN
SET NOCOUNT ON
SELECT
ShortName as [AccountName]
FROM
Account
ORDER BY
ShortName
END
GO
GRANT EXECUTE ON usp_GetAccounts TO WebApp_Role
GO
CREATE PROCEDURE usp_GetInstruments
AS
BEGIN
SET NOCOUNT ON
SELECT
i.DisplayOrder,
--e.ShortName as [Exchange],
i.FullName as [InstrumentName],
i.Symbol as [Symbol],
ISNULL((SELECT MIN(dd.HistoryDT) FROM InstrumentHistory_Daily dd WHERE dd.InstrumentID = i.InstrumentID), CONVERT(DATETIME, '2030-12-31')) as [MinDailyDate],
ISNULL((SELECT MAX(dd.HistoryDT) FROM InstrumentHistory_Daily dd WHERE dd.InstrumentID = i.InstrumentID), CONVERT(DATETIME, '1970-01-01')) as [MaxDailyDate],
ISNULL((SELECT MIN(id.HistoryDT) FROM InstrumentHistory_Intraday id WHERE id.InstrumentID = i.InstrumentID), CONVERT(DATETIME, '2030-12-31')) as [MinIntradayDate],
ISNULL((SELECT MAX(id.HistoryDT) FROM InstrumentHistory_Intraday id WHERE id.InstrumentID = i.InstrumentID), CONVERT(DATETIME, '1970-01-01')) as [MaxIntradayDate]
FROM
Instrument i
/*INNER JOIN Exchange e
ON e.ExchangeID = i.ExchangeID*/
ORDER BY
i.DisplayOrder
END
GO
GRANT EXECUTE ON usp_GetInstruments TO WebApp_Role
GO
CREATE PROCEDURE usp_GetDailyData (@Symbol varchar(8), @StartDate datetime, @EndDate datetime)
AS
BEGIN
SELECT
h.HistoryDT as [DT],
h.OpenPrice as [open],
h.HighPrice as [high],
h.LowPrice as [low],
h.ClosePrice as [close],
h.Volume as [volume]
FROM
Instrument i
INNER JOIN InstrumentHistory_Daily h
ON h.InstrumentID = i.InstrumentID
WHERE
i.Symbol = @Symbol
AND h.HistoryDT >= @StartDate
AND h.HistoryDT <= @EndDate
ORDER BY
h.HistoryDT
END
GO
GRANT EXECUTE ON usp_GetDailyData TO WebApp_Role
GO
CREATE PROCEDURE usp_GetIntradayData (@Symbol varchar(8), @StartDate datetime, @EndDate datetime)
AS
BEGIN
DECLARE @MAX_DAYS INT = 90
IF DATEDIFF(dd, @StartDate, @EndDate) > @MAX_DAYS
BEGIN
SET @StartDate = DATEADD(dd, 0-@MAX_DAYS, @EndDate)
END
SELECT
h.HistoryDT as [DT],
h.OpenPrice as [open],
h.HighPrice as [high],
h.LowPrice as [low],
h.ClosePrice as [close],
h.Volume as [volume]
FROM
Instrument i
INNER LOOP JOIN InstrumentHistory_Intraday h
ON h.InstrumentID = i.InstrumentID
WHERE
i.Symbol = @Symbol
AND h.HistoryDT >= @StartDate
AND h.HistoryDT <= @EndDate
ORDER BY
h.HistoryDT
END
GO
GRANT EXECUTE ON usp_GetIntradayData TO WebApp_Role
GO
CREATE PROCEDURE usp_InsertDailyData (@Symbol varchar(8), @PriceData PriceDataType READONLY)
AS
BEGIN
SET NOCOUNT ON
DECLARE @InstrumentID int
DECLARE @NoUpdated int
DECLARE @NoInserted int
SELECT @InstrumentID = InstrumentID FROM Instrument WHERE Symbol = @Symbol
IF @InstrumentID IS NOT NULL
BEGIN
UPDATE
h
SET
OpenPrice = d.OpenPrice,
HighPrice = d.HighPrice,
LowPrice = d.LowPrice,
ClosePrice = d.ClosePrice,
Volume = d.Volume
FROM
@PriceData d
INNER JOIN InstrumentHistory_Daily h
ON h.InstrumentID = @InstrumentID
AND h.HistoryDT = CONVERT(date, d.PriceDT)
SET @NoUpdated = @@ROWCOUNT
INSERT InstrumentHistory_Daily (
InstrumentID,
HistoryDT,
OpenPrice,
HighPrice,
LowPrice,
ClosePrice,
Volume)
SELECT
@InstrumentID,
CONVERT(date, PriceDT),
OpenPrice,
HighPrice,
LowPrice,
ClosePrice,
Volume
FROM
@PriceData d
WHERE
NOT EXISTS (SELECT NULL FROM InstrumentHistory_Daily h WHERE h.InstrumentID = @InstrumentID AND h.HistoryDT = CONVERT(date, d.PriceDT))
SET @NoInserted = @@ROWCOUNT
SELECT @NoInserted as [NoInserted], @NoUpdated as [NoUpdated]
END
ELSE
BEGIN
SELECT CONVERT(int, 0) as [NoInserted], CONVERT(int, 0) as [NoUpdated]
END
END
GO
GRANT EXECUTE ON usp_InsertDailyData TO WebApp_Role
GO
CREATE PROCEDURE usp_InsertIntradayData (@Symbol varchar(8), @PriceData PriceDataType READONLY)
AS
BEGIN
SET NOCOUNT ON
DECLARE @InstrumentID int
DECLARE @NoUpdated int
DECLARE @NoInserted int
SELECT @InstrumentID = InstrumentID FROM Instrument WHERE Symbol = @Symbol
IF @InstrumentID IS NOT NULL
BEGIN
UPDATE
h
SET
OpenPrice = d.OpenPrice,
HighPrice = d.HighPrice,
LowPrice = d.LowPrice,
ClosePrice = d.ClosePrice,
Volume = d.Volume
FROM
@PriceData d
INNER JOIN InstrumentHistory_Intraday h
ON h.InstrumentID = @InstrumentID
AND h.HistoryDT = d.PriceDT
SET @NoUpdated = @@ROWCOUNT
INSERT InstrumentHistory_Intraday (
InstrumentID,
HistoryDT,
OpenPrice,
HighPrice,
LowPrice,
ClosePrice,
Volume)
SELECT
@InstrumentID,
PriceDT,
OpenPrice,
HighPrice,
LowPrice,
ClosePrice,
Volume
FROM
@PriceData d
WHERE
NOT EXISTS (SELECT NULL FROM InstrumentHistory_Intraday h WHERE h.InstrumentID = @InstrumentID AND h.HistoryDT = d.PriceDT)
SET @NoInserted = @@ROWCOUNT
SELECT @NoInserted as [NoInserted], @NoUpdated as [NoUpdated]
END
ELSE
BEGIN
SELECT CONVERT(int, 0) as [NoInserted], CONVERT(int, 0) as [NoUpdated]
END
END
GO
GRANT EXECUTE ON usp_InsertIntradayData TO WebApp_Role
GO
CREATE PROCEDURE usp_InsertHolding (@Account varchar(20), @Symbol varchar(8), @NoUnits int, @PurchasePricePerUnit money, @PurchaseDate datetime, @Solddate datetime = NULL)
AS
BEGIN
DECLARE @AccountID tinyint
DECLARE @InstrumentID smallint
SELECT @AccountID = AccountID FROM Account WHERE ShortName = @Account
SELECT @InstrumentID = InstrumentID FROM Instrument WHERE Symbol = @Symbol
INSERT Holding (
AccountID,
InstrumentID,
NoUnits,
PurchasePricePerUnit,
PurchaseDate,
SoldDate)
SELECT
@AccountID,
@InstrumentID,
@NoUnits,
@PurchasePricePerUnit,
@PurchaseDate,
@SoldDate
SELECT
h.HoldingID,
a.ShortName as [AccountName],
i.Symbol,
h.PurchaseDate,
h.NoUnits,
h.PurchasePricePerUnit,
h.SoldDate
FROM
Holding h
INNER JOIN Instrument i
ON i.InstrumentID = h.InstrumentID
INNER JOIN Account a
ON a.AccountID = h.AccountID
WHERE
h.HoldingID = @@IDENTITY
END
GO
GRANT EXECUTE ON usp_InsertHolding TO WebApp_Role
GO
-- EXEC usp_InsertHolding 'Steve ii Trd', 'QAN.AX', 15700, 3.63, '2020-04-28', '2020-06-12'
-- EXEC usp_InsertHolding 'Steve ii Trd', 'WEB.AX', 17000, 2.55, '2020-04-28', '2020-06-12'
-- EXEC usp_InsertHolding 'Steve ii Trd', 'WBC.AX', 2240, 15.07, '2020-05-13', '2020-06-12'
-- EXEC usp_InsertHolding 'Steve ii Trd', 'FLT.AX', 3500, 13.813, '2020-06-03', '2020-06-12'
-- EXEC usp_InsertHolding 'Steve ii Trd', 'WEB.AX', 20618, 3.0359, '2020-07-22 05:37', NULL
-- EXEC usp_InsertHolding 'Steph ii Trd', 'CBA.AX', 580, 59.00, '2020-05-13', '2020-06-12'
-- EXEC usp_InsertHolding 'Steph ii Trd', 'NCLH', 2580, 19.037, '2020-07-21 11:55', NULL
-- EXEC usp_InsertHolding 'Steph ii Trd', 'NCLH', 2580, 15.1690, '2020-07-21 11:55', NULL
-- EXEC usp_InsertHolding 'Steph ii Trd', 'RCL', 1071, 53.7053, '2020-07-21 12:01', NULL
-- EXEC usp_InsertHolding 'Steph ii Trd', 'RCL', 1078, 53.192, '2020-07-21 12:18', NULL
-- EXEC usp_InsertHolding 'Steph ii ISA', 'AAL', 2170, 11.5245, '2020-07-21 12:13', NULL
-- EXEC usp_InsertHolding 'Steph ii ISA', 'FLT.AX', 2705, 11.63, '2020-08-20 01:10', NULL
EXEC usp_InsertHolding 'Steve AJB', 'TMPL.L', 5623, 708, '2020-05-13'
EXEC usp_InsertHolding 'Steve AJB', 'MKS.L', 33546, 89, '2020-05-11'
-- EXEC usp_InsertHolding 'Steve AJB', 'CCL', 2334, 17.44, '2020-06-03', '2020-06-11'
EXEC usp_InsertHolding 'Steph AJB', 'TMPL.L', 2372, 708, '2020-05-13'
-- EXEC usp_InsertHolding 'Steph AJB', 'SDV.L', 2000, 127, '2020-05-17', '2020-06-12'
EXEC usp_InsertHolding 'Steph AJB', 'BP.L', 5787, 311, '2020-05-13'
EXEC usp_InsertHolding 'Steph AJB', 'RDSB.L', 1897, 1264.88, '2020-05-11'
EXEC usp_InsertHolding 'Steph AJB', 'LLOY.L', 59170, 30.42, '2020-05-11'
EXEC usp_InsertHolding 'Steph AJB', 'BARC.L', 17261, 104.28, '2020-05-11'
-- EXEC usp_InsertHolding 'Steph ii ISA', 'RCL', 1050, 54.15 , '2020-05-27', '2020-06-11'
-- EXEC usp_InsertHolding 'Steph ii Trd', 'NCLH', 2650, 17.8, '2020-05-27', '2020-06-11'
-- EXEC usp_InsertHolding 'Steph ii Trd', 'AML.L', 9985, 67.1, '2020-06-04', '2020-06-12'
-- EXEC usp_InsertHolding 'Steve HL ISA', 'NCLH', 3053, 17.27, '2020-05-27', '2020-06-11'
-- EXEC usp_InsertHolding 'Steve HL ISA', 'NCLH', 3053, 17.27, '2020-05-17', '2020-06-24 18:24'
-- EXEC usp_InsertHolding 'Steve HL ISA', 'CCL', 2667, 15.451, '2020-07-21 17:10', NULL
-- EXEC usp_InsertHolding 'Steve HL Trd', 'AAL', 2994, 12.35, '2020-05-27', '2020-06-11'
EXEC usp_InsertHolding 'Steph HL Trd', 'IAG.L', 6644, 325.1, '2020-06-05'
EXEC usp_InsertHolding 'Steve HL Trd', 'TUI.L', 4010, 490.93, '2020-06-05'
-- EXEC usp_InsertHolding 'Steph HL Trd', 'EBAY', 949, 39.35, '2020-04-29', '2020-06-11'
-- EXEC usp_InsertHolding 'Steph HL Trd', 'NCLH', 1696, 21.72, '2020-06-10', '2020-06-11'
-- EXEC usp_InsertHolding 'Steph HL Trd', 'AMZN', 15, 2375.18, '2020-04-29', '2020-06-05'
EXEC usp_InsertHolding 'Steph HL Trd', 'RR.L', 5783, 335.08, '2020-06-05'
EXEC usp_InsertHolding 'Steph HL Trd', 'RR.L', 19276, 32.00, '2020-11-09'
EXEC usp_InsertHolding 'Steve ii Trd', 'MAB.L', 9044, 227.2204, '2020-06-22 10:38', '2020-11-16 09:42'
EXEC usp_InsertHolding 'Steve ii Trd', 'JDW.L', 824, 11.3962, '2020-06-22 10:40', '2020-11-25 12:47'
EXEC usp_InsertHolding 'Steve ii Trd', 'RTN.L', 39894, 0.70936, '2020-06-22 10:34', '2020-12-02 10:50'
EXEC usp_InsertHolding 'Steve ii Trd', 'AML.L', 1078, 1854.724, '2020-12-24 09:22', NULL
EXEC usp_InsertHolding 'Steve ii Trd', 'IAG.L', 10911, 166.3459, '2020-12-24 09:28', NULL
EXEC usp_InsertHolding 'Steve ii Trd', 'CCL.L', 2576, 1203.112, '2020-11-16 12:56', NULL
EXEC usp_InsertHolding 'Steph ii Trd', 'NCLH', 960, 21.1690, '2020-11-18 15:55', NULL
EXEC usp_InsertHolding 'Steph ii Trd', 'NCLH', 40, 21.08, '2020-11-18 15:58', NULL
GO
CREATE VIEW vHolding
AS
SELECT
h.HoldingID,
a.ShortName as [AccountName],
i.Symbol,
i.FullName as [InstrumentName],
h.PurchaseDate,
h.NoUnits,
h.PurchasePricePerUnit,
h.SoldDate
FROM
Holding h
INNER JOIN Instrument i
ON i.InstrumentId = h.InstrumentId
INNER JOIN Account a
ON a.AccountID = h.AccountID
GO
-- select * from vholding where instrumentname like '%caribb%'
-- update holding set solddate = '2020-06-24 18:27' where holdingid = 34
CREATE PROCEDURE usp_GetHoldings
AS
BEGIN
SELECT
h.HoldingID,
a.ShortName as [AccountName],
i.Symbol as [Symbol],
h.PurchaseDate,
h.NoUnits,
h.PurchasePricePerUnit,
h.SoldDate
FROM
Holding h
INNER JOIN Instrument i
ON h.InstrumentID = i.InstrumentID
INNER JOIN Account a
ON a.AccountID = h.AccountID
ORDER BY
i.Symbol,
h.PurchaseDate,
a.ShortName,
h.NoUnits,
h.PurchasePricePerUnit,
h.SoldDate
END
GO
GRANT EXECUTE ON usp_GetHoldings TO WebApp_Role
GO
CREATE PROCEDURE usp_GetHoldingsHistory
AS
BEGIN
DECLARE @Dates TABLE (InstrumentID int, DT datetime)
INSERT @Dates
SELECT
InstrumentID,
PurchaseDate as [DT]
FROM
Holding
UNION
SELECT
InstrumentID,
SoldDate as [DT]
FROM
Holding
WHERE
SoldDate IS NOT NULL
ORDER BY
DT
SELECT
i.Symbol,
d.DT,
ISNULL((SELECT SUM(NoUnits) FROM Holding p WHERE p.InstrumentID = d.InstrumentID AND p.PurchaseDate <= d.DT), 0) -
ISNULL((SELECT SUM(NoUnits) FROM Holding s WHERE s.InstrumentID = d.InstrumentID AND s.SoldDate <= d.DT), 0) as [TotalUnits],
ISNULL((SELECT SUM(NoUnits*PurchasePricePerUnit) FROM Holding p WHERE p.InstrumentID = d.InstrumentID AND p.PurchaseDate <= d.DT), 0) -
ISNULL((SELECT SUM(NoUnits*PurchasePricePerUnit) FROM Holding s WHERE s.InstrumentID = d.InstrumentID AND s.SoldDate <= d.DT), 0) as [TotalCost]
FROM
@Dates d
INNER JOIN Instrument i
ON i.InstrumentID = d.InstrumentID
ORDER BY
d.InstrumentID,
d.DT
END
GO
GRANT EXECUTE ON usp_GetHoldingsHistory TO WebApp_Role
GO
CREATE PROCEDURE usp_DeleteHolding (@HoldingID int)
AS
BEGIN
DELETE Holding WHERE HoldingID = @HoldingID
SELECT @@ROWCOUNT AS [RecordsDeleted]
END
GO
GRANT EXECUTE ON usp_DeleteHolding TO WebApp_Role
GO
/*
select * from Instrument
select * from InstrumentHistory_Daily
select * from InstrumentHistory_Intraday
select * from InstrumentHistory_Intraday where InstrumentID = 18 order by HistoryDT desc
--Delete daily prices that are 90% less than previous and next daily prices
DELETE d1
FROM
InstrumentHistory_Daily d1
INNER JOIN InstrumentHistory_Daily p
ON p.InstrumentID = d1.InstrumentID
AND p.HistoryDT = (SELECT MAX(HistoryDT) FROM InstrumentHistory_Daily WHERE InstrumentID = d1.InstrumentID AND HistoryDT < d1.HistoryDT)
INNER JOIN InstrumentHistory_Daily n
ON n.InstrumentID = d1.InstrumentID
AND n.HistoryDT = (SELECT MIN(HistoryDT) FROM InstrumentHistory_Daily WHERE InstrumentID = d1.InstrumentID AND HistoryDT > d1.HistoryDT)
WHERE
p.ClosePrice/d1.ClosePrice > 90
AND n.ClosePrice/d1.ClosePrice > 90
*/

View File

@ -0,0 +1,119 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Flot test</title>
<script src="scripts/jquery-3.5.1.min.js" type="text/javascript"></script>
<script src="scripts/jquery.flot.js" type="text/javascript"></script>
<script src="scripts/jquery.flot.time.min.js" type="text/javascript"></script>
<script src="scripts/FlotGaps.js" type="text/javascript"></script>
</head>
<body>
<div id="chartDiv" style="width:800px; height: 200px;"></div>
<div id="chartDiv2" style="width:800px; height: 200px;"></div>
<script type="text/javascript">
Date.prototype.yyyymmddhhmmss = function () {
var yyyy = this.getFullYear().toString();
var mm = (this.getMonth() + 1).toString(); // getMonth() is zero-based
var dd = this.getDate().toString();
var hh = this.getHours().toString();
var nn = this.getMinutes().toString();
var ss = this.getSeconds().toString();
return yyyy + '-' + (mm[1] ? mm : "0" + mm[0]) + '-' + (dd[1] ? dd : "0" + dd[0]) + " " + (hh[1] ? hh : "0" + hh[0]) + ":" + (nn[1] ? nn : "0" + nn[0]) + ":" + (ss[1] ? ss : "0" + ss[0]);
};
var timespans = { oneSecond: 1000, oneMinute: 60 * 1000, oneHour: 60 * 60 * 1000, oneDay: 24 * 60 * 60 * 1000, oneWeek: 7 * 24 * 60 * 60 * 1000, oneMonth: 31 * 24 * 60 * 60 * 1000 };
function z(dt) {
return new Date(dt).yyyymmddhhmmss();
};
function generateData1() {
let series = [];
let baseDate = new Date('2020-06-15').getTime();
for (let w = 0; w < 2; w++) {
let price = 1;
for (let d = 0; d < 5; d++) {
if (series.length > 0) { series.push([null, null]) };
for (let h = 9; h < 18; h += 2) {
series.push([baseDate + (w * timespans.oneWeek) + (d * timespans.oneDay) + (h * timespans.oneHour), price++]);
}
}
}
return [series];
}
function generateData2() {
let series = [];
let baseDate = new Date('2020-06-15').getTime();
for (let w = 0; w < 4; w++) {
let price = 1;
for (let d = 0; d < 5; d++) {
if (series.length > 0) { series.push([null, null]) };
for (let h = 9; h < 18; h++) {
series.push([baseDate + (w * timespans.oneWeek) + (d * timespans.oneDay) + (h * timespans.oneHour), price++]);
}
}
}
return [series];
}
function drawChart() {
let cd1 = generateData1();
let mygapMap = generateChartGapMap(cd1[0], timespans.oneHour);
$.plot($("#chartDiv"), cd1, {
points: { show: false },
lines: { show: true },
grid: { hoverable: true },
xaxis: {
mode: "time",
timezone: 'browser',
transform: function (v) {
return mapChartXValue(v, mygapMap);
},
inverseTransform: function (v) { return unmapChartXValue(v, mygapMap); }
}
});
$("<div id='tooltip'></div>").css({ position: "absolute", display: "none", border: "1px solid #fdd", padding: "2px", "background-color": "#fee", opacity: 0.80 }).appendTo("body");
$("#chartDiv").bind("plothover", function (event, pos, item) {
if (!pos.x || !pos.y) { return; }
if (item) {
let x = new Date(item.datapoint[0]).yyyymmddhhmmss();
let y = item.datapoint[1].toFixed(2);
$("#tooltip").html(x + " = " + y).css({ top: item.pageY + 5, left: item.pageX + 5 }).fadeIn(200);
} else {
$("#tooltip").hide();
}
});
let cd2 = generateData2();
let mygapMap2 = generateChartGapMap(cd2[0], timespans.oneHour);
$.plot($("#chartDiv2"), cd2, {
points: { show: false },
lines: { show: true },
grid: { hoverable: true },
xaxis: {
mode: "time",
timezone: 'browser',
transform: function (v) {
return mapChartXValue(v, mygapMap2);
},
inverseTransform: function (v) { return unmapChartXValue(v, mygapMap2); }
}
});
$("#chartDiv2").bind("plothover", function (event, pos, item) {
if (!pos.x || !pos.y) { return; }
if (item) {
let x = new Date(item.datapoint[0]).yyyymmddhhmmss();
let y = item.datapoint[1].toFixed(2);
$("#tooltip").html(x + " = " + y).css({ top: item.pageY + 5, left: item.pageX + 5 }).fadeIn(200);
} else {
$("#tooltip").hide();
}
});
}
$(document).ready(function () { drawChart(); });
</script>
</body>
</html>

View File

@ -0,0 +1,89 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script src="scripts/jquery-3.5.1.min.js" type="text/javascript"></script>
</head>
<body>
<div id="divTest">
<table id="tab1"></table>
</div>
<script>
Date.prototype.getShortDayName = function () {
var weekday = ["Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat"];
return weekday[this.getDay()];
};
Date.prototype.UTCyyyymmddhhmmss = function () {
var yyyy = this.getUTCFullYear().toString();
var mm = (this.getUTCMonth() + 1).toString(); // getMonth() is zero-based
var dd = this.getUTCDate().toString();
var hh = this.getUTCHours().toString();
var nn = this.getUTCMinutes().toString();
var ss = this.getUTCSeconds().toString();
return yyyy + '-' + (mm[1] ? mm : "0" + mm[0]) + '-' + (dd[1] ? dd : "0" + dd[0]) + " " + (hh[1] ? hh : "0" + hh[0]) + ":" + (nn[1] ? nn : "0" + nn[0]) + ":" + (ss[1] ? ss : "0" + ss[0]);
};
let oneDay = 24 * 60 * 60 * 1000;
function removeWeekends(origDate) {
let dayOfWeek = new Date(origDate).getDay();
if (dayOfWeek == 0 || dayOfWeek == 6) {
throw "removeWeekends cannot have weekend dates (" + new Date(origDate).UTCyyyymmddhhmmss() + ") as inputs";
} else {
if (origDate >= (4 * oneDay)) {
//Subtract 4 days from the start of the epoch, so the date starts on an Monday
let startDate = origDate - (4 * oneDay);
let noFullWeeks = Math.floor(startDate / (7 * oneDay));
let remainingDays = startDate % (7 * oneDay);
return (noFullWeeks * (5 * oneDay)) + remainingDays + (2 * oneDay);
} else {
return origDate;
}
}
}
function addWeekends(origDate) {
if (origDate >= (2 * oneDay)) {
let startDate = origDate - (2 * oneDay);
let noFullWeeks = Math.floor(startDate / (5 * oneDay))
let remainingDays = startDate % (5 * oneDay);
return (noFullWeeks * (7 * oneDay)) + remainingDays + (4 * oneDay);
} else {
return origDate;
}
}
function addRow(dateString) {
let origDate = new Date(dateString);
let withoutWeekends = new Date(removeWeekends(origDate));
let withWeekends = new Date(addWeekends(withoutWeekends));
let newRow = '<tr><td>' + origDate.getTime().toString() + ' = ' + origDate.UTCyyyymmddhhmmss() + ' (' + origDate.getShortDayName() + ')</td>' +
'<td>' + withoutWeekends.getTime().toString() + ' = ' + withoutWeekends.UTCyyyymmddhhmmss() + ' (' + withoutWeekends.getShortDayName() + ')</td>' +
'<td>' + withWeekends.getTime().toString() + ' = ' + withWeekends.UTCyyyymmddhhmmss() + ' (' + withWeekends.getShortDayName() + ')</td>' +
'<td>' + (withWeekends-origDate).toString() + '</td>' +
'</tr>';
$("#tab1").append(newRow);
}
function calcVals() {
addRow('1970-01-01');
addRow('1970-01-01 04:05:06');
addRow('1970-01-02');
addRow('1970-01-02 06:07:08');
addRow('1970-01-05');
addRow('1970-01-05 07:08:09');
addRow('2020-01-01');
addRow('2020-03-03');
addRow('2020-03-03 14:15:16');
addRow('2020-04-20');
addRow('2020-11-02');
addRow('2020-11-03');
addRow('2020-11-04');
addRow('2020-11-05');
addRow('2020-11-06 23:59:59.999');
}
$.ready(calcVals());
</script>
</body>
</html>

View File

@ -0,0 +1,12 @@
'------------------------------------------------------------------------------
' <auto-generated>
' This code was generated by a tool.
'
' Changes to this file may cause incorrect behavior and will be lost if
' the code is regenerated.
' </auto-generated>
'------------------------------------------------------------------------------
Option Strict On
Option Explicit On

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<MyApplicationData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<MySubMain>false</MySubMain>
<SingleInstance>false</SingleInstance>
<ShutdownMode>0</ShutdownMode>
<EnableVisualStyles>true</EnableVisualStyles>
<AuthenticationMode>0</AuthenticationMode>
<ApplicationType>1</ApplicationType>
<SaveMySettingsOnExit>true</SaveMySettingsOnExit>
</MyApplicationData>

View File

@ -0,0 +1,34 @@
Imports System
Imports System.Reflection
Imports System.Runtime.InteropServices
' General Information about an assembly is controlled through the following
' set of attributes. Change these attribute values to modify the information
' associated with an assembly.
' Review the values of the assembly attributes
<Assembly: AssemblyTitle("SharePrices")>
<Assembly: AssemblyDescription("")>
<Assembly: AssemblyCompany("")>
<Assembly: AssemblyProduct("SharePrices")>
<Assembly: AssemblyCopyright("Copyright © 2020")>
<Assembly: AssemblyTrademark("")>
<Assembly: ComVisible(False)>
'The following GUID is for the ID of the typelib if this project is exposed to COM
<Assembly: Guid("8a695416-f475-4a08-a9f3-686e3b45ad43")>
' Version information for an assembly consists of the following four values:
'
' Major Version
' Minor Version
' Build Number
' Revision
'
' You can specify all the values or you can default the Build and Revision Numbers
' by using the '*' as shown below:
' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("1.0.0.0")>
<Assembly: AssemblyFileVersion("1.0.0.0")>

View File

@ -0,0 +1,73 @@
#If _MyType <> "Empty" Then
Namespace My
''' <summary>
''' Module used to define the properties that are available in the My Namespace for Web projects.
''' </summary>
''' <remarks></remarks>
<Global.Microsoft.VisualBasic.HideModuleName()> _
Module MyWebExtension
Private s_Computer As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.Devices.ServerComputer)
Private s_User As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.ApplicationServices.WebUser)
Private s_Log As New ThreadSafeObjectProvider(Of Global.Microsoft.VisualBasic.Logging.AspLog)
''' <summary>
''' Returns information about the host computer.
''' </summary>
<Global.System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")> _
Friend ReadOnly Property Computer() As Global.Microsoft.VisualBasic.Devices.ServerComputer
Get
Return s_Computer.GetInstance()
End Get
End Property
''' <summary>
''' Returns information for the current Web user.
''' </summary>
<Global.System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")> _
Friend ReadOnly Property User() As Global.Microsoft.VisualBasic.ApplicationServices.WebUser
Get
Return s_User.GetInstance()
End Get
End Property
''' <summary>
''' Returns Request object.
''' </summary>
<Global.System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")> _
<Global.System.ComponentModel.Design.HelpKeyword("My.Request")> _
Friend ReadOnly Property Request() As Global.System.Web.HttpRequest
<Global.System.Diagnostics.DebuggerHidden()> _
Get
Dim CurrentContext As Global.System.Web.HttpContext = Global.System.Web.HttpContext.Current
If CurrentContext IsNot Nothing Then
Return CurrentContext.Request
End If
Return Nothing
End Get
End Property
''' <summary>
''' Returns Response object.
''' </summary>
<Global.System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")> _
<Global.System.ComponentModel.Design.HelpKeyword("My.Response")> _
Friend ReadOnly Property Response() As Global.System.Web.HttpResponse
<Global.System.Diagnostics.DebuggerHidden()> _
Get
Dim CurrentContext As Global.System.Web.HttpContext = Global.System.Web.HttpContext.Current
If CurrentContext IsNot Nothing Then
Return CurrentContext.Response
End If
Return Nothing
End Get
End Property
''' <summary>
''' Returns the Asp log object.
''' </summary>
<Global.System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")> _
Friend ReadOnly Property Log() As Global.Microsoft.VisualBasic.Logging.AspLog
Get
Return s_Log.GetInstance()
End Get
End Property
End Module
End Namespace
#End If

View File

@ -0,0 +1,61 @@
'------------------------------------------------------------------------------
' <auto-generated>
' This code was generated by a tool.
'
' Changes to this file may cause incorrect behavior and will be lost if
' the code is regenerated.
' </auto-generated>
'------------------------------------------------------------------------------
Option Strict On
Option Explicit On
Namespace My.Resources
'This class was auto-generated by the StronglyTypedResourceBuilder
'class via a tool like ResGen or Visual Studio.
'To add or remove a member, edit your .ResX file then rerun ResGen
'with the /str option, or rebuild your VS project.
'<summary>
' A strongly-typed resource class, for looking up localized strings, etc.
'</summary>
<Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0"), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
Global.Microsoft.VisualBasic.HideModuleNameAttribute()> _
Friend Module Resources
Private resourceMan As Global.System.Resources.ResourceManager
Private resourceCulture As Global.System.Globalization.CultureInfo
'<summary>
' Returns the cached ResourceManager instance used by this class.
'</summary>
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
Get
If Object.ReferenceEquals(resourceMan, Nothing) Then
Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("SharePrices.Resources", GetType(Resources).Assembly)
resourceMan = temp
End If
Return resourceMan
End Get
End Property
'<summary>
' Overrides the current thread's CurrentUICulture property for all
' resource lookups using this strongly typed resource class.
'</summary>
<Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
Friend Property Culture() As Global.System.Globalization.CultureInfo
Get
Return resourceCulture
End Get
Set(ByVal value As Global.System.Globalization.CultureInfo)
resourceCulture = value
End Set
End Property
End Module
End Namespace

View File

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,72 @@
'------------------------------------------------------------------------------
' <auto-generated>
' This code was generated by a tool.
'
' Changes to this file may cause incorrect behavior and will be lost if
' the code is regenerated.
' </auto-generated>
'------------------------------------------------------------------------------
Option Strict On
Option Explicit On
Namespace My
<Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute(), _
Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0"), _
Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
Partial Friend NotInheritable Class MySettings
Inherits Global.System.Configuration.ApplicationSettingsBase
Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings)
#Region "My.Settings Auto-Save Functionality"
#If _MyType = "WindowsForms" Then
Private Shared addedHandler As Boolean
Private Shared addedHandlerLockObject As New Object
<Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), Global.System.ComponentModel.EditorBrowsableAttribute(Global.System.ComponentModel.EditorBrowsableState.Advanced)> _
Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs)
If My.Application.SaveMySettingsOnExit Then
My.Settings.Save()
End If
End Sub
#End If
#End Region
Public Shared ReadOnly Property [Default]() As MySettings
Get
#If _MyType = "WindowsForms" Then
If Not addedHandler Then
SyncLock addedHandlerLockObject
If Not addedHandler Then
AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
addedHandler = True
End If
End SyncLock
End If
#End If
Return defaultInstance
End Get
End Property
End Class
End Namespace
Namespace My
<Global.Microsoft.VisualBasic.HideModuleNameAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
Global.System.Runtime.CompilerServices.CompilerGeneratedAttribute()> _
Friend Module MySettingsProperty
<Global.System.ComponentModel.Design.HelpKeywordAttribute("My.Settings")> _
Friend ReadOnly Property Settings() As Global.SharePrices.My.MySettings
Get
Return Global.SharePrices.My.MySettings.Default
End Get
End Property
End Module
End Namespace

View File

@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" UseMySettingsClassName="true">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View File

@ -0,0 +1,97 @@
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="SharePrices.aspx.vb" Inherits="SharePrices.SharePrices" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Steve's share prices</title>
<link href="SharePricesStyles.css" rel="stylesheet" type="text/css" />
<link href="SharePricesModal.css" rel="stylesheet" type="text/css" />
<link href="jquery-ui.css" rel="stylesheet" type="text/css" />
<script src="scripts/jquery-3.5.1.min.js" type="text/javascript"></script>
<script src="scripts/jquery-ui.min.js" type="text/javascript"></script>
<script src="scripts/jquery.flot.js" type="text/javascript"></script>
<script src="scripts/jquery.flot.crosshair.js" type="text/javascript"></script>
<script src="scripts/jquery.flot.time.min.js" type="text/javascript"></script>
<script src="scripts/jquery.flot.pie.js" type="text/javascript"></script>
<script src="scripts/js.cookie-2.2.1.min.js" type="text/javascript"></script>
<script src="scripts/tablesorter/jquery.tablesorter.js" type="text/javascript"></script>
<script src="scripts/tablesorter/jquery.tablesorter.widgets.js" type="text/javascript"></script>
<script src="scripts/SharePrices.js" type="text/javascript"></script>
<script src="scripts/FlotGaps.js" type="text/javascript"></script>
</head>
<body>
<div class="navbar">
<a id="navCharts" class="activenav" onclick="showTab(this)" data-div="chartDiv">Charts</a>
<a id="navCurrentHoldings" onclick="showTab(this);" data-div="holdingsDiv">Current Holdings</a>
<a id="navAnal" onclick="showTab(this);" data-div="analDiv">Share Analysis</a>
<label for="showBreakevenLine">Show breakeven line</label><input type="checkbox" name="showBreakevenLine" id="showBreakevenLine" onclick="handleClick(this)"/>
<label for="displayAsPercent">Display as percent</label><input type="checkbox" name="displayAsPercent" id="displayAsPercent" onclick="handleClick(this)"/>
<label for="showPreviousHoldings">Show previous holdings</label><input type="checkbox" name="showPreviousHoldings" id="showPreviousHoldings" onclick="handleClick(this)"/>
<button onclick="showModalDialog_AddInstrument()">Add Instrument</button>
</div>
<div class="main" id="mainDiv">
<div id="chartDiv">Charts</div>
<div id="holdingsDiv">Current Holdings</div>
<div id="analDiv">Share Analysis</div>
</div>
<div id="modalDialog" class="modal">
<div class="modal-content">
<div>
<!--<span class="modal-title">Title<span class="close">&times;</span></span> !-->
<table class="modal-title"><tr><td id="modalTitle">Title</td><td class="close">&times;</td></tr></table>
</div>
<br />
<div id="modalContentDiv"></div>
</div>
</div>
<div id="chartTooltip" class="chart-tooltip"></div>
<script>
function initPage() {
let c = Cookies.get('activeTab');
let t = $('#' + c);
if (t && t.length > 0) {
showTab(t[0]);
} else {
showTab($('#navCharts')[0]);
}
c = Cookies.get('showBreakevenLine');
$("#showBreakevenLine").prop('checked', (c == 'true') ? true : false);
c = Cookies.get('displayAsPercent');
$("#displayAsPercent").prop('checked', (c == 'true') ? true : false);
c = Cookies.get('showPreviousHoldings');
$("#showPreviousHoldings").prop('checked', (c == 'true') ? true : false);
getInstruments();
}
function showTab(tab) {
$('.navbar>a').removeClass('activenav');
$('#' + tab.id).addClass('activenav');
$('#mainDiv>div').removeClass('activetab').addClass('inactivetab');
$('#' + $(tab).attr('data-div')).removeClass('inactivetab').addClass('activetab');
//Cookies.set('activeTab', tab.id);
Cookies.set('activeTab', tab.id, {'sameSite': 'strict'});
}
function handleClick(checkbox) {
//Cookies.set(checkbox.id, checkbox.checked);
Cookies.set(checkbox.id, checkbox.checked, {'sameSite': 'strict'});
switch (checkbox.id) {
case 'showBreakevenLine':
redrawAllSharesCharts();
break;
case 'displayAsPercent':
redrawAllSharesCharts();
break;
case 'showPreviousHoldings':
redrawAllSharesCharts();
break;
}
}
$(document).ready(initPage());
</script>
</body>
</html>

View File

@ -0,0 +1,15 @@
'------------------------------------------------------------------------------
' <auto-generated>
' This code was generated by a tool.
'
' Changes to this file may cause incorrect behavior and will be lost if
' the code is regenerated.
' </auto-generated>
'------------------------------------------------------------------------------
Option Strict On
Option Explicit On
Partial Public Class SharePrices
End Class

View File

@ -0,0 +1,136 @@
Imports System.Web.Services
Imports SharePrices.SharePricesUtils
Public Class SharePrices
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Debug.Print("SharePrices - Page load - " + Now().ToString("yyyy-MM-dd HH:mm:ss"))
End Sub
<WebMethod()>
Public Shared Sub GetInstruments()
Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.GetInstruments webmethod")
Dim responseText As String = DataAccessLayer.GetInstruments()
SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText)
End Sub
<WebMethod()>
Public Shared Sub AddInstrument(Symbol As String, FullName As String)
Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.AddInstrument webmethod: " + Symbol + ", " + FullName)
Dim responseText As String = DataAccessLayer.AddInstrument(Symbol, FullName)
SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText)
End Sub
<WebMethod()>
Public Shared Sub AddHolding(AccountName As String, Symbol As String, NoUnits As Integer, PurchasePricePerUnit As Double, PurchaseDate As Int64)
Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.AddHolding webmethod: " + AccountName + ", " + Symbol)
Dim responseText As String = DataAccessLayer.AddHolding(AccountName, Symbol, NoUnits, PurchasePricePerUnit, PurchaseDate)
SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText)
End Sub
<WebMethod()>
Public Shared Sub GetAllDailyData(startDate As Int64, endDate As Int64)
Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.GetAllDailyData webmethod: """ + FromEpochTime(startDate).ToString("yyyy-MM-dd HH:mm:ss") + """, """ + FromEpochTime(endDate).ToString("yyyy-MM-dd HH:mm:ss") + """")
Dim responseText As String = DataAccessLayer.GetAllDailyData(FromEpochTime(startDate), FromEpochTime(endDate))
If responseText = "" Then responseText = "[]"
SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText)
End Sub
<WebMethod()>
Public Shared Sub GetDailyData(Symbol As String, startDate As Int64, endDate As Int64)
Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.GetDailyData webmethod: """ + Symbol + """, """ + FromEpochTime(startDate).ToString("yyyy-MM-dd HH:mm:ss") + """, """ + FromEpochTime(endDate).ToString("yyyy-MM-dd HH:mm:ss") + """")
Dim responseText As String = DataAccessLayer.GetDailyData(Symbol, FromEpochTime(startDate), FromEpochTime(endDate))
If responseText = "" Then responseText = "[]"
SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText)
End Sub
<WebMethod()>
Public Shared Sub GetAllIntradayData(startDate As Int64, endDate As Int64)
Dim startDT As Date = Now()
Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.GetAllIntradayData webmethod: """ + FromEpochTime(startDate).ToString("yyyy-MM-dd HH:mm:ss") + """, """ + FromEpochTime(endDate).ToString("yyyy-MM-dd HH:mm:ss") + """")
Dim responseText As String = DataAccessLayer.GetAllIntradayData(FromEpochTime(startDate), FromEpochTime(endDate))
If responseText = "" Then responseText = "[]"
SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText)
Dim endDT As Date = Now()
Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.GetAllIntradayData completed. Duration = " + DateDiff(DateInterval.Second, startDate, endDT).ToString())
End Sub
<WebMethod()>
Public Shared Sub GetIntradayData(Symbol As String, startDate As Int64, endDate As Int64)
Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.GetIntradayData webmethod: """ + Symbol + """, """ + FromEpochTime(startDate).ToString("yyyy-MM-dd HH:mm:ss") + """, """ + FromEpochTime(endDate).ToString("yyyy-MM-dd HH:mm:ss") + """")
Dim responseText As String = DataAccessLayer.GetIntradayData(Symbol, FromEpochTime(startDate), FromEpochTime(endDate))
If responseText = "" Then responseText = "[]"
SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText)
End Sub
<WebMethod()>
Public Shared Sub SubmitDailyData(Symbol As String, DailyPrices As List(Of DataAccessLayer.PriceData))
Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.SubmitDailyData webmethod: " + Symbol)
Dim responseText As String = DataAccessLayer.InsertDailyData(Symbol, DailyPrices)
If responseText = "" Then responseText = "[]"
SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText)
End Sub
<WebMethod()>
Public Shared Sub SubmitIntradayData(Symbol As String, DailyPrices As List(Of DataAccessLayer.PriceData))
Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.SubmitIntradayData webmethod: " + Symbol)
Dim responseText As String = DataAccessLayer.InsertIntradayData(Symbol, DailyPrices)
If responseText = "" Then responseText = "[]"
SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText)
End Sub
<WebMethod()>
Public Shared Sub DeleteHolding(HoldingID As Integer)
Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.DeleteHolding webmethod: " + HoldingID.ToString())
Dim responseText As String = DataAccessLayer.DeleteHolding(HoldingID)
SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText)
End Sub
<WebMethod()>
Public Shared Sub FetchYahooFinanceIntraday(Symbol As String)
Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.FetchYahooFinanceIntraday webmethod: " + Symbol)
Dim webClient As New System.Net.WebClient
Dim responseText As String = webClient.DownloadString("https://query1.finance.yahoo.com/v8/finance/chart/" + Symbol + "?region=GB&lang=en-GB&includePrePost=false&interval=1h&range=1mo&.tsrc=finance")
SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText)
End Sub
<WebMethod()>
Public Shared Sub FetchYahooFinanceDaily(Symbol As String)
Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.FetchYahooFinanceDaily webmethod: " + Symbol)
Dim webClient As New System.Net.WebClient
Dim responseText As String = webClient.DownloadString("https://query1.finance.yahoo.com/v8/finance/chart/" + Symbol + "?region=GB&lang=en-GB&includePrePost=false&interval=1d&range=6mo&.tsrc=finance")
SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText)
End Sub
<WebMethod()>
Public Shared Sub FetchYahooFinanceSingleDay(Symbol As String)
Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.FetchYahooFinanceSingleDay webmethod: " + Symbol)
Dim webClient As New System.Net.WebClient
Dim responseText As String = webClient.DownloadString("https://query1.finance.yahoo.com/v8/finance/chart/" + Symbol + "?region=GB&lang=en-GB&includePrePost=false&interval=2m&range=1d&corsDomain=uk.finance.yahoo.com&.tsrc=finance")
SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText)
End Sub
<WebMethod()>
Public Shared Sub SearchYahooFinanceShares(SearchString As String)
Debug.Print(Now().ToString("yyyy-MM-dd HH:mm:ss") + " - SharePrices.SearchYahooFinanceShares webmethod: " + SearchString)
Dim webClient As New System.Net.WebClient
Dim responseText As String = webClient.DownloadString("https://query1.finance.yahoo.com/v1/finance/search?q=" + SearchString + "&quotesCount=6&newsCount=0&enableFuzzyQuery=false&quotesQueryId=tss_match_phrase_query&multiQuoteQueryId=multi_quote_single_token_query&newsQueryId=news_ss_symbols&enableCb=false&enableNavLinks=false&vespaNewsTimeoutMs=600")
SetResponseAndCompleteRequest(HttpContext.Current, "application/json", responseText)
End Sub
End Class

View File

@ -0,0 +1,222 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>
</ProductVersion>
<SchemaVersion>
</SchemaVersion>
<ProjectGuid>{AB459D42-2246-47E4-8F1B-F8325E8B780A}</ProjectGuid>
<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{F184B08F-C81C-45F6-A57F-5ABD9991F28F}</ProjectTypeGuids>
<OutputType>Library</OutputType>
<RootNamespace>SharePrices</RootNamespace>
<AssemblyName>SharePrices</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<MyType>Custom</MyType>
<UseIISExpress>false</UseIISExpress>
<IISExpressSSLPort />
<IISExpressAnonymousAuthentication />
<IISExpressWindowsAuthentication />
<IISExpressUseClassicPipelineMode />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<DefineDebug>true</DefineDebug>
<DefineTrace>true</DefineTrace>
<OutputPath>bin\</OutputPath>
<DocumentationFile>SharePrices.xml</DocumentationFile>
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<DefineDebug>false</DefineDebug>
<DefineTrace>true</DefineTrace>
<Optimize>true</Optimize>
<OutputPath>bin\</OutputPath>
<DocumentationFile>SharePrices.xml</DocumentationFile>
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Core" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Web.DynamicData" />
<Reference Include="System.Web.Entity" />
<Reference Include="System.Web.ApplicationServices" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Web" />
<Reference Include="System.Xml" />
<Reference Include="System.Configuration" />
<Reference Include="System.Web.Services" />
<Reference Include="System.EnterpriseServices" />
</ItemGroup>
<ItemGroup>
<Import Include="Microsoft.VisualBasic" />
<Import Include="SharePrices" />
<Import Include="System" />
<Import Include="System.Collections" />
<Import Include="System.Collections.Generic" />
<Import Include="System.Data" />
<Import Include="System.Linq" />
<Import Include="System.Xml.Linq" />
<Import Include="System.Diagnostics" />
<Import Include="System.Collections.Specialized" />
<Import Include="System.Configuration" />
<Import Include="System.Text" />
<Import Include="System.Text.RegularExpressions" />
<Import Include="System.Web" />
<Import Include="System.Web.Caching" />
<Import Include="System.Web.SessionState" />
<Import Include="System.Web.Security" />
<Import Include="System.Web.Profile" />
<Import Include="System.Web.UI" />
<Import Include="System.Web.UI.WebControls" />
<Import Include="System.Web.UI.WebControls.WebParts" />
<Import Include="System.Web.UI.HtmlControls" />
</ItemGroup>
<ItemGroup>
<Content Include="FlotTest.html" />
<Content Include="HtmlPage1.html" />
<Content Include="jquery-ui.css" />
<Content Include="scripts\FlotGaps.js" />
<Content Include="scripts\jquery-3.5.1.min.js" />
<Content Include="scripts\jquery-ui.min.js" />
<Content Include="scripts\jquery.flot.crosshair.js" />
<Content Include="scripts\jquery.flot.js" />
<Content Include="scripts\jquery.flot.pie.js" />
<Content Include="scripts\js.cookie-2.2.1.min.js" />
<Content Include="scripts\SharePrices.js" />
<Content Include="scripts\tablesorter\dragtable.mod.css" />
<Content Include="scripts\tablesorter\filter.formatter.css" />
<Content Include="scripts\tablesorter\highlights.css" />
<Content Include="scripts\tablesorter\jquery.tablesorter.js" />
<Content Include="scripts\tablesorter\jquery.tablesorter.widgets.js" />
<Content Include="scripts\tablesorter\theme.black-ice.css" />
<Content Include="scripts\tablesorter\theme.blue.css" />
<Content Include="scripts\tablesorter\theme.bootstrap.css" />
<Content Include="scripts\tablesorter\theme.bootstrap_2.css" />
<Content Include="scripts\tablesorter\theme.bootstrap_3.css" />
<Content Include="scripts\tablesorter\theme.bootstrap_4.css" />
<Content Include="scripts\tablesorter\theme.dark.css" />
<Content Include="scripts\tablesorter\theme.default.css" />
<Content Include="scripts\tablesorter\theme.dropbox.css" />
<Content Include="scripts\tablesorter\theme.green.css" />
<Content Include="scripts\tablesorter\theme.grey.css" />
<Content Include="scripts\tablesorter\theme.ice.css" />
<Content Include="scripts\tablesorter\theme.jui.css" />
<Content Include="scripts\tablesorter\theme.materialize.css" />
<Content Include="scripts\tablesorter\theme.metro-dark.css" />
<Content Include="scripts\tablesorter\widget.grouping.css" />
<Content Include="SharePrices.aspx" />
<Content Include="SharePricesModal.css" />
<Content Include="SharePricesStyles.css" />
<Content Include="Web.config" />
</ItemGroup>
<ItemGroup>
<Compile Include="App_Code\DataAccessLayer.vb" />
<Compile Include="My Project\AssemblyInfo.vb" />
<Compile Include="My Project\Application.Designer.vb">
<AutoGen>True</AutoGen>
<DependentUpon>Application.myapp</DependentUpon>
</Compile>
<Compile Include="My Project\MyExtensions\MyWebExtension.vb">
<VBMyExtensionTemplateID>Microsoft.VisualBasic.Web.MyExtension</VBMyExtensionTemplateID>
<VBMyExtensionTemplateVersion>1.0.0.0</VBMyExtensionTemplateVersion>
</Compile>
<Compile Include="My Project\Resources.Designer.vb">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="My Project\Settings.Designer.vb">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<Compile Include="SharePrices.aspx.designer.vb">
<DependentUpon>SharePrices.aspx</DependentUpon>
</Compile>
<Compile Include="SharePrices.aspx.vb">
<DependentUpon>SharePrices.aspx</DependentUpon>
<SubType>ASPXCodeBehind</SubType>
</Compile>
<Compile Include="App_Code\SharePricesUtils.vb" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="My Project\Resources.resx">
<Generator>VbMyResourcesResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
<CustomToolNamespace>My.Resources</CustomToolNamespace>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Include="My Project\Application.myapp">
<Generator>MyApplicationCodeGenerator</Generator>
<LastGenOutput>Application.Designer.vb</LastGenOutput>
</None>
<None Include="My Project\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<CustomToolNamespace>My</CustomToolNamespace>
<LastGenOutput>Settings.Designer.vb</LastGenOutput>
</None>
<None Include="Web.Debug.config">
<DependentUpon>Web.config</DependentUpon>
</None>
<None Include="Web.Release.config">
<DependentUpon>Web.config</DependentUpon>
</None>
</ItemGroup>
<ItemGroup />
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
<PropertyGroup>
<OptionExplicit>On</OptionExplicit>
</PropertyGroup>
<PropertyGroup>
<OptionCompare>Binary</OptionCompare>
</PropertyGroup>
<PropertyGroup>
<OptionStrict>Off</OptionStrict>
</PropertyGroup>
<PropertyGroup>
<OptionInfer>On</OptionInfer>
</PropertyGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.targets" />
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
<ProjectExtensions>
<VisualStudio>
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
<WebProjectProperties>
<UseIIS>True</UseIIS>
<AutoAssignPort>True</AutoAssignPort>
<DevelopmentServerPort>56173</DevelopmentServerPort>
<DevelopmentServerVPath>/</DevelopmentServerVPath>
<IISUrl>https://www.copeland-bowen.com/SharePrices</IISUrl>
<NTLMAuthentication>False</NTLMAuthentication>
<UseCustomServer>False</UseCustomServer>
<CustomServerUrl>
</CustomServerUrl>
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
</WebProjectProperties>
</FlavorProperties>
</VisualStudio>
</ProjectExtensions>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ProjectExtensions>
<VisualStudio>
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
<WebProjectProperties>
<StartPageUrl>SharePrices.aspx</StartPageUrl>
<StartAction>SpecificPage</StartAction>
<AspNetDebugging>True</AspNetDebugging>
<SilverlightDebugging>False</SilverlightDebugging>
<NativeDebugging>False</NativeDebugging>
<SQLDebugging>False</SQLDebugging>
<ExternalProgram>
</ExternalProgram>
<StartExternalURL>
</StartExternalURL>
<StartCmdLineArguments>
</StartCmdLineArguments>
<StartWorkingDirectory>
</StartWorkingDirectory>
<EnableENC>True</EnableENC>
<AlwaysStartWebServerOnDebug>True</AlwaysStartWebServerOnDebug>
</WebProjectProperties>
</FlavorProperties>
</VisualStudio>
</ProjectExtensions>
</Project>

View File

@ -0,0 +1,66 @@
/* The Modal (background) */
.modal {
display: none; /* Hidden by default */
position: fixed; /* Stay in place */
z-index: 1; /* Sit on top */
padding-top: 100px; /* Location of the box */
left: 0;
top: 0;
width: 100%; /* Full width */
height: 100%; /* Full height */
overflow: auto; /* Enable scroll if needed */
background-color: rgb(0,0,0); /* Fallback color */
background-color: rgba(0,0,0,0.4); /* Black w/ opacity */
}
.modal-title {
background-color: #3279ea;
margin: auto;
padding: 5px;
border: 1px solid #888;
/*display: block;*/
width: 100%;
vertical-align: central;
}
/* Modal Content */
.modal-content {
background-color: #fefefe;
margin: auto;
padding: 15px;
border: 1px solid #888;
width: 50%;
}
/* The Close Button */
.close {
color: #aaaaaa;
/*float: right;*/
font-size: 24px;
font-weight: bold;
text-align: right;
vertical-align: central;
}
.close:hover,
.close:focus {
color: #000;
text-decoration: none;
cursor: pointer;
}
.ok-button {
background-color: ButtonFace;
cursor: pointer;
padding: 10px;
}
.ok-button-disabled {
background-color: dimgrey;
cursor:not-allowed ;
padding: 10px;
}
table.instrumentSearchResults { width: 100%; border-collapse: collapse; }
.instrumentSearchResults tr:hover { background-color: lightgray; cursor: pointer; }
.selectedSearchResult { background-color: #80f530 !important; }

View File

@ -0,0 +1,70 @@
html, body { min-height: 100% !important; height: 100%; width: 100%; }
body { font-family: Verdana, Arial, Helvetica, sans-serif; margin-left: 0px; }
/* The navigation bar */
.navbar { overflow: hidden; background-color: #333; position: fixed; top: 0; width: 100%; z-index: 100; }
.navbar a { float: left; display: block; color: #f2f2f2; text-align: center; padding: 7px 16px; text-decoration: none; }
.navbar label { color: #f2f2f2; }
.navbar a:hover { background: #ddd; color: black; }
.activenav { float: left; display: block; color: #f2f2f2 !important; background-color: #307D30 !important; text-align: center; padding: 7px 16px; text-decoration: none; }
.main { height: 100%; width: 100%; margin-top: 34px; /* Add a top margin to avoid content overlay */ }
/* #chartDiv { height: 100%; overflow: scroll; } */
#chartDiv { margin-top: 34px; }
#holdingsDiv { margin-top: 34px; }
#analDiv { margin-top: 34px; }
div.activetab {position: absolute; top: 0; height: 100%; width: 100%; z-index: 1; background-color: white; overflow: scroll; /*display: inline;*/}
div.inactivetab {position: absolute; top: 0; height:100%; width: 100%; z-index: 0; overflow: scroll; /*display: none;*/}
td {vertical-align: top;}
.shareRow { /*background-color: #ffffff;*/ }
.altShareRow { background-color: #f4f4f4; }
.miniHoldings { border-collapse: collapse; border-spacing: 0; }
.miniHoldings td { font-size: x-small; border: 1px solid black; }
.miniHoldings th { font-size: x-small; border: 1px solid black; }
.soldHolding { text-decoration: line-through; }
.mainHoldings { font-size: small; }
table.mainHoldings { width: 100%; }
table.mainHoldings th, table.mainHoldings td { padding-left: 5px; padding-right: 5px; }
table.mainHoldings tr:hover { background-color: #acc9e4; }
.price-summary { font-size: x-small; }
.current-value { font-size: medium; }
.num {text-align: right;}
.summary { width: 100%; border-collapse: collapse; }
.spacer { padding-top: 6px; }
.profit { color: #07b200; /*limegreen*/}
.loss { color: firebrick; }
td.no-border { border: 0px; text-align: right; }
.LongSummary { font-size: x-small; }
.LongChart { height: 150px; width: 300px; }
.MidSummary { font-size: x-small; }
.MidChart { height: 150px; width: 300px; }
.ShortSummary { font-size: x-small; }
.ShortChart { height: 150px; width: 300px; }
.DaySummary { font-size: x-small; }
.DayChart { height: 136px; width: 300px; }
.HoldingCurrenciesChart { height: 160px; width: 160px; }
/*#divHoldingCurrenciesChart .pieLabel { color: red !important; background-color: black; }*/
*#divHoldingCurrenciesChart div.pieLabel { font-size: x-small; text-align: center; padding: 2px; color: white; background-color: black }
.deletebutton { color: red; cursor: pointer; }
span.addHolding { cursor: pointer; }
.flot-text { font-size: x-small !important; }
.chart-tooltip { position: absolute; border: 1px solid #fdd; padding: 2px; background-color: #fee; opacity: 0.80; display: none; z-index: 2; }

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
In the example below, the "SetAttributes" transform will change the value of
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
finds an attribute "name" that has a value of "MyDB".
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
-->
<system.web>
<!--
In the example below, the "Replace" transform will replace the entire
<customErrors> section of your web.config file.
Note that because there is only one customErrors section under the
<system.web> node, there is no need to use the "xdt:Locator" attribute.
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
</configuration>

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
In the example below, the "SetAttributes" transform will change the value of
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
finds an attribute "name" that has a value of "MyDB".
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
-->
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
<!--
In the example below, the "Replace" transform will replace the entire
<customErrors> section of your web.config file.
Note that because there is only one customErrors section under the
<system.web> node, there is no need to use the "xdt:Locator" attribute.
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
</configuration>

View File

@ -0,0 +1,24 @@
<?xml version="1.0"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<system.web>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<customErrors mode="Off"/>
</system.web>
<system.web.extensions>
<scripting>
<webServices>
<!-- Update this value to change the value to
a larger value that can accommodate your JSON
strings -->
<jsonSerialization maxJsonLength="10240000" />
</webServices>
</scripting>
</system.web.extensions>
</configuration>

Binary file not shown.

View File

@ -0,0 +1,24 @@
<?xml version="1.0"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<system.web>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
<customErrors mode="Off"/>
</system.web>
<system.web.extensions>
<scripting>
<webServices>
<!-- Update this value to change the value to
a larger value that can accommodate your JSON
strings -->
<jsonSerialization maxJsonLength="10240000" />
</webServices>
</scripting>
</system.web.extensions>
</configuration>

Binary file not shown.

View File

@ -0,0 +1,36 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>
SharePrices
</name>
</assembly>
<members>
<member name="P:SharePrices.My.MyWebExtension.Computer">
<summary>
Returns information about the host computer.
</summary>
</member><member name="P:SharePrices.My.MyWebExtension.User">
<summary>
Returns information for the current Web user.
</summary>
</member><member name="P:SharePrices.My.MyWebExtension.Request">
<summary>
Returns Request object.
</summary>
</member><member name="P:SharePrices.My.MyWebExtension.Response">
<summary>
Returns Response object.
</summary>
</member><member name="P:SharePrices.My.MyWebExtension.Log">
<summary>
Returns the Asp log object.
</summary>
</member><member name="T:SharePrices.My.MyWebExtension">
<summary>
Module used to define the properties that are available in the My Namespace for Web projects.
</summary>
<remarks></remarks>
</member>
</members>
</doc>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,9 @@
D:\Documents\Visual Studio Projects\SharePrices\SharePrices\obj\Debug\SharePrices.Resources.resources
D:\Documents\Visual Studio Projects\SharePrices\SharePrices\obj\Debug\SharePrices.vbproj.GenerateResource.Cache
D:\Documents\Visual Studio Projects\SharePrices\SharePrices\bin\SharePrices.dll.config
D:\Documents\Visual Studio Projects\SharePrices\SharePrices\bin\SharePrices.dll
D:\Documents\Visual Studio Projects\SharePrices\SharePrices\bin\SharePrices.pdb
D:\Documents\Visual Studio Projects\SharePrices\SharePrices\bin\SharePrices.xml
D:\Documents\Visual Studio Projects\SharePrices\SharePrices\obj\Debug\SharePrices.dll
D:\Documents\Visual Studio Projects\SharePrices\SharePrices\obj\Debug\SharePrices.xml
D:\Documents\Visual Studio Projects\SharePrices\SharePrices\obj\Debug\SharePrices.pdb

View File

@ -0,0 +1,36 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>
SharePrices
</name>
</assembly>
<members>
<member name="P:SharePrices.My.MyWebExtension.Computer">
<summary>
Returns information about the host computer.
</summary>
</member><member name="P:SharePrices.My.MyWebExtension.User">
<summary>
Returns information for the current Web user.
</summary>
</member><member name="P:SharePrices.My.MyWebExtension.Request">
<summary>
Returns Request object.
</summary>
</member><member name="P:SharePrices.My.MyWebExtension.Response">
<summary>
Returns Response object.
</summary>
</member><member name="P:SharePrices.My.MyWebExtension.Log">
<summary>
Returns the Asp log object.
</summary>
</member><member name="T:SharePrices.My.MyWebExtension">
<summary>
Module used to define the properties that are available in the My Namespace for Web projects.
</summary>
<remarks></remarks>
</member>
</members>
</doc>

View File

@ -0,0 +1,77 @@
function generateChartGapMap(data, maxGapSize) {
let gaps = [];
if (data.length > 1) {
let currentOffset = 0;
let previousOffset = 0;
let previousX = data[0][0];
for (let i = 1; i < data.length; i++) {
if (data[i][0] != null && data[i][1] != null) {
let currentX = data[i][0];
if (currentX - previousX > maxGapSize) { //New gap
previousOffset = currentOffset;
currentOffset += currentX - (previousX + maxGapSize);
let gap = {
unmappedGapStart: previousX,
unmappedGapEnd: currentX,
mappedGapStart: previousX - previousOffset,
mappedGapEnd: currentX - currentOffset,
startOffset: previousOffset,
endOffset: currentOffset
};
gaps.push(gap);
}
previousX = currentX;
}
}
}
return gaps;
}
function mapChartXValue(unmappedValue, gapMap) {
if (gapMap.length > 0) {
let i = 0;
let gap = gapMap[i];
while (unmappedValue > gap.unmappedGapEnd && i < gapMap.length - 1) {
i++;
gap = gapMap[i];
}
if (unmappedValue >= gap.unmappedGapEnd) { //unmappedValue is after this gap
return unmappedValue - gap.endOffset;
} else {
if (unmappedValue <= gap.unmappedGapStart) { //unmappedValue is before this gap
return unmappedValue - gap.startOffset;
} else { //unmappedValue is within this gap
let unmappedGapSize = gap.unmappedGapEnd - gap.unmappedGapStart;
let mappedGapSize = gap.mappedGapEnd - gap.mappedGapStart;
let position = (unmappedValue - gap.unmappedGapStart) / unmappedGapSize;
return gap.mappedGapStart + (position * mappedGapSize);
}
}
} else {
return unmappedValue;
}
}
function unmapChartXValue(mappedValue, gapMap) {
if (gapMap.length > 0) {
let i = 0;
let gap = gapMap[i];
while (mappedValue > gap.mappedGapEnd && i < gapMap.length - 1) {
i++;
gap = gapMap[i];
}
if (mappedValue >= gap.mappedGapEnd) { //mappedValue is after this gap
return mappedValue + gap.endOffset;
} else {
if (mappedValue <= gap.mappedGapStart) { //mappedValue is before this gap
return mappedValue + gap.startOffset;
} else { //mappedValue is within this gap
let unmappedGapSize = gap.unmappedGapEnd - gap.unmappedGapStart;
let mappedGapSize = gap.mappedGapEnd - gap.mappedGapStart;
let position = mappedValue - gap.mappedGapStart;
return gap.unmappedGapStart + (position / mappedGapSize * unmappedGapSize);
}
}
} else {
return mappedValue;
}
}

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

View File

@ -0,0 +1,431 @@
/* Flot plugin for showing crosshairs when the mouse hovers over the plot.
Copyright (c) 2007-2013 IOLA and Ole Laursen.
Licensed under the MIT license.
The plugin supports these options:
crosshair: {
mode: null or "x" or "y" or "xy"
color: color
lineWidth: number
}
Set the mode to one of "x", "y" or "xy". The "x" mode enables a vertical
crosshair that lets you trace the values on the x axis, "y" enables a
horizontal crosshair and "xy" enables them both. "color" is the color of the
crosshair (default is "rgba(170, 0, 0, 0.80)"), "lineWidth" is the width of
the drawn lines (default is 1).
The plugin also adds four public methods:
- setCrosshair( pos )
Set the position of the crosshair. Note that this is cleared if the user
moves the mouse. "pos" is in coordinates of the plot and should be on the
form { x: xpos, y: ypos } (you can use x2/x3/... if you're using multiple
axes), which is coincidentally the same format as what you get from a
"plothover" event. If "pos" is null, the crosshair is cleared.
- clearCrosshair()
Clear the crosshair.
- lockCrosshair(pos)
Cause the crosshair to lock to the current location, no longer updating if
the user moves the mouse. Optionally supply a position (passed on to
setCrosshair()) to move it to.
Example usage:
var myFlot = $.plot( $("#graph"), ..., { crosshair: { mode: "x" } } };
$("#graph").bind( "plothover", function ( evt, position, item ) {
if ( item ) {
// Lock the crosshair to the data point being hovered
myFlot.lockCrosshair({
x: item.datapoint[ 0 ],
y: item.datapoint[ 1 ]
});
} else {
// Return normal crosshair operation
myFlot.unlockCrosshair();
}
});
- unlockCrosshair()
Free the crosshair to move again after locking it.
*/
(function ($) {
var options = {
crosshair: {
mode: null, // one of null, "x", "y" or "xy",
color: "rgba(170, 0, 0, 0.80)",
lineWidth: 1,
snapX: false,
showXValue: false,
xValueFormat: "%d.%m.%Y %H:%M",
xValuePos: '',
}
};
function formatDate(d, fmt, monthNames, dayNames) {
/*if (typeof d.strftime == "function") {
return d.strftime(fmt);
}*/
var leftPad = function (n, pad) {
n = "" + n;
pad = "" + (pad == null ? "0" : pad);
return n.length == 1 ? pad + n : n;
};
var r = [];
var escape = false;
var hours = d.getHours();
var isAM = hours < 12;
if (monthNames == null) {
monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
}
if (dayNames == null) {
dayNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
}
var hours12;
if (hours > 12) {
hours12 = hours - 12;
} else if (hours == 0) {
hours12 = 12;
} else {
hours12 = hours;
}
for (var i = 0; i < fmt.length; ++i) {
var c = fmt.charAt(i);
if (escape) {
switch (c) {
case 'a':
c = "" + dayNames[d.getDay()];
break;
case 'b':
c = "" + monthNames[d.getMonth()];
break;
case 'd':
c = leftPad(d.getDate());
break;
case 'e':
c = leftPad(d.getDate(), " ");
break;
case 'h': // For back-compat with 0.7; remove in 1.0
case 'H':
c = leftPad(hours);
break;
case 'I':
c = leftPad(hours12);
break;
case 'l':
c = leftPad(hours12, " ");
break;
case 'm':
c = leftPad(d.getMonth() + 1);
break;
case 'M':
c = leftPad(d.getMinutes());
break;
// quarters not in Open Group's strftime specification
case 'q':
c = "" + (Math.floor(d.getMonth() / 3) + 1);
break;
case 'S':
c = leftPad(d.getSeconds());
break;
case 'y':
c = leftPad(d.getFullYear() % 100);
break;
case 'Y':
c = "" + d.getFullYear();
break;
case 'p':
c = (isAM) ? ("" + "am") : ("" + "pm");
break;
case 'P':
c = (isAM) ? ("" + "AM") : ("" + "PM");
break;
case 'w':
c = "" + d.getDay();
break;
}
r.push(c);
escape = false;
} else {
if (c == "%") {
escape = true;
} else {
r.push(c);
}
}
}
return r.join("");
}
// To have a consistent view of time-based data independent of which time
// zone the client happens to be in we need a date-like object independent
// of time zones. This is done through a wrapper that only calls the UTC
// versions of the accessor methods.
function makeUtcWrapper(d) {
function addProxyMethod(sourceObj, sourceMethod, targetObj, targetMethod) {
sourceObj[sourceMethod] = function () {
return targetObj[targetMethod].apply(targetObj, arguments);
};
};
var utc = {
date: d
};
// support strftime, if found
if (d.strftime != undefined) {
addProxyMethod(utc, "strftime", d, "strftime");
}
addProxyMethod(utc, "getTime", d, "getTime");
addProxyMethod(utc, "setTime", d, "setTime");
var props = ["Date", "Day", "FullYear", "Hours", "Milliseconds", "Minutes", "Month", "Seconds"];
for (var p = 0; p < props.length; p++) {
addProxyMethod(utc, "get" + props[p], d, "getUTC" + props[p]);
addProxyMethod(utc, "set" + props[p], d, "setUTC" + props[p]);
}
return utc;
};
// select time zone strategy. This returns a date-like object tied to the
// desired timezone
function dateGenerator(ts, opts) {
if (opts.timezone == "browser") {
return new Date(ts);
} else if (!opts.timezone || opts.timezone == "utc") {
return makeUtcWrapper(new Date(ts));
} else if (typeof timezoneJS != "undefined" && typeof timezoneJS.Date != "undefined") {
var d = new timezoneJS.Date();
// timezone-js is fickle, so be sure to set the time zone before
// setting the time.
d.setTimezone(opts.timezone);
d.setTime(ts);
return d;
} else {
return makeUtcWrapper(new Date(ts));
}
}
function init(plot) {
// position of crosshair in pixels
var crosshair = { x: -1, y: -1, locked: false };
var closest_to_crosshair = null;
plot.setCrosshair = function setCrosshair(pos) {
if (!pos)
crosshair.x = -1;
else {
var o = plot.p2c(pos);
crosshair.x = Math.max(0, Math.min(o.left, plot.width()));
crosshair.y = Math.max(0, Math.min(o.top, plot.height()));
}
plot.triggerRedrawOverlay();
};
plot.clearCrosshair = plot.setCrosshair; // passes null for pos
plot.lockCrosshair = function lockCrosshair(pos) {
if (pos)
plot.setCrosshair(pos);
crosshair.locked = true;
};
plot.unlockCrosshair = function unlockCrosshair() {
crosshair.locked = false;
};
function onMouseOut(e) {
if (crosshair.locked)
return;
if (crosshair.x != -1) {
crosshair.x = -1;
if (plot.getOptions().crosshair.snapX) {
plot.getPlaceholder().trigger('snapEvent', [ -1 ]);
}
plot.triggerRedrawOverlay();
}
}
function onMouseMove(e) {
if (crosshair.locked)
return;
if (plot.getSelection && plot.getSelection()) {
crosshair.x = -1; // hide the crosshair while selecting
return;
}
lastX = crosshair.x;
var offset = plot.offset();
crosshair.x = Math.max(0, Math.min(e.pageX - offset.left, plot.width()));
crosshair.y = Math.max(0, Math.min(e.pageY - offset.top, plot.height()));
// Calculate snap point
if (plot.getOptions().crosshair.snapX) {
// convert canvas x to plot x
var coords = plot.c2p({ left: crosshair.x});
var x = coords['x'];
var closest = null;
var distance = 0;
var datas = plot.getData();
// iterate over all series
for (i = 0; i < datas.length; i++) {
var data = datas[i].data;
// Find closest point for this series
if (data.length > 0) {
var done = false;
var point = null;
var last_point = null;
// find two closest points to x value
if (data.length > 0) {
for (j = 0; j < data.length && !done; j++) {
last_point = point;
point = data[j][0];
if (point > x) {
done = true;
}
}
// determine closest
var point_distance = Math.abs(point - x);
if (last_point != null && done && (point_distance > Math.abs(last_point - x))) {
point = last_point;
point_distance = Math.abs(point - x);
}
// check if closest for this series is closer than overall closest
if (closest == null || distance > point_distance) {
closest = point;
distance = point_distance;
}
}
}
}
var canvas_coords = plot.p2c({x: closest});
// if closest is outside of canvas, disable crosshair
if (canvas_coords["left"] < 0 || canvas_coords["left"] > plot.width()) {
crosshair.x = -1;
} else {
crosshair.x = canvas_coords["left"];
}
if (crosshair.x != lastX) {
closest_to_crosshair = closest;
plot.getPlaceholder().trigger('snapEvent', [ crosshair.x == -1 ? -1 : closest ]);
}
}
plot.triggerRedrawOverlay();
}
plot.hooks.bindEvents.push(function (plot, eventHolder) {
if (!plot.getOptions().crosshair.mode)
return;
eventHolder.mouseout(onMouseOut);
eventHolder.mousemove(onMouseMove);
});
plot.hooks.drawOverlay.push(function (plot, ctx) {
var c = plot.getOptions().crosshair;
if (!c.mode)
return;
var plotOffset = plot.getPlotOffset();
ctx.save();
ctx.translate(plotOffset.left, plotOffset.top);
if (crosshair.x != -1) {
var adj = plot.getOptions().crosshair.lineWidth % 2 === 0 ? 0 : 0.5;
ctx.strokeStyle = c.color;
ctx.lineWidth = c.lineWidth;
ctx.lineJoin = "round";
ctx.beginPath();
if (c.mode.indexOf("x") != -1) {
var drawX = Math.round(crosshair.x) + adj;
ctx.moveTo(drawX, 0);
ctx.lineTo(drawX, plot.height());
if (plot.getOptions().crosshair.showXValue) {
// var axis_val = new Date(plot.c2p({left: drawX})["x"]);
var axis_val = new Date(closest_to_crosshair);
var time_txt = axis_val.strftime(plot.getOptions().crosshair.xValueFormat);
var ax_opts = plot.getAxes().xaxis.options;
var time_txt = formatDate(axis_val, plot.getOptions().crosshair.xValueFormat, ax_opts.monthNames, ax_opts.dayNames)
var text_width = ctx.measureText(time_txt).width;
if (drawX + 50 > plot.width()) {
ctx.textAlign = "right";
var x_val = drawX - 5
var rect_x = x_val - text_width - 2
} else {
ctx.textAlign = "left";
var x_val = drawX + 5
rect_x = x_val - 2
}
if (plot.getOptions().crosshair.xValuePos == 'top') {
var y_val = 11;
var rect_y = y_val - 10;
} else {
var y_val = plot.height() - 5;
var rect_y = y_val - 10;
}
ctx.fillStyle = "white";
ctx.fillRect(rect_x, rect_y, text_width + 4, 12);
ctx.fillStyle = "black";
ctx.fillText(time_txt, x_val, y_val);
}
}
if (c.mode.indexOf("y") != -1) {
var drawY = Math.round(crosshair.y) + adj;
ctx.moveTo(0, drawY);
ctx.lineTo(plot.width(), drawY);
}
ctx.stroke();
}
ctx.restore();
});
plot.hooks.shutdown.push(function (plot, eventHolder) {
eventHolder.unbind("mouseout", onMouseOut);
eventHolder.unbind("mousemove", onMouseMove);
});
}
$.plot.plugins.push({
init: init,
options: options,
name: 'crosshair',
version: '1.0'
});
})(jQuery);

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,786 @@
/* Flot plugin for rendering pie charts.
Copyright (c) 2007-2014 IOLA and Ole Laursen.
Licensed under the MIT license.
The plugin assumes that each series has a single data value, and that each
value is a positive integer or zero. Negative numbers don't make sense for a
pie chart, and have unpredictable results. The values do NOT need to be
passed in as percentages; the plugin will calculate the total and per-slice
percentages internally.
* Created by Brian Medendorp
* Updated with contributions from btburnett3, Anthony Aragues and Xavi Ivars
The plugin supports these options:
series: {
pie: {
show: true/false
radius: 0-1 for percentage of fullsize, or a specified pixel length, or 'auto'
innerRadius: 0-1 for percentage of fullsize or a specified pixel length, for creating a donut effect
startAngle: 0-2 factor of PI used for starting angle (in radians) i.e 3/2 starts at the top, 0 and 2 have the same result
tilt: 0-1 for percentage to tilt the pie, where 1 is no tilt, and 0 is completely flat (nothing will show)
offset: {
top: integer value to move the pie up or down
left: integer value to move the pie left or right, or 'auto'
},
stroke: {
color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#FFF')
width: integer pixel width of the stroke
},
label: {
show: true/false, or 'auto'
formatter: a user-defined function that modifies the text/style of the label text
radius: 0-1 for percentage of fullsize, or a specified pixel length
background: {
color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#000')
opacity: 0-1
},
threshold: 0-1 for the percentage value at which to hide labels (if they're too small)
},
combine: {
threshold: 0-1 for the percentage value at which to combine slices (if they're too small)
color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#CCC'), if null, the plugin will automatically use the color of the first slice to be combined
label: any text value of what the combined slice should be labeled
}
highlight: {
opacity: 0-1
}
}
}
More detail and specific examples can be found in the included HTML file.
*/
(function($) {
// Maximum redraw attempts when fitting labels within the plot
var REDRAW_ATTEMPTS = 10;
// Factor by which to shrink the pie when fitting labels within the plot
var REDRAW_SHRINK = 0.95;
function init(plot) {
var canvas = null,
target = null,
options = null,
maxRadius = null,
centerLeft = null,
centerTop = null,
processed = false,
ctx = null;
// interactive variables
var highlights = [];
// add hook to determine if pie plugin in enabled, and then perform necessary operations
plot.hooks.processOptions.push(function(plot, options) {
if (options.series.pie.show) {
options.grid.show = false;
// set labels.show
if (options.series.pie.label.show === "auto") {
if (options.legend.show) {
options.series.pie.label.show = false;
} else {
options.series.pie.label.show = true;
}
}
// set radius
if (options.series.pie.radius === "auto") {
if (options.series.pie.label.show) {
options.series.pie.radius = 3 / 4;
} else {
options.series.pie.radius = 1;
}
}
// ensure sane tilt
if (options.series.pie.tilt > 1) {
options.series.pie.tilt = 1;
} else if (options.series.pie.tilt < 0) {
options.series.pie.tilt = 0;
}
}
});
plot.hooks.bindEvents.push(function(plot, eventHolder) {
var options = plot.getOptions();
if (options.series.pie.show) {
if (options.grid.hoverable) {
eventHolder.unbind("mousemove").mousemove(onMouseMove);
}
if (options.grid.clickable) {
eventHolder.unbind("click").click(onClick);
}
}
});
plot.hooks.processDatapoints.push(function(plot, series, data, datapoints) {
var options = plot.getOptions();
if (options.series.pie.show) {
processDatapoints(plot, series, data, datapoints);
}
});
plot.hooks.drawOverlay.push(function(plot, octx) {
var options = plot.getOptions();
if (options.series.pie.show) {
drawOverlay(plot, octx);
}
});
plot.hooks.draw.push(function(plot, newCtx) {
var options = plot.getOptions();
if (options.series.pie.show) {
draw(plot, newCtx);
}
});
function processDatapoints(plot, series, datapoints) {
if (!processed) {
processed = true;
canvas = plot.getCanvas();
target = $(canvas).parent();
options = plot.getOptions();
plot.setData(combine(plot.getData()));
}
}
function combine(data) {
var total = 0,
combined = 0,
numCombined = 0,
color = options.series.pie.combine.color,
newdata = [],
i,
value;
// Fix up the raw data from Flot, ensuring the data is numeric
for (i = 0; i < data.length; ++i) {
value = data[i].data;
// If the data is an array, we'll assume that it's a standard
// Flot x-y pair, and are concerned only with the second value.
// Note how we use the original array, rather than creating a
// new one; this is more efficient and preserves any extra data
// that the user may have stored in higher indexes.
if ($.isArray(value) && value.length === 1) {
value = value[0];
}
if ($.isArray(value)) {
// Equivalent to $.isNumeric() but compatible with jQuery < 1.7
if (!isNaN(parseFloat(value[1])) && isFinite(value[1])) {
value[1] = +value[1];
} else {
value[1] = 0;
}
} else if (!isNaN(parseFloat(value)) && isFinite(value)) {
value = [1, +value];
} else {
value = [1, 0];
}
data[i].data = [value];
}
// Sum up all the slices, so we can calculate percentages for each
for (i = 0; i < data.length; ++i) {
total += data[i].data[0][1];
}
// Count the number of slices with percentages below the combine
// threshold; if it turns out to be just one, we won't combine.
for (i = 0; i < data.length; ++i) {
value = data[i].data[0][1];
if (value / total <= options.series.pie.combine.threshold) {
combined += value;
numCombined++;
if (!color) {
color = data[i].color;
}
}
}
for (i = 0; i < data.length; ++i) {
value = data[i].data[0][1];
if (numCombined < 2 || value / total > options.series.pie.combine.threshold) {
newdata.push(
$.extend(data[i], { /* extend to allow keeping all other original data values
and using them e.g. in labelFormatter. */
data: [[1, value]],
color: data[i].color,
label: data[i].label,
angle: value * Math.PI * 2 / total,
percent: value / (total / 100)
})
);
}
}
if (numCombined > 1) {
newdata.push({
data: [[1, combined]],
color: color,
label: options.series.pie.combine.label,
angle: combined * Math.PI * 2 / total,
percent: combined / (total / 100)
});
}
return newdata;
}
function draw(plot, newCtx) {
if (!target) {
return; // if no series were passed
}
var canvasWidth = plot.getPlaceholder().width(),
canvasHeight = plot.getPlaceholder().height(),
legendWidth = target.children().filter(".legend").children().width() || 0;
ctx = newCtx;
// WARNING: HACK! REWRITE THIS CODE AS SOON AS POSSIBLE!
// When combining smaller slices into an 'other' slice, we need to
// add a new series. Since Flot gives plugins no way to modify the
// list of series, the pie plugin uses a hack where the first call
// to processDatapoints results in a call to setData with the new
// list of series, then subsequent processDatapoints do nothing.
// The plugin-global 'processed' flag is used to control this hack;
// it starts out false, and is set to true after the first call to
// processDatapoints.
// Unfortunately this turns future setData calls into no-ops; they
// call processDatapoints, the flag is true, and nothing happens.
// To fix this we'll set the flag back to false here in draw, when
// all series have been processed, so the next sequence of calls to
// processDatapoints once again starts out with a slice-combine.
// This is really a hack; in 0.9 we need to give plugins a proper
// way to modify series before any processing begins.
processed = false;
// calculate maximum radius and center point
maxRadius = Math.min(canvasWidth, canvasHeight / options.series.pie.tilt) / 2;
centerTop = canvasHeight / 2 + options.series.pie.offset.top;
centerLeft = canvasWidth / 2;
if (options.series.pie.offset.left === "auto") {
if (options.legend.position.match("w")) {
centerLeft += legendWidth / 2;
} else {
centerLeft -= legendWidth / 2;
}
if (centerLeft < maxRadius) {
centerLeft = maxRadius;
} else if (centerLeft > canvasWidth - maxRadius) {
centerLeft = canvasWidth - maxRadius;
}
} else {
centerLeft += options.series.pie.offset.left;
}
var slices = plot.getData(),
attempts = 0;
// Keep shrinking the pie's radius until drawPie returns true,
// indicating that all the labels fit, or we try too many times.
do {
if (attempts > 0) {
maxRadius *= REDRAW_SHRINK;
}
attempts += 1;
clear();
if (options.series.pie.tilt <= 0.8) {
drawShadow();
}
} while (!drawPie() && attempts < REDRAW_ATTEMPTS)
if (attempts >= REDRAW_ATTEMPTS) {
clear();
target.prepend("<div class='error'>Could not draw pie with labels contained inside canvas</div>");
}
if (plot.setSeries && plot.insertLegend) {
plot.setSeries(slices);
plot.insertLegend();
}
// we're actually done at this point, just defining internal functions at this point
function clear() {
ctx.clearRect(0, 0, canvasWidth, canvasHeight);
target.children().filter(".pieLabel, .pieLabelBackground").remove();
}
function drawShadow() {
var shadowLeft = options.series.pie.shadow.left;
var shadowTop = options.series.pie.shadow.top;
var edge = 10;
var alpha = options.series.pie.shadow.alpha;
var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;
if (radius >= canvasWidth / 2 - shadowLeft || radius * options.series.pie.tilt >= canvasHeight / 2 - shadowTop || radius <= edge) {
return; // shadow would be outside canvas, so don't draw it
}
ctx.save();
ctx.translate(shadowLeft, shadowTop);
ctx.globalAlpha = alpha;
ctx.fillStyle = "#000";
// center and rotate to starting position
ctx.translate(centerLeft, centerTop);
ctx.scale(1, options.series.pie.tilt);
//radius -= edge;
for (var i = 1; i <= edge; i++) {
ctx.beginPath();
ctx.arc(0, 0, radius, 0, Math.PI * 2, false);
ctx.fill();
radius -= i;
}
ctx.restore();
}
function drawPie() {
var startAngle = Math.PI * options.series.pie.startAngle;
var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;
var i;
// center and rotate to starting position
ctx.save();
ctx.translate(centerLeft, centerTop);
ctx.scale(1, options.series.pie.tilt);
//ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera
// draw slices
ctx.save();
var currentAngle = startAngle;
for (i = 0; i < slices.length; ++i) {
slices[i].startAngle = currentAngle;
drawSlice(slices[i].angle, slices[i].color, true);
}
ctx.restore();
// draw slice outlines
if (options.series.pie.stroke.width > 0) {
ctx.save();
ctx.lineWidth = options.series.pie.stroke.width;
currentAngle = startAngle;
for (i = 0; i < slices.length; ++i) {
drawSlice(slices[i].angle, options.series.pie.stroke.color, false);
}
ctx.restore();
}
// draw donut hole
drawDonutHole(ctx);
ctx.restore();
// Draw the labels, returning true if they fit within the plot
if (options.series.pie.label.show) {
return drawLabels();
} else return true;
function drawSlice(angle, color, fill) {
if (angle <= 0 || isNaN(angle)) {
return;
}
if (fill) {
ctx.fillStyle = color;
} else {
ctx.strokeStyle = color;
ctx.lineJoin = "round";
}
ctx.beginPath();
if (Math.abs(angle - Math.PI * 2) > 0.000000001) {
ctx.moveTo(0, 0); // Center of the pie
}
//ctx.arc(0, 0, radius, 0, angle, false); // This doesn't work properly in Opera
ctx.arc(0, 0, radius, currentAngle, currentAngle + angle / 2, false);
ctx.arc(0, 0, radius, currentAngle + angle / 2, currentAngle + angle, false);
ctx.closePath();
//ctx.rotate(angle); // This doesn't work properly in Opera
currentAngle += angle;
if (fill) {
ctx.fill();
} else {
ctx.stroke();
}
}
function drawLabels() {
var currentAngle = startAngle;
var radius = options.series.pie.label.radius > 1 ? options.series.pie.label.radius : maxRadius * options.series.pie.label.radius;
for (var i = 0; i < slices.length; ++i) {
if (slices[i].percent >= options.series.pie.label.threshold * 100) {
if (!drawLabel(slices[i], currentAngle, i)) {
return false;
}
}
currentAngle += slices[i].angle;
}
return true;
function drawLabel(slice, startAngle, index) {
if (slice.data[0][1] === 0) {
return true;
}
// format label text
var lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter;
if (lf) {
text = lf(slice.label, slice);
} else {
text = slice.label;
}
if (plf) {
text = plf(text, slice);
}
var halfAngle = ((startAngle + slice.angle) + startAngle) / 2;
var x = centerLeft + Math.round(Math.cos(halfAngle) * radius);
var y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt;
var html = "<span class='pieLabel' id='pieLabel" + index + "' style='position:absolute;top:" + y + "px;left:" + x + "px;'>" + text + "</span>";
target.append(html);
var label = target.children("#pieLabel" + index);
var labelTop = (y - label.height() / 2);
var labelLeft = (x - label.width() / 2);
label.css("top", labelTop);
label.css("left", labelLeft);
// check to make sure that the label is not outside the canvas
if (0 - labelTop > 0 || 0 - labelLeft > 0 || canvasHeight - (labelTop + label.height()) < 0 || canvasWidth - (labelLeft + label.width()) < 0) {
return false;
}
if (options.series.pie.label.background.opacity !== 0) {
// put in the transparent background separately to avoid blended labels and label boxes
var c = options.series.pie.label.background.color;
if (c == null) {
c = slice.color;
}
var pos = "top:" + labelTop + "px;left:" + labelLeft + "px;";
$("<div class='pieLabelBackground' style='position:absolute;width:" + label.width() + "px;height:" + label.height() + "px;" + pos + "background-color:" + c + ";'></div>")
.css("opacity", options.series.pie.label.background.opacity)
.insertBefore(label);
}
return true;
} // end individual label function
} // end drawLabels function
} // end drawPie function
} // end draw function
// Placed here because it needs to be accessed from multiple locations
function drawDonutHole(layer) {
if (options.series.pie.innerRadius > 0) {
// subtract the center
layer.save();
var innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius;
layer.globalCompositeOperation = "destination-out"; // this does not work with excanvas, but it will fall back to using the stroke color
layer.beginPath();
layer.fillStyle = options.series.pie.stroke.color;
layer.arc(0, 0, innerRadius, 0, Math.PI * 2, false);
layer.fill();
layer.closePath();
layer.restore();
// add inner stroke
layer.save();
layer.beginPath();
layer.strokeStyle = options.series.pie.stroke.color;
layer.arc(0, 0, innerRadius, 0, Math.PI * 2, false);
layer.stroke();
layer.closePath();
layer.restore();
// TODO: add extra shadow inside hole (with a mask) if the pie is tilted.
}
}
//-- Additional Interactive related functions --
function isPointInPoly(poly, pt) {
for (var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) {
((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) ||
(poly[j][1] <= pt[1] && pt[1] < poly[i][1])) &&
(pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]) &&
(c = !c);
}
return c;
}
function findNearbySlice(mouseX, mouseY) {
var slices = plot.getData(),
options = plot.getOptions(),
radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius,
x, y;
for (var i = 0; i < slices.length; ++i) {
var s = slices[i];
if (s.pie.show) {
ctx.save();
ctx.beginPath();
ctx.moveTo(0, 0); // Center of the pie
//ctx.scale(1, options.series.pie.tilt); // this actually seems to break everything when here.
ctx.arc(0, 0, radius, s.startAngle, s.startAngle + s.angle / 2, false);
ctx.arc(0, 0, radius, s.startAngle + s.angle / 2, s.startAngle + s.angle, false);
ctx.closePath();
x = mouseX - centerLeft;
y = mouseY - centerTop;
if (ctx.isPointInPath) {
if (ctx.isPointInPath(mouseX - centerLeft, mouseY - centerTop)) {
ctx.restore();
return {
datapoint: [s.percent, s.data],
dataIndex: 0,
series: s,
seriesIndex: i
};
}
} else {
// excanvas for IE doesn;t support isPointInPath, this is a workaround.
var p1X = radius * Math.cos(s.startAngle),
p1Y = radius * Math.sin(s.startAngle),
p2X = radius * Math.cos(s.startAngle + s.angle / 4),
p2Y = radius * Math.sin(s.startAngle + s.angle / 4),
p3X = radius * Math.cos(s.startAngle + s.angle / 2),
p3Y = radius * Math.sin(s.startAngle + s.angle / 2),
p4X = radius * Math.cos(s.startAngle + s.angle / 1.5),
p4Y = radius * Math.sin(s.startAngle + s.angle / 1.5),
p5X = radius * Math.cos(s.startAngle + s.angle),
p5Y = radius * Math.sin(s.startAngle + s.angle),
arrPoly = [[0, 0], [p1X, p1Y], [p2X, p2Y], [p3X, p3Y], [p4X, p4Y], [p5X, p5Y]],
arrPoint = [x, y];
// TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt?
if (isPointInPoly(arrPoly, arrPoint)) {
ctx.restore();
return {
datapoint: [s.percent, s.data],
dataIndex: 0,
series: s,
seriesIndex: i
};
}
}
ctx.restore();
}
}
return null;
}
function onMouseMove(e) {
triggerClickHoverEvent("plothover", e);
}
function onClick(e) {
triggerClickHoverEvent("plotclick", e);
}
// trigger click or hover event (they send the same parameters so we share their code)
function triggerClickHoverEvent(eventname, e) {
var offset = plot.offset();
var canvasX = parseInt(e.pageX - offset.left);
var canvasY = parseInt(e.pageY - offset.top);
var item = findNearbySlice(canvasX, canvasY);
if (options.grid.autoHighlight) {
// clear auto-highlights
for (var i = 0; i < highlights.length; ++i) {
var h = highlights[i];
if (h.auto === eventname && !(item && h.series === item.series)) {
unhighlight(h.series);
}
}
}
// highlight the slice
if (item) {
highlight(item.series, eventname);
}
// trigger any hover bind events
var pos = { pageX: e.pageX, pageY: e.pageY };
target.trigger(eventname, [pos, item]);
}
function highlight(s, auto) {
//if (typeof s == "number") {
// s = series[s];
//}
var i = indexOfHighlight(s);
if (i === -1) {
highlights.push({ series: s, auto: auto });
plot.triggerRedrawOverlay();
} else if (!auto) {
highlights[i].auto = false;
}
}
function unhighlight(s) {
if (s == null) {
highlights = [];
plot.triggerRedrawOverlay();
}
//if (typeof s == "number") {
// s = series[s];
//}
var i = indexOfHighlight(s);
if (i !== -1) {
highlights.splice(i, 1);
plot.triggerRedrawOverlay();
}
}
function indexOfHighlight(s) {
for (var i = 0; i < highlights.length; ++i) {
var h = highlights[i];
if (h.series === s) {
return i;
}
}
return -1;
}
function drawOverlay(plot, octx) {
var options = plot.getOptions();
var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius;
octx.save();
octx.translate(centerLeft, centerTop);
octx.scale(1, options.series.pie.tilt);
for (var i = 0; i < highlights.length; ++i) {
drawHighlight(highlights[i].series);
}
drawDonutHole(octx);
octx.restore();
function drawHighlight(series) {
if (series.angle <= 0 || isNaN(series.angle)) {
return;
}
//octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString();
octx.fillStyle = "rgba(255, 255, 255, " + options.series.pie.highlight.opacity + ")"; // this is temporary until we have access to parseColor
octx.beginPath();
if (Math.abs(series.angle - Math.PI * 2) > 0.000000001) {
octx.moveTo(0, 0); // Center of the pie
}
octx.arc(0, 0, radius, series.startAngle, series.startAngle + series.angle / 2, false);
octx.arc(0, 0, radius, series.startAngle + series.angle / 2, series.startAngle + series.angle, false);
octx.closePath();
octx.fill();
}
}
} // end init (plugin body)
// define pie specific options and their default values
var options = {
series: {
pie: {
show: false,
radius: "auto", // actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value)
innerRadius: 0, /* for donut */
startAngle: 3 / 2,
tilt: 1,
shadow: {
left: 5, // shadow left offset
top: 15, // shadow top offset
alpha: 0.02 // shadow alpha
},
offset: {
top: 0,
left: "auto"
},
stroke: {
color: "#fff",
width: 1
},
label: {
show: "auto",
formatter: function(label, slice) {
return "<div style='font-size:x-small;text-align:center;padding:2px;color:" + slice.color + ";'>" + label + "<br/>" + Math.round(slice.percent) + "%</div>";
}, // formatter function
radius: 1, // radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value)
background: {
color: null,
opacity: 0
},
threshold: 0 // percentage at which to hide the label (i.e. the slice is too narrow)
},
combine: {
threshold: -1, // percentage at which to combine little slices into one larger slice
color: null, // color to give the new slice (auto-generated if null)
label: "Other" // label to give the new slice
},
highlight: {
//color: "#fff", // will add this functionality once parseColor is available
opacity: 0.5
}
}
}
};
$.plot.plugins.push({
init: init,
options: options,
name: "pie",
version: "1.1"
});
})(jQuery);

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,3 @@
/*! js-cookie v2.2.1 | MIT */
!function(a){var b;if("function"==typeof define&&define.amd&&(define(a),b=!0),"object"==typeof exports&&(module.exports=a(),b=!0),!b){var c=window.Cookies,d=window.Cookies=a();d.noConflict=function(){return window.Cookies=c,d}}}(function(){function a(){for(var a=0,b={};a<arguments.length;a++){var c=arguments[a];for(var d in c)b[d]=c[d]}return b}function b(a){return a.replace(/(%[0-9A-Z]{2})+/g,decodeURIComponent)}function c(d){function e(){}function f(b,c,f){if("undefined"!=typeof document){f=a({path:"/"},e.defaults,f),"number"==typeof f.expires&&(f.expires=new Date(1*new Date+864e5*f.expires)),f.expires=f.expires?f.expires.toUTCString():"";try{var g=JSON.stringify(c);/^[\{\[]/.test(g)&&(c=g)}catch(j){}c=d.write?d.write(c,b):encodeURIComponent(c+"").replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),b=encodeURIComponent(b+"").replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent).replace(/[\(\)]/g,escape);var h="";for(var i in f)f[i]&&(h+="; "+i,!0!==f[i]&&(h+="="+f[i].split(";")[0]));return document.cookie=b+"="+c+h}}function g(a,c){if("undefined"!=typeof document){for(var e={},f=document.cookie?document.cookie.split("; "):[],g=0;g<f.length;g++){var h=f[g].split("="),i=h.slice(1).join("=");c||'"'!==i.charAt(0)||(i=i.slice(1,-1));try{var j=b(h[0]);if(i=(d.read||d)(i,j)||b(i),c)try{i=JSON.parse(i)}catch(k){}if(e[j]=i,a===j)break}catch(k){}}return a?e[a]:e}}return e.set=f,e.get=function(a){return g(a,!1)},e.getJSON=function(a){return g(a,!0)},e.remove=function(b,c){f(b,"",a(c,{expires:-1}))},e.defaults={},e.withConverter=c,e}return c(function(){})});

View File

@ -0,0 +1,64 @@
/*
* dragtable
* @Version 2.0.14 MOD
* default css
*/
.dragtable-sortable {
list-style-type: none;
margin: 0;
padding: 0;
-moz-user-select: none;
z-index: 10;
}
.dragtable-sortable li {
margin: 0;
padding: 0;
float: left;
font-size: 1em;
}
.dragtable-sortable table {
margin-top: 0;
}
.dragtable-sortable th, .dragtable-sortable td {
border-left: 0px;
}
.dragtable-sortable li:first-child th, .dragtable-sortable li:first-child td {
border-left: 1px solid #CCC;
}
.dragtable-handle-selected {
/* table-handle class while actively dragging a column */
}
.ui-sortable-helper {
opacity: 0.7;
filter: alpha(opacity=70);
}
.ui-sortable-placeholder {
-moz-box-shadow: 4px 5px 4px rgba(0,0,0,0.2) inset;
-webkit-box-shadow: 4px 5px 4px rgba(0,0,0,0.2) inset;
box-shadow: 4px 5px 4px rgba(0,0,0,0.2) inset;
border-bottom: 1px solid rgba(0,0,0,0.2);
border-top: 1px solid rgba(0,0,0,0.2);
visibility: visible !important;
/* change the background color here to match the tablesorter theme */
background: #EFEFEF;
}
.ui-sortable-placeholder * {
opacity: 0.0;
visibility: hidden;
}
.table-handle, .table-handle-disabled {
/* background-image: url(images/dragtable-handle.png); */
/* background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAANAQMAAAC5Li2yAAAABlBMVEUAAAAzMzPI8eYgAAAAAnRSTlMAzORBQ6MAAAAOSURBVAjXYwABByyYAQAQWgFBLN2RnwAAAABJRU5ErkJggg=='); */
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyIiBoZWlnaHQ9IjEzIj48cmVjdCBzdHlsZT0iZmlsbDojMzMzO2ZpbGwtb3BhY2l0eTouODsiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHg9IjEiIHk9IjIiLz4JPHJlY3Qgc3R5bGU9ImZpbGw6IzMzMztmaWxsLW9wYWNpdHk6Ljg7IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4PSIxIiB5PSI0Ii8+CTxyZWN0IHN0eWxlPSJmaWxsOiMzMzM7ZmlsbC1vcGFjaXR5Oi44OyIgd2lkdGg9IjEiIGhlaWdodD0iMSIgeD0iMSIgeT0iNiIvPjxyZWN0IHN0eWxlPSJmaWxsOiMzMzM7ZmlsbC1vcGFjaXR5Oi44OyIgd2lkdGg9IjEiIGhlaWdodD0iMSIgeD0iMSIgeT0iOCIvPjxyZWN0IHN0eWxlPSJmaWxsOiMzMzM7ZmlsbC1vcGFjaXR5Oi44OyIgd2lkdGg9IjEiIGhlaWdodD0iMSIgeD0iMSIgeT0iMTAiLz48L3N2Zz4=);
background-repeat: repeat-x;
height: 13px;
margin: 0 1px;
cursor: move;
}
.table-handle-disabled {
opacity: 0;
cursor: not-allowed;
}
.dragtable-sortable table {
margin-bottom: 0;
}

View File

@ -0,0 +1,183 @@
/**** Filter Formatter Elements ****/
.tablesorter .tablesorter-filter-row td {
text-align: center;
font-size: 0.9em;
font-weight: normal;
}
/**** Sliders ****/
/* shrink the sliders to look nicer inside of a table cell */
.tablesorter .ui-slider, .tablesorter input.range {
width: 90%;
margin: 2px auto 2px auto; /* add enough top margin so the tooltips will fit */
font-size: 0.8em;
}
.tablesorter .ui-slider {
top: 12px;
}
.tablesorter .ui-slider .ui-slider-handle {
width: 0.9em;
height: 0.9em;
}
.tablesorter .ui-datepicker {
font-size: 0.8em;
}
.tablesorter .ui-slider-horizontal {
height: 0.5em;
}
/* Add tooltips to slider handles */
.tablesorter .value-popup:after {
content : attr(data-value);
position: absolute;
bottom: 14px;
left: -7px;
min-width: 18px;
height: 12px;
background-color: #444;
background-image: -webkit-gradient(linear, left top, left bottom, from(#444444), to(#999999));
background-image: -webkit-linear-gradient(top, #444, #999);
background-image: -moz-linear-gradient(top, #444, #999);
background-image: -o-linear-gradient(top, #444, #999);
background-image: linear-gradient(to bottom, #444, #999);
-webkit-border-radius: 3px;
border-radius: 3px;
-webkit-background-clip: padding-box; background-clip: padding-box;
-webkit-box-shadow: 0px 0px 4px 0px #777;
box-shadow: 0px 0px 4px 0px #777;
border: #444 1px solid;
color: #fff;
font: 1em/1.1em Arial, Sans-Serif;
padding: 1px;
text-align: center;
}
.tablesorter .value-popup:before {
content: "";
position: absolute;
width: 0;
height: 0;
border-top: 8px solid #777;
border-left: 8px solid transparent;
border-right: 8px solid transparent;
top: -8px;
left: 50%;
margin-left: -8px;
margin-top: -1px;
}
/**** Date Picker ****/
.tablesorter .dateFrom, .tablesorter .dateTo {
width: 80px;
margin: 2px 5px;
}
/**** Color Picker/HTML5Number Toggle button ****/
.tablesorter .button {
width: 14px;
height: 14px;
background: #fcfff4;
background: -webkit-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
background: -moz-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
background: -o-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
background: -ms-linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
background: linear-gradient(top, #fcfff4 0%, #dfe5d7 40%, #b3bead 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fcfff4', endColorstr='#b3bead', GradientType=0 );
margin: 1px 5px 1px 1px;
-webkit-border-radius: 25px;
-moz-border-radius: 25px;
border-radius: 25px;
-webkit-box-shadow: inset 0px 1px 1px white, 0px 1px 3px rgba(0,0,0,0.5);
-moz-box-shadow: inset 0px 1px 1px white, 0px 1px 3px rgba(0,0,0,0.5);
box-shadow: inset 0px 1px 1px white, 0px 1px 3px rgba(0,0,0,0.5);
position: relative;
top: 3px;
display: inline-block;
}
.tablesorter .button label {
cursor: pointer;
position: absolute;
width: 10px;
height: 10px;
-webkit-border-radius: 25px;
-moz-border-radius: 25px;
border-radius: 25px;
left: 2px;
top: 2px;
-webkit-box-shadow: inset 0px 1px 1px rgba(0,0,0,0.5), 0px 1px 0px rgba(255,255,255,1);
-moz-box-shadow: inset 0px 1px 1px rgba(0,0,0,0.5), 0px 1px 0px rgba(255,255,255,1);
box-shadow: inset 0px 1px 1px rgba(0,0,0,0.5), 0px 1px 0px rgba(255,255,255,1);
background: #45484d;
background: -webkit-linear-gradient(top, #222 0%, #45484d 100%);
background: -moz-linear-gradient(top, #222 0%, #45484d 100%);
background: -o-linear-gradient(top, #222 0%, #45484d 100%);
background: -ms-linear-gradient(top, #222 0%, #45484d 100%);
background: linear-gradient(top, #222 0%, #45484d 100%);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#222', endColorstr='#45484d', GradientType=0 );
}
.tablesorter .button label:after {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);
opacity: 0;
content: '';
position: absolute;
width: 8px;
height: 8px;
background: #55f;
background: -webkit-linear-gradient(top, #aaf 0%, #55f 100%);
background: -moz-linear-gradient(top, #aaf 0%, #55f 100%);
background: -o-linear-gradient(top, #aaf 0%, #55f 100%);
background: -ms-linear-gradient(top, #aaf 0%, #55f 100%);
background: linear-gradient(top, #aaf 0%, #55f 100%);
-webkit-border-radius: 25px;
-moz-border-radius: 25px;
border-radius: 25px;
top: 1px;
left: 1px;
-webkit-box-shadow: inset 0px 1px 1px #fff, 0px 1px 3px rgba(0,0,0,0.5);
-moz-box-shadow: inset 0px 1px 1px #fff, 0px 1px 3px rgba(0,0,0,0.5);
box-shadow: inset 0px 1px 1px #fff, 0px 1px 3px rgba(0,0,0,0.5);
}
.tablesorter .button label:hover::after {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)";
filter: alpha(opacity=30);
opacity: 0.3;
}
.tablesorter .button input[type=checkbox] {
visibility: hidden;
}
.tablesorter .button input[type=checkbox]:checked + label:after {
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
filter: alpha(opacity=100);
opacity: 1;
}
.tablesorter .colorpicker {
width: 30px;
height: 18px;
}
.tablesorter .ui-spinner-input {
width: 100px;
height: 18px;
}
.tablesorter .currentColor, .tablesorter .ui-spinner {
position: relative;
}
.tablesorter input.number {
position: relative;
}
/* hide filter row */
.tablesorter .tablesorter-filter-row.hideme td * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}

View File

@ -0,0 +1,104 @@
/* CSS Column & Row Hightlights - matches the blue theme
* See https://mottie.github.io/tablesorter/docs/example-css-highlighting.html
*/
table.hover-highlight td:before,
table.focus-highlight td:before {
background: #fff;
}
/* ODD ZEBRA STRIPE color (needs zebra widget) */
.hover-highlight .odd td:before, .hover-highlight .odd th:before,
.focus-highlight .odd td:before, .focus-highlight .odd th:before {
background: #ebf2fa;
}
/* EVEN ZEBRA STRIPE color (needs zebra widget) */
.hover-highlight .even td:before, .hover-highlight .even th:before,
.focus-highlight .even td:before, .focus-highlight .even th:before {
background-color: #fff;
}
/* FOCUS ROW highlight color (touch devices) */
.focus-highlight td:focus::before, .focus-highlight th:focus::before {
background-color: lightblue;
}
/* FOCUS COLUMN highlight color (touch devices) */
.focus-highlight td:focus::after, .focus-highlight th:focus::after {
background-color: lightblue;
}
/* FOCUS CELL highlight color */
.focus-highlight th:focus, .focus-highlight td:focus,
.focus-highlight .even th:focus, .focus-highlight .even td:focus,
.focus-highlight .odd th:focus, .focus-highlight .odd td:focus {
background-color: #d9d9d9;
color: #333;
}
/* HOVER ROW highlight colors */
table.hover-highlight tbody > tr:hover > td, /* override tablesorter theme row hover */
table.hover-highlight tbody > tr.odd:hover > td,
table.hover-highlight tbody > tr.even:hover > td {
background-color: #ffa;
}
/* HOVER COLUMN highlight colors */
.hover-highlight tbody tr td:hover::after,
.hover-highlight tbody tr th:hover::after {
background-color: #ffa;
}
/* ************************************************* */
/* **** No need to modify the definitions below **** */
/* ************************************************* */
.focus-highlight td:focus::after, .focus-highlight th:focus::after,
.hover-highlight td:hover::after, .hover-highlight th:hover::after {
content: '';
position: absolute;
width: 100%;
height: 999em;
left: 0;
top: -555em;
z-index: -1;
}
.focus-highlight td:focus::before, .focus-highlight th:focus::before {
content: '';
position: absolute;
width: 999em;
height: 100%;
left: -555em;
top: 0;
z-index: -2;
}
/* required styles */
.hover-highlight,
.focus-highlight {
overflow: hidden;
}
.hover-highlight td, .hover-highlight th,
.focus-highlight td, .focus-highlight th {
position: relative;
outline: 0;
}
/* override the tablesorter theme styling */
table.hover-highlight, table.hover-highlight tbody > tr > td,
table.focus-highlight, table.focus-highlight tbody > tr > td,
/* override zebra styling */
table.hover-highlight tbody tr.even > th,
table.hover-highlight tbody tr.even > td,
table.hover-highlight tbody tr.odd > th,
table.hover-highlight tbody tr.odd > td,
table.focus-highlight tbody tr.even > th,
table.focus-highlight tbody tr.even > td,
table.focus-highlight tbody tr.odd > th,
table.focus-highlight tbody tr.odd > td {
background: transparent;
}
/* table background positioned under the highlight */
table.hover-highlight td:before,
table.focus-highlight td:before {
content: '';
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
z-index: -3;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,192 @@
/*************
Black Ice Theme (by thezoggy)
*************/
/* overall */
.tablesorter-blackice {
width: 100%;
margin-right: auto;
margin-left: auto;
font: 11px/18px Arial, Sans-serif;
text-align: left;
background-color: #000;
border-collapse: collapse;
border-spacing: 0;
}
/* header */
.tablesorter-blackice th,
.tablesorter-blackice thead td {
padding: 4px;
font: 13px/20px Arial, Sans-serif;
font-weight: bold;
color: #e5e5e5;
text-align: left;
text-shadow: 0 1px 0 rgba(0, 0, 0, 0.7);
background-color: #111;
border: 1px solid #232323;
}
.tablesorter-blackice .header,
.tablesorter-blackice .tablesorter-header {
padding: 4px 20px 4px 4px;
cursor: pointer;
background-image: url(data:image/gif;base64,R0lGODlhFQAJAIAAAP///////yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==);
background-position: center right;
background-repeat: no-repeat;
}
.tablesorter-blackice .headerSortUp,
.tablesorter-blackice .tablesorter-headerSortUp,
.tablesorter-blackice .tablesorter-headerAsc {
background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);
color: #fff;
}
.tablesorter-blackice .headerSortDown,
.tablesorter-blackice .tablesorter-headerSortDown,
.tablesorter-blackice .tablesorter-headerDesc {
color: #fff;
background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);
}
.tablesorter-blackice thead .sorter-false {
background-image: none;
cursor: default;
padding: 4px;
}
/* tfoot */
.tablesorter-blackice tfoot .tablesorter-headerSortUp,
.tablesorter-blackice tfoot .tablesorter-headerSortDown,
.tablesorter-blackice tfoot .tablesorter-headerAsc,
.tablesorter-blackice tfoot .tablesorter-headerDesc {
/* remove sort arrows from footer */
background-image: none;
}
/* tbody */
.tablesorter-blackice td {
padding: 4px;
color: #ccc;
vertical-align: top;
background-color: #333;
border: 1px solid #232323;
}
/* hovered row colors */
.tablesorter-blackice tbody > tr.hover > td,
.tablesorter-blackice tbody > tr:hover > td,
.tablesorter-blackice tbody > tr.even:hover > td,
.tablesorter-blackice tbody > tr.odd:hover > td {
background-color: #000;
}
/* table processing indicator */
.tablesorter-blackice .tablesorter-processing {
background-position: center center !important;
background-repeat: no-repeat !important;
/* background-image: url(images/loading.gif) !important; */
background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=') !important;
}
/* Zebra Widget - row alternating colors */
.tablesorter-blackice tr.odd > td {
background-color: #333;
}
.tablesorter-blackice tr.even > td {
background-color: #393939;
}
/* Column Widget - column sort colors */
.tablesorter-blackice td.primary,
.tablesorter-blackice tr.odd td.primary {
background-color: #2f3a40;
}
.tablesorter-blackice tr.even td.primary {
background-color: #3f4a50;
}
.tablesorter-blackice td.secondary,
.tablesorter-blackice tr.odd td.secondary {
background-color: #3f4a50;
}
.tablesorter-blackice tr.even td.secondary {
background-color: #4f5a60;
}
.tablesorter-blackice td.tertiary,
.tablesorter-blackice tr.odd td.tertiary {
background-color: #4f5a60;
}
.tablesorter-blackice tr.even td.tertiary {
background-color: #5a646b;
}
/* caption */
.tablesorter-blackice > caption {
background-color: #fff;
}
/* filter widget */
.tablesorter-blackice .tablesorter-filter-row {
background-color: #222;
}
.tablesorter-blackice .tablesorter-filter-row td {
background-color: #222;
line-height: normal;
text-align: center; /* center the input */
-webkit-transition: line-height 0.1s ease;
-moz-transition: line-height 0.1s ease;
-o-transition: line-height 0.1s ease;
transition: line-height 0.1s ease;
}
/* optional disabled input styling */
.tablesorter-blackice .tablesorter-filter-row .disabled {
opacity: 0.5;
filter: alpha(opacity=50);
cursor: not-allowed;
}
/* hidden filter row */
.tablesorter-blackice .tablesorter-filter-row.hideme td {
/*** *********************************************** ***/
/*** change this padding to modify the thickness ***/
/*** of the closed filter row (height = padding x 2) ***/
padding: 2px;
/*** *********************************************** ***/
margin: 0;
line-height: 0;
cursor: pointer;
}
.tablesorter-blackice .tablesorter-filter-row.hideme * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
/* filters */
.tablesorter-blackice input.tablesorter-filter,
.tablesorter-blackice select.tablesorter-filter {
width: 98%;
height: auto;
margin: 0;
padding: 4px;
background-color: #fff;
border: 1px solid #bbb;
color: #333;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: height 0.1s ease;
-moz-transition: height 0.1s ease;
-o-transition: height 0.1s ease;
transition: height 0.1s ease;
}
/* rows hidden by filtering (needed for child rows) */
.tablesorter .filtered {
display: none;
}
/* ajax error row */
.tablesorter .tablesorter-errorRow td {
text-align: center;
cursor: pointer;
background-color: #e6bf99;
}

View File

@ -0,0 +1,229 @@
/*************
Blue Theme
*************/
/* overall */
.tablesorter-blue {
width: 100%;
background-color: #fff;
margin: 10px 0 15px;
text-align: left;
border-spacing: 0;
border: #cdcdcd 1px solid;
border-width: 1px 0 0 1px;
}
.tablesorter-blue th,
.tablesorter-blue td {
border: #cdcdcd 1px solid;
border-width: 0 1px 1px 0;
}
/* header */
.tablesorter-blue th,
.tablesorter-blue thead td {
font: 12px/18px Arial, Sans-serif;
font-weight: bold;
color: #000;
background-color: #99bfe6;
border-collapse: collapse;
padding: 4px;
text-shadow: 0 1px 0 rgba(204, 204, 204, 0.7);
}
.tablesorter-blue tbody td,
.tablesorter-blue tfoot th,
.tablesorter-blue tfoot td {
padding: 4px;
vertical-align: top;
}
.tablesorter-blue .header,
.tablesorter-blue .tablesorter-header {
/* black (unsorted) double arrow */
background-image: url(data:image/gif;base64,R0lGODlhFQAJAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==);
/* white (unsorted) double arrow */
/* background-image: url(data:image/gif;base64,R0lGODlhFQAJAIAAAP///////yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==); */
/* image */
/* background-image: url(images/black-unsorted.gif); */
background-repeat: no-repeat;
background-position: center right;
padding: 4px 18px 4px 4px;
white-space: normal;
cursor: pointer;
}
.tablesorter-blue .headerSortUp,
.tablesorter-blue .tablesorter-headerSortUp,
.tablesorter-blue .tablesorter-headerAsc {
background-color: #9fbfdf;
/* black asc arrow */
background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);
/* white asc arrow */
/* background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7); */
/* image */
/* background-image: url(images/black-asc.gif); */
}
.tablesorter-blue .headerSortDown,
.tablesorter-blue .tablesorter-headerSortDown,
.tablesorter-blue .tablesorter-headerDesc {
background-color: #8cb3d9;
/* black desc arrow */
background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);
/* white desc arrow */
/* background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7); */
/* image */
/* background-image: url(images/black-desc.gif); */
}
.tablesorter-blue thead .sorter-false {
background-image: none;
cursor: default;
padding: 4px;
}
/* tfoot */
.tablesorter-blue tfoot .tablesorter-headerSortUp,
.tablesorter-blue tfoot .tablesorter-headerSortDown,
.tablesorter-blue tfoot .tablesorter-headerAsc,
.tablesorter-blue tfoot .tablesorter-headerDesc {
/* remove sort arrows from footer */
background-image: none;
}
/* tbody */
.tablesorter-blue td {
color: #3d3d3d;
background-color: #fff;
padding: 4px;
vertical-align: top;
}
/* hovered row colors
you'll need to add additional lines for
rows with more than 2 child rows
*/
.tablesorter-blue tbody > tr.hover > td,
.tablesorter-blue tbody > tr:hover > td,
.tablesorter-blue tbody > tr:hover + tr.tablesorter-childRow > td,
.tablesorter-blue tbody > tr:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td,
.tablesorter-blue tbody > tr.even.hover > td,
.tablesorter-blue tbody > tr.even:hover > td,
.tablesorter-blue tbody > tr.even:hover + tr.tablesorter-childRow > td,
.tablesorter-blue tbody > tr.even:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td {
background-color: #d9d9d9;
}
.tablesorter-blue tbody > tr.odd.hover > td,
.tablesorter-blue tbody > tr.odd:hover > td,
.tablesorter-blue tbody > tr.odd:hover + tr.tablesorter-childRow > td,
.tablesorter-blue tbody > tr.odd:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td {
background-color: #bfbfbf;
}
/* table processing indicator */
.tablesorter-blue .tablesorter-processing {
background-position: center center !important;
background-repeat: no-repeat !important;
/* background-image: url(images/loading.gif) !important; */
background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=') !important;
}
/* Zebra Widget - row alternating colors */
.tablesorter-blue tbody tr.odd > td {
background-color: #ebf2fa;
}
.tablesorter-blue tbody tr.even > td {
background-color: #fff;
}
/* Column Widget - column sort colors */
.tablesorter-blue td.primary,
.tablesorter-blue tr.odd td.primary {
background-color: #99b3e6;
}
.tablesorter-blue tr.even td.primary {
background-color: #c2d1f0;
}
.tablesorter-blue td.secondary,
.tablesorter-blue tr.odd td.secondary {
background-color: #c2d1f0;
}
.tablesorter-blue tr.even td.secondary {
background-color: #d6e0f5;
}
.tablesorter-blue td.tertiary,
.tablesorter-blue tr.odd td.tertiary {
background-color: #d6e0f5;
}
.tablesorter-blue tr.even td.tertiary {
background-color: #ebf0fa;
}
/* caption */
.tablesorter-blue > caption {
background-color: #fff;
}
/* filter widget */
.tablesorter-blue .tablesorter-filter-row {
background-color: #eee;
}
.tablesorter-blue .tablesorter-filter-row td {
background-color: #eee;
line-height: normal;
text-align: center; /* center the input */
-webkit-transition: line-height 0.1s ease;
-moz-transition: line-height 0.1s ease;
-o-transition: line-height 0.1s ease;
transition: line-height 0.1s ease;
}
/* optional disabled input styling */
.tablesorter-blue .tablesorter-filter-row .disabled {
opacity: 0.5;
filter: alpha(opacity=50);
cursor: not-allowed;
}
/* hidden filter row */
.tablesorter-blue .tablesorter-filter-row.hideme td {
/*** *********************************************** ***/
/*** change this padding to modify the thickness ***/
/*** of the closed filter row (height = padding x 2) ***/
padding: 2px;
/*** *********************************************** ***/
margin: 0;
line-height: 0;
cursor: pointer;
}
.tablesorter-blue .tablesorter-filter-row.hideme * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
/* filters */
.tablesorter-blue input.tablesorter-filter,
.tablesorter-blue select.tablesorter-filter {
width: 98%;
height: auto;
margin: 0;
padding: 4px;
background-color: #fff;
border: 1px solid #bbb;
color: #333;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: height 0.1s ease;
-moz-transition: height 0.1s ease;
-o-transition: height 0.1s ease;
transition: height 0.1s ease;
}
/* rows hidden by filtering (needed for child rows) */
.tablesorter .filtered {
display: none;
}
/* ajax error row */
.tablesorter .tablesorter-errorRow td {
text-align: center;
cursor: pointer;
background-color: #e6bf99;
}

View File

@ -0,0 +1,193 @@
/**
* Bootstrap theme v3.x
*
* WARNING!... once a stable Bootstrap v4.x is released,
* this file will be removed; use theme.bootstrap_3.css
*/
.tablesorter-bootstrap {
width: 100%;
}
.tablesorter-bootstrap thead th,
.tablesorter-bootstrap thead td,
.tablesorter-bootstrap tfoot th,
.tablesorter-bootstrap tfoot td {
font: 14px/20px Arial, Sans-serif;
font-weight: bold;
padding: 4px;
margin: 0 0 18px;
background-color: #eee;
}
.tablesorter-bootstrap .tablesorter-header {
cursor: pointer;
}
.tablesorter-bootstrap .sorter-false {
cursor: default;
}
.tablesorter-bootstrap .tablesorter-header.sorter-false i.tablesorter-icon {
display: none;
}
.tablesorter-bootstrap .tablesorter-header-inner {
position: relative;
padding: 4px 18px 4px 4px;
}
.tablesorter-bootstrap .sorter-false .tablesorter-header-inner {
padding: 4px;
}
/* bootstrap uses <i> for icons */
.tablesorter-bootstrap .tablesorter-header i.tablesorter-icon {
font-size: 11px;
position: absolute;
right: 2px;
top: 50%;
margin-top: -7px; /* half the icon height; older IE doesn't like this */
width: 14px;
height: 14px;
background-repeat: no-repeat;
line-height: 14px;
display: inline-block;
}
/* black unsorted icon */
.tablesorter-bootstrap .bootstrap-icon-unsorted {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAAA20lEQVR4AWJABpKSkoxALCstLb0aUAsZaCAMhVEY6B0amx8YZWDDEDSBa2AGe7XeIiAAClYwVGBvsAcIllsf/mvcC9DgOOd8h90fxWvngVEUbZIkuWRZZlE8eQjcisgZMM9zi+LJ6ZfwegmWZflZDugdHMfxTcGqql7TNBlUB/QObtv2VBSFrev6OY7jngzFk9OT/fn73fWYpqnlXNyXDMWT0zuYx/Bvel9ej+LJ6R08DMOu67q7DkTkrSA5vYPneV71fX/QASdTkJwezhs0TfMARn0wMDDGXEPgF4oijqwM5YjNAAAAAElFTkSuQmCC);
}
/* white unsorted icon; updated to use bootstrap-icon-white - see #1432 */
.tablesorter-bootstrap .bootstrap-icon-white.bootstrap-icon-unsorted {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAAAe0lEQVR4AbXQoRWDMBiF0Sh2QLAAQ8SxJGugWSA6A2STW1PxTsnB9cnkfuYvv8OGC1t5G3Y0QMP+Bm857keAdQIzWBP3+Bw4MADQE18B6/etRnCV/w9nnGuLezfAmXhABGtAGIkruvk6auIFRwQJDywllsEAjCecB20GP59BQQ+gtlRLAAAAAElFTkSuQmCC);
}
/* since bootstrap (table-striped) uses nth-child(), we just use this to add a zebra stripe color */
.tablesorter-bootstrap > tbody > tr.odd > td,
.tablesorter-bootstrap > tbody > tr.tablesorter-hasChildRow.odd:hover ~ tr.tablesorter-hasChildRow.odd ~ .tablesorter-childRow.odd > td {
background-color: #f9f9f9;
}
.tablesorter-bootstrap > tbody > tr.hover > td,
.tablesorter-bootstrap > tbody > tr.odd:hover > td,
.tablesorter-bootstrap > tbody > tr.even:hover > td,
.tablesorter-bootstrap > tbody > tr.tablesorter-hasChildRow.odd:hover ~ .tablesorter-childRow.odd > td,
.tablesorter-bootstrap > tbody > tr.tablesorter-hasChildRow.even:hover ~ .tablesorter-childRow.even > td {
background-color: #f5f5f5;
}
.tablesorter-bootstrap > tbody > tr.even > td,
.tablesorter-bootstrap > tbody > tr.tablesorter-hasChildRow.even:hover ~ tr.tablesorter-hasChildRow.even ~ .tablesorter-childRow.even > td {
background-color: #fff;
}
/* processing icon */
.tablesorter-bootstrap .tablesorter-processing {
background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=');
background-position: center center !important;
background-repeat: no-repeat !important;
}
/* Column Widget - column sort colors */
.tablesorter-bootstrap > tbody > tr.odd td.primary {
background-color: #bfbfbf;
}
.tablesorter-bootstrap > tbody > tr td.primary,
.tablesorter-bootstrap > tbody > tr.even td.primary {
background-color: #d9d9d9;
}
.tablesorter-bootstrap > tbody > tr.odd td.secondary {
background-color: #d9d9d9;
}
.tablesorter-bootstrap > tbody > tr td.secondary,
.tablesorter-bootstrap > tbody > tr.even td.secondary {
background-color: #e6e6e6;
}
.tablesorter-bootstrap > tbody > tr.odd td.tertiary {
background-color: #e6e6e6;
}
.tablesorter-bootstrap > tbody > tr td.tertiary,
.tablesorter-bootstrap > tbody > tr.even td.tertiary {
background-color: #f2f2f2;
}
/* caption */
.tablesorter-bootstrap > .caption {
background-color: #fff;
}
/* filter widget */
.tablesorter-bootstrap .tablesorter-filter-row input.tablesorter-filter,
.tablesorter-bootstrap .tablesorter-filter-row select.tablesorter-filter {
width: 98%;
margin: 0;
padding: 4px 6px;
color: #333;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: height 0.1s ease;
-moz-transition: height 0.1s ease;
-o-transition: height 0.1s ease;
transition: height 0.1s ease;
}
.tablesorter-bootstrap .tablesorter-filter-row .tablesorter-filter.disabled {
background-color: #eee;
color: #555;
cursor: not-allowed;
border: 1px solid #ccc;
border-radius: 4px;
box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset;
box-sizing: border-box;
transition: height 0.1s ease;
}
.tablesorter-bootstrap .tablesorter-filter-row {
background-color: #efefef;
}
.tablesorter-bootstrap .tablesorter-filter-row td {
background-color: #efefef;
line-height: normal;
text-align: center;
padding: 4px 6px;
vertical-align: middle;
-webkit-transition: line-height 0.1s ease;
-moz-transition: line-height 0.1s ease;
-o-transition: line-height 0.1s ease;
transition: line-height 0.1s ease;
}
/* hidden filter row */
.tablesorter-bootstrap .tablesorter-filter-row.hideme td {
padding: 2px; /* change this to modify the thickness of the closed border row */
margin: 0;
line-height: 0;
}
.tablesorter-bootstrap .tablesorter-filter-row.hideme * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
/* rows hidden by filtering */
.tablesorter .filtered {
display: none;
}
/* pager plugin */
.tablesorter-bootstrap .tablesorter-pager select {
padding: 4px 6px;
}
.tablesorter-bootstrap .tablesorter-pager .pagedisplay {
border: 0;
}
/* tfoot i for pager controls */
.tablesorter-bootstrap tfoot i {
font-size: 11px;
}
/* ajax error row */
.tablesorter .tablesorter-errorRow td {
text-align: center;
cursor: pointer;
background-color: #e6bf99;
}

View File

@ -0,0 +1,188 @@
/**
* Bootstrap theme v2.x
*/
.tablesorter-bootstrap {
width: 100%;
}
.tablesorter-bootstrap .tablesorter-header,
.tablesorter-bootstrap tfoot th,
.tablesorter-bootstrap tfoot td {
font: 14px/20px Arial, Sans-serif;
font-weight: bold;
position: relative;
padding: 8px;
margin: 0 0 18px;
list-style: none;
background-color: #FBFBFB;
background-image: -moz-linear-gradient(top, white, #efefef);
background-image: -ms-linear-gradient(top, white, #efefef);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(white), to(#efefef));
background-image: -webkit-linear-gradient(top, white, #efefef);
background-image: -o-linear-gradient(top, white, #efefef);
background-image: linear-gradient(to bottom, white, #efefef);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#efefef', GradientType=0);
background-repeat: repeat-x;
-webkit-box-shadow: inset 0 1px 0 white;
-moz-box-shadow: inset 0 1px 0 #ffffff;
box-shadow: inset 0 1px 0 white;
}
.tablesorter-bootstrap .tablesorter-header {
cursor: pointer;
}
.tablesorter-bootstrap .sorter-false {
cursor: default;
}
.tablesorter-bootstrap .tablesorter-header.sorter-false i.tablesorter-icon {
display: none;
}
.tablesorter-bootstrap .tablesorter-header-inner {
position: relative;
padding: 4px 18px 4px 4px;
}
.tablesorter-bootstrap .sorter-false .tablesorter-header-inner {
padding: 4px;
}
/* bootstrap uses <i> for icons */
.tablesorter-bootstrap .tablesorter-header i.tablesorter-icon {
position: absolute;
right: 2px;
top: 50%;
margin-top: -7px; /* half the icon height; older IE doesn't like this */
width: 14px;
height: 14px;
background-repeat: no-repeat;
line-height: 14px;
display: inline-block;
}
/* black unsorted icon */
.tablesorter-bootstrap .bootstrap-icon-unsorted {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAABGUlEQVR4AZWQAUfEYBzGC07fILfrbnfgqG1jmxliDitmYIaxb9Y3CEIEVHDaUGMfYF8gIyBqbd7eH7wWofB6/J7nN+x/IIRQbz6fH8p3slgsrkl4uv8QNU071XX9wTAMQcLTD6bi2WazubUsq3ddV5AwPftU1tbr9Z0UPhGDIHgjYXp2JS+Xy71t2wNCFEV113UxCdOzKznLshvf9z+SJHlp23ZHR8L07Er+6/u/LO96td1u3zmX/BmdjoTp2ZUchmHted4o/16sVqt7KR6TMD27kpumOc/z/EkOvWmaQp7rlYTp2ZU8juOsqqqLoij2UvhyHEeQMD27knl93x+VZXmZpukz9yVh+l+vMQzDrK7rXRzHjyQ83b8BlglBGLw1Kb4AAAAASUVORK5CYII=);
}
/* white unsorted icon */
.tablesorter-bootstrap .icon-white.bootstrap-icon-unsorted {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAAAe0lEQVR4AbXQoRWDMBiF0Sh2QLAAQ8SxJGugWSA6A2STW1PxTsnB9cnkfuYvv8OGC1t5G3Y0QMP+Bm857keAdQIzWBP3+Bw4MADQE18B6/etRnCV/w9nnGuLezfAmXhABGtAGIkruvk6auIFRwQJDywllsEAjCecB20GP59BQQ+gtlRLAAAAAElFTkSuQmCC);
}
/* since bootstrap (table-striped) uses nth-child(), we just use this to add a zebra stripe color */
.tablesorter-bootstrap tr.odd > td {
background-color: #f9f9f9;
}
.tablesorter-bootstrap tbody > tr.hover > td,
.tablesorter-bootstrap tbody > .odd:hover > td,
.tablesorter-bootstrap tbody > .even:hover > td {
background-color: #f5f5f5;
}
.tablesorter-bootstrap tbody > tr.even > td {
background-color: #fff;
}
/* processing icon */
.tablesorter-bootstrap .tablesorter-processing {
background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=');
position: absolute;
z-index: 1000;
}
/* Column Widget - column sort colors */
.tablesorter-bootstrap > tbody > tr.odd td.primary {
background-color: #bfbfbf;
}
.tablesorter-bootstrap > tbody > tr td.primary,
.tablesorter-bootstrap > tbody > tr.even td.primary {
background-color: #d9d9d9;
}
.tablesorter-bootstrap > tbody > tr.odd td.secondary {
background-color: #d9d9d9;
}
.tablesorter-bootstrap > tbody > tr td.secondary,
.tablesorter-bootstrap > tbody > tr.even td.secondary {
background-color: #e6e6e6;
}
.tablesorter-bootstrap > tbody > tr.odd td.tertiary {
background-color: #e6e6e6;
}
.tablesorter-bootstrap > tbody > tr td.tertiary,
.tablesorter-bootstrap > tbody > tr.even td.tertiary {
background-color: #f2f2f2;
}
/* caption */
.tablesorter-bootstrap > caption {
background-color: #fff;
}
/* filter widget */
.tablesorter-bootstrap .tablesorter-filter-row input.tablesorter-filter,
.tablesorter-bootstrap .tablesorter-filter-row select.tablesorter-filter {
height: 28px;
width: 98%;
margin: 0;
padding: 4px 6px;
background-color: #fff;
color: #333;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: height 0.1s ease;
-moz-transition: height 0.1s ease;
-o-transition: height 0.1s ease;
transition: height 0.1s ease;
}
.tablesorter-bootstrap .tablesorter-filter-row .tablesorter-filter.disabled {
background-color: #eee;
cursor: not-allowed;
}
.tablesorter-bootstrap .tablesorter-filter-row {
background-color: #ddd;
}
.tablesorter-bootstrap .tablesorter-filter-row td {
background-color: #eee;
line-height: normal;
text-align: center;
padding: 4px 6px;
vertical-align: middle;
-webkit-transition: line-height 0.1s ease;
-moz-transition: line-height 0.1s ease;
-o-transition: line-height 0.1s ease;
transition: line-height 0.1s ease;
}
/* hidden filter row */
.tablesorter-bootstrap tr.tablesorter-filter-row.hideme td {
padding: 2px; /* change this to modify the thickness of the closed border row */
margin: 0;
line-height: 0;
}
.tablesorter-bootstrap tr.tablesorter-filter-row.hideme * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
/* rows hidden by filtering */
.tablesorter .filtered {
display: none;
}
/* pager plugin */
.tablesorter-bootstrap .tablesorter-pager select {
padding: 4px 6px;
}
.tablesorter-bootstrap .tablesorter-pager .pagedisplay {
border: 0;
}
/* ajax error row */
.tablesorter .tablesorter-errorRow td {
text-align: center;
cursor: pointer;
background-color: #e6bf99;
}

View File

@ -0,0 +1,190 @@
/**
* Bootstrap theme v3.x
*/
.tablesorter-bootstrap {
width: 100%;
}
.tablesorter-bootstrap thead th,
.tablesorter-bootstrap thead td,
.tablesorter-bootstrap tfoot th,
.tablesorter-bootstrap tfoot td {
font: 14px/20px Arial, Sans-serif;
font-weight: bold;
padding: 4px;
margin: 0 0 18px;
background-color: #eee;
}
.tablesorter-bootstrap .tablesorter-header {
cursor: pointer;
}
.tablesorter-bootstrap .sorter-false {
cursor: default;
}
.tablesorter-bootstrap .tablesorter-header.sorter-false i.tablesorter-icon {
display: none;
}
.tablesorter-bootstrap .tablesorter-header-inner {
position: relative;
padding: 4px 18px 4px 4px;
}
.tablesorter-bootstrap .sorter-false .tablesorter-header-inner {
padding: 4px;
}
/* bootstrap uses <i> for icons */
.tablesorter-bootstrap .tablesorter-header i.tablesorter-icon {
font-size: 11px;
position: absolute;
right: 2px;
top: 50%;
margin-top: -7px; /* half the icon height; older IE doesn't like this */
width: 14px;
height: 14px;
background-repeat: no-repeat;
line-height: 14px;
display: inline-block;
}
/* black unsorted icon */
.tablesorter-bootstrap .bootstrap-icon-unsorted {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAAA20lEQVR4AWJABpKSkoxALCstLb0aUAsZaCAMhVEY6B0amx8YZWDDEDSBa2AGe7XeIiAAClYwVGBvsAcIllsf/mvcC9DgOOd8h90fxWvngVEUbZIkuWRZZlE8eQjcisgZMM9zi+LJ6ZfwegmWZflZDugdHMfxTcGqql7TNBlUB/QObtv2VBSFrev6OY7jngzFk9OT/fn73fWYpqnlXNyXDMWT0zuYx/Bvel9ej+LJ6R08DMOu67q7DkTkrSA5vYPneV71fX/QASdTkJwezhs0TfMARn0wMDDGXEPgF4oijqwM5YjNAAAAAElFTkSuQmCC);
}
/* white unsorted icon; updated to use bootstrap-icon-white - see #1432 */
.tablesorter-bootstrap .bootstrap-icon-white.bootstrap-icon-unsorted {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAOCAYAAAD5YeaVAAAAe0lEQVR4AbXQoRWDMBiF0Sh2QLAAQ8SxJGugWSA6A2STW1PxTsnB9cnkfuYvv8OGC1t5G3Y0QMP+Bm857keAdQIzWBP3+Bw4MADQE18B6/etRnCV/w9nnGuLezfAmXhABGtAGIkruvk6auIFRwQJDywllsEAjCecB20GP59BQQ+gtlRLAAAAAElFTkSuQmCC);
}
/* since bootstrap (table-striped) uses nth-child(), we just use this to add a zebra stripe color */
.tablesorter-bootstrap > tbody > tr.odd > td,
.tablesorter-bootstrap > tbody > tr.tablesorter-hasChildRow.odd:hover ~ tr.tablesorter-hasChildRow.odd ~ .tablesorter-childRow.odd > td {
background-color: #f9f9f9;
}
.tablesorter-bootstrap > tbody > tr.hover > td,
.tablesorter-bootstrap > tbody > tr.odd:hover > td,
.tablesorter-bootstrap > tbody > tr.even:hover > td,
.tablesorter-bootstrap > tbody > tr.tablesorter-hasChildRow.odd:hover ~ .tablesorter-childRow.odd > td,
.tablesorter-bootstrap > tbody > tr.tablesorter-hasChildRow.even:hover ~ .tablesorter-childRow.even > td {
background-color: #f5f5f5;
}
.tablesorter-bootstrap > tbody > tr.even > td,
.tablesorter-bootstrap > tbody > tr.tablesorter-hasChildRow.even:hover ~ tr.tablesorter-hasChildRow.even ~ .tablesorter-childRow.even > td {
background-color: #fff;
}
/* processing icon */
.tablesorter-bootstrap .tablesorter-processing {
background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=');
background-position: center center !important;
background-repeat: no-repeat !important;
}
/* Column Widget - column sort colors */
.tablesorter-bootstrap > tbody > tr.odd td.primary {
background-color: #bfbfbf;
}
.tablesorter-bootstrap > tbody > tr td.primary,
.tablesorter-bootstrap > tbody > tr.even td.primary {
background-color: #d9d9d9;
}
.tablesorter-bootstrap > tbody > tr.odd td.secondary {
background-color: #d9d9d9;
}
.tablesorter-bootstrap > tbody > tr td.secondary,
.tablesorter-bootstrap > tbody > tr.even td.secondary {
background-color: #e6e6e6;
}
.tablesorter-bootstrap > tbody > tr.odd td.tertiary {
background-color: #e6e6e6;
}
.tablesorter-bootstrap > tbody > tr td.tertiary,
.tablesorter-bootstrap > tbody > tr.even td.tertiary {
background-color: #f2f2f2;
}
/* caption */
.tablesorter-bootstrap > .caption {
background-color: #fff;
}
/* filter widget */
.tablesorter-bootstrap .tablesorter-filter-row input.tablesorter-filter,
.tablesorter-bootstrap .tablesorter-filter-row select.tablesorter-filter {
width: 98%;
margin: 0;
padding: 4px 6px;
color: #333;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: height 0.1s ease;
-moz-transition: height 0.1s ease;
-o-transition: height 0.1s ease;
transition: height 0.1s ease;
}
.tablesorter-bootstrap .tablesorter-filter-row .tablesorter-filter.disabled {
background-color: #eee;
color: #555;
cursor: not-allowed;
border: 1px solid #ccc;
border-radius: 4px;
box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset;
box-sizing: border-box;
transition: height 0.1s ease;
}
.tablesorter-bootstrap .tablesorter-filter-row {
background-color: #efefef;
}
.tablesorter-bootstrap .tablesorter-filter-row td {
background-color: #efefef;
line-height: normal;
text-align: center;
padding: 4px 6px;
vertical-align: middle;
-webkit-transition: line-height 0.1s ease;
-moz-transition: line-height 0.1s ease;
-o-transition: line-height 0.1s ease;
transition: line-height 0.1s ease;
}
/* hidden filter row */
.tablesorter-bootstrap .tablesorter-filter-row.hideme td {
padding: 2px; /* change this to modify the thickness of the closed border row */
margin: 0;
line-height: 0;
}
.tablesorter-bootstrap .tablesorter-filter-row.hideme * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
/* rows hidden by filtering */
.tablesorter .filtered {
display: none;
}
/* pager plugin */
.tablesorter-bootstrap .tablesorter-pager select {
padding: 4px 6px;
}
.tablesorter-bootstrap .tablesorter-pager .pagedisplay {
border: 0;
}
/* tfoot i for pager controls */
.tablesorter-bootstrap tfoot i {
font-size: 11px;
}
/* ajax error row */
.tablesorter .tablesorter-errorRow td {
text-align: center;
cursor: pointer;
background-color: #e6bf99;
}

View File

@ -0,0 +1,188 @@
/**
* Bootstrap theme v4.x
*/
.tablesorter-bootstrap {
width: 100%;
}
.tablesorter-bootstrap thead th,
.tablesorter-bootstrap thead td,
.tablesorter-bootstrap tfoot th,
.tablesorter-bootstrap tfoot td {
font: 14px/20px Arial, Sans-serif;
font-weight: bold;
padding: 4px;
margin: 0 0 18px;
}
.tablesorter-bootstrap thead .tablesorter-header {
background-position: right 5px center;
background-repeat: no-repeat;
cursor: pointer;
white-space: normal;
}
.tablesorter-bootstrap:not(.table-dark) thead:not(.thead-dark) .tablesorter-header,
.tablesorter-bootstrap:not(.table-dark) tfoot th,
.tablesorter-bootstrap:not(.table-dark) tfoot td {
background-color: #eee;
}
.tablesorter-bootstrap thead .sorter-false {
cursor: default;
background-image: none;
}
.tablesorter-bootstrap .tablesorter-header-inner {
position: relative;
padding: 4px 18px 4px 4px;
}
.tablesorter-bootstrap .sorter-false .tablesorter-header-inner {
padding: 4px;
}
/* black icons */
.tablesorter-bootstrap thead .tablesorter-headerUnSorted:not(.sorter-false) {
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE0IDIwIj48cGF0aCBkPSJNMTQgMTNsLTIuNS0yLjVMNyAxNWwtNC41LTQuNUwwIDEzbDcgN3pNMTQgNy41TDExLjUgMTAgNyA1LjUgMi41IDEwIDAgNy41bDctN3oiLz48L3N2Zz4=);
}
.tablesorter-bootstrap thead .tablesorter-headerAsc {
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBkPSJNMTQgOS41TDExLjUgMTIgNyA3LjUgMi41IDEyIDAgOS41bDctN3oiLz48L3N2Zz4=);
}
.tablesorter-bootstrap thead .tablesorter-headerDesc {
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBkPSJNMTQgNWwtMi41LTIuNS00LjUgNC41LTQuNS00LjVMMCA1IDcgMTJ6Ii8+PC9zdmc+);
}
/* white icons */
.tablesorter-bootstrap thead.thead-dark .tablesorter-headerUnSorted:not(.sorter-false),
.tablesorter-bootstrap.table-dark thead .tablesorter-headerUnSorted:not(.sorter-false) {
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxNiIgdmlld0JveD0iMCAwIDE0IDIwIj48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTQgMTNsLTIuNS0yLjVMNyAxNWwtNC41LTQuNUwwIDEzbDcgN3pNMTQgNy41TDExLjUgMTAgNyA1LjUgMi41IDEwIDAgNy41bDctN3oiLz48L3N2Zz4=);
}
.tablesorter-bootstrap thead.thead-dark .tablesorter-headerAsc,
.tablesorter-bootstrap.table-dark thead .tablesorter-headerAsc {
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTQgOS41TDExLjUgMTIgNyA3LjUgMi41IDEyIDAgOS41bDctN3oiLz48L3N2Zz4=);
}
.tablesorter-bootstrap thead.thead-dark .tablesorter-headerDesc,
.tablesorter-bootstrap.table-dark thead .tablesorter-headerDesc {
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDE0IDE0Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTQgNWwtMi41LTIuNS00LjUgNC41LTQuNS00LjVMMCA1IDcgMTJ6Ii8+PC9zdmc+);
}
/* since bootstrap (table-striped) uses nth-child(), we just use this to add a zebra stripe color */
.tablesorter-bootstrap:not(.table-dark) > tbody > tr.odd > td,
.tablesorter-bootstrap:not(.table-dark) > tbody > tr.tablesorter-hasChildRow.odd:hover ~ tr.tablesorter-hasChildRow.odd ~ .tablesorter-childRow.odd > td {
background-color: #f9f9f9;
}
.tablesorter-bootstrap:not(.table-dark) > tbody > tr.hover > td,
.tablesorter-bootstrap:not(.table-dark) > tbody > tr.odd:hover > td,
.tablesorter-bootstrap:not(.table-dark) > tbody > tr.even:hover > td,
.tablesorter-bootstrap:not(.table-dark) > tbody > tr.tablesorter-hasChildRow.odd:hover ~ .tablesorter-childRow.odd > td,
.tablesorter-bootstrap:not(.table-dark) > tbody > tr.tablesorter-hasChildRow.even:hover ~ .tablesorter-childRow.even > td {
background-color: #f5f5f5;
}
.tablesorter-bootstrap:not(.table-dark) > tbody > tr.even > td,
.tablesorter-bootstrap:not(.table-dark) > tbody > tr.tablesorter-hasChildRow.even:hover ~ tr.tablesorter-hasChildRow.even ~ .tablesorter-childRow.even > td {
background-color: #fff;
}
/* processing icon */
.tablesorter-bootstrap .tablesorter-processing {
background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=');
background-position: center center !important;
background-repeat: no-repeat !important;
}
/* Column Widget - column sort colors */
.tablesorter-bootstrap:not(.table-dark) > tbody > tr.odd td.primary {
background-color: #bfbfbf;
}
.tablesorter-bootstrap:not(.table-dark) > tbody > tr td.primary,
.tablesorter-bootstrap:not(.table-dark) > tbody > tr.even td.primary {
background-color: #d9d9d9;
}
.tablesorter-bootstrap:not(.table-dark) > tbody > tr.odd td.secondary {
background-color: #d9d9d9;
}
.tablesorter-bootstrap:not(.table-dark) > tbody > tr td.secondary,
.tablesorter-bootstrap:not(.table-dark) > tbody > tr.even td.secondary {
background-color: #e6e6e6;
}
.tablesorter-bootstrap:not(.table-dark) > tbody > tr.odd td.tertiary {
background-color: #e6e6e6;
}
.tablesorter-bootstrap:not(.table-dark) > tbody > tr td.tertiary,
.tablesorter-bootstrap:not(.table-dark) > tbody > tr.even td.tertiary {
background-color: #f2f2f2;
}
/* caption */
.tablesorter-bootstrap:not(.table-dark) > .caption {
background-color: #fff;
}
/* filter widget */
.tablesorter-bootstrap .tablesorter-filter-row input.tablesorter-filter,
.tablesorter-bootstrap .tablesorter-filter-row select.tablesorter-filter {
width: 98%;
margin: 0;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: height 0.1s ease;
-moz-transition: height 0.1s ease;
-o-transition: height 0.1s ease;
transition: height 0.1s ease;
}
.tablesorter-bootstrap:not(.table-dark) .tablesorter-filter-row {
background-color: #efefef;
}
.tablesorter-bootstrap:not(.table-dark) .tablesorter-filter-row input.tablesorter-filter,
.tablesorter-bootstrap:not(.table-dark) .tablesorter-filter-row select.tablesorter-filter {
color: #333;
}
.tablesorter-bootstrap .tablesorter-filter-row .tablesorter-filter.disabled {
cursor: not-allowed;
box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset;
box-sizing: border-box;
transition: height 0.1s ease;
}
.tablesorter-bootstrap:not(.table-dark) .tablesorter-filter-row td {
line-height: normal;
text-align: center;
padding: 4px 6px;
vertical-align: middle;
-webkit-transition: line-height 0.1s ease;
-moz-transition: line-height 0.1s ease;
-o-transition: line-height 0.1s ease;
transition: line-height 0.1s ease;
}
/* hidden filter row */
.tablesorter-bootstrap .tablesorter-filter-row.hideme td {
padding: 2px; /* change this to modify the thickness of the closed border row */
margin: 0;
line-height: 0;
}
.tablesorter-bootstrap .tablesorter-filter-row.hideme * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
/* rows hidden by filtering */
.tablesorter .filtered {
display: none;
}
/* pager plugin */
.tablesorter-bootstrap .tablesorter-pager .pagedisplay {
border: 0;
}
/* ajax error row */
.tablesorter:not(.table-dark) .tablesorter-errorRow td {
text-align: center;
cursor: pointer;
background-color: #e6bf99;
}

View File

@ -0,0 +1,193 @@
/*************
Dark Theme (by thezoggy)
*************/
/* overall */
.tablesorter-dark {
width: 100%;
font: 11px/18px Arial, Sans-serif;
color: #ccc;
text-align: left;
background-color: #000;
border-spacing: 0;
}
/* header */
.tablesorter-dark th,
.tablesorter-dark thead td {
padding: 4px;
font: 12px/20px Arial, Sans-serif;
font-weight: bold;
color: #fff;
background-color: #000;
border-collapse: collapse;
}
.tablesorter-dark thead th {
border-bottom: #333 2px solid;
}
.tablesorter-dark .header,
.tablesorter-dark .tablesorter-header {
padding: 4px 20px 4px 4px;
cursor: pointer;
background-image: url(data:image/gif;base64,R0lGODlhFQAJAIAAAP///////yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==);
background-position: center right;
background-repeat: no-repeat;
}
.tablesorter-dark thead .headerSortUp,
.tablesorter-dark thead .tablesorter-headerSortUp,
.tablesorter-dark thead .tablesorter-headerAsc {
background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);
border-bottom: #888 1px solid;
}
.tablesorter-dark thead .headerSortDown,
.tablesorter-dark thead .tablesorter-headerSortDown,
.tablesorter-dark thead .tablesorter-headerDesc {
background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);
border-bottom: #888 1px solid;
}
.tablesorter-dark thead .sorter-false {
background-image: none;
cursor: default;
padding: 4px;
}
/* tfoot */
.tablesorter-dark tfoot .tablesorter-headerSortUp,
.tablesorter-dark tfoot .tablesorter-headerSortDown,
.tablesorter-dark tfoot .tablesorter-headerAsc,
.tablesorter-dark tfoot .tablesorter-headerDesc {
border-top: #888 1px solid;
/* remove sort arrows from footer */
background-image: none;
}
/* tbody */
.tablesorter-dark td {
padding: 4px;
background-color: #000;
border-bottom: #333 1px solid;
color: #ccc;
}
/* hovered row colors */
.tablesorter-dark tbody > tr.hover > td,
.tablesorter-dark tbody > tr:hover > td,
.tablesorter-dark tbody > tr.even:hover > td,
.tablesorter-dark tbody > tr.odd:hover > td {
background-color: #000;
}
/* table processing indicator */
.tablesorter-dark .tablesorter-processing {
background-position: center center !important;
background-repeat: no-repeat !important;
/* background-image: url(images/loading.gif) !important; */
background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=') !important;
}
/* Zebra Widget - row alternating colors */
.tablesorter-dark tr.odd > td {
background-color: #202020;
}
.tablesorter-dark tr.even > td {
background-color: #101010;
}
/* Column Widget - column sort colors */
.tablesorter-dark td.primary,
.tablesorter-dark tr.odd td.primary {
background-color: #0a0a0a;
}
.tablesorter-dark tr.even td.primary {
background-color: #050505;
}
.tablesorter-dark td.secondary,
.tablesorter-dark tr.odd td.secondary {
background-color: #0f0f0f;
}
.tablesorter-dark tr.even td.secondary {
background-color: #0a0a0a;
}
.tablesorter-dark td.tertiary,
.tablesorter-dark tr.odd td.tertiary {
background-color: #191919;
}
.tablesorter-dark tr.even td.tertiary {
background-color: #0f0f0f;
}
/* caption */
.tablesorter-dark > caption {
background-color: #202020;
}
/* filter widget */
.tablesorter-dark .tablesorter-filter-row {
background-color: #202020;
}
.tablesorter-dark .tablesorter-filter-row td {
background-color: #202020;
line-height: normal;
text-align: center; /* center the input */
-webkit-transition: line-height 0.1s ease;
-moz-transition: line-height 0.1s ease;
-o-transition: line-height 0.1s ease;
transition: line-height 0.1s ease;
}
/* optional disabled input styling */
.tablesorter-dark .tablesorter-filter-row .disabled {
opacity: 0.5;
filter: alpha(opacity=50);
cursor: not-allowed;
}
/* hidden filter row */
.tablesorter-dark .tablesorter-filter-row.hideme td {
/*** *********************************************** ***/
/*** change this padding to modify the thickness ***/
/*** of the closed filter row (height = padding x 2) ***/
padding: 2px;
/*** *********************************************** ***/
margin: 0;
line-height: 0;
cursor: pointer;
}
.tablesorter-dark .tablesorter-filter-row.hideme * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
/* filters */
.tablesorter-dark input.tablesorter-filter,
.tablesorter-dark select.tablesorter-filter {
width: 98%;
height: auto;
margin: 0;
padding: 4px;
background-color: #111;
border: 1px solid #222;
color: #ddd;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: height 0.1s ease;
-moz-transition: height 0.1s ease;
-o-transition: height 0.1s ease;
transition: height 0.1s ease;
}
/* rows hidden by filtering (needed for child rows) */
.tablesorter .filtered {
display: none;
}
/* ajax error row */
.tablesorter .tablesorter-errorRow td {
text-align: center;
cursor: pointer;
background-color: #e6bf99;
}

View File

@ -0,0 +1,194 @@
/*************
Default Theme
*************/
/* overall */
.tablesorter-default {
width: 100%;
font: 12px/18px Arial, Sans-serif;
color: #333;
background-color: #fff;
border-spacing: 0;
margin: 10px 0 15px;
text-align: left;
}
/* header */
.tablesorter-default th,
.tablesorter-default thead td {
font-weight: bold;
color: #000;
background-color: #fff;
border-collapse: collapse;
border-bottom: #ccc 2px solid;
padding: 0;
}
.tablesorter-default tfoot th,
.tablesorter-default tfoot td {
border: 0;
}
.tablesorter-default .header,
.tablesorter-default .tablesorter-header {
background-image: url(data:image/gif;base64,R0lGODlhFQAJAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==);
background-position: center right;
background-repeat: no-repeat;
cursor: pointer;
white-space: normal;
padding: 4px 20px 4px 4px;
}
.tablesorter-default thead .headerSortUp,
.tablesorter-default thead .tablesorter-headerSortUp,
.tablesorter-default thead .tablesorter-headerAsc {
background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);
border-bottom: #000 2px solid;
}
.tablesorter-default thead .headerSortDown,
.tablesorter-default thead .tablesorter-headerSortDown,
.tablesorter-default thead .tablesorter-headerDesc {
background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);
border-bottom: #000 2px solid;
}
.tablesorter-default thead .sorter-false {
background-image: none;
cursor: default;
padding: 4px;
}
/* tfoot */
.tablesorter-default tfoot .tablesorter-headerSortUp,
.tablesorter-default tfoot .tablesorter-headerSortDown,
.tablesorter-default tfoot .tablesorter-headerAsc,
.tablesorter-default tfoot .tablesorter-headerDesc {
border-top: #000 2px solid;
}
/* tbody */
.tablesorter-default td {
background-color: #fff;
border-bottom: #ccc 1px solid;
padding: 4px;
vertical-align: top;
}
/* hovered row colors */
.tablesorter-default tbody > tr.hover > td,
.tablesorter-default tbody > tr:hover > td,
.tablesorter-default tbody > tr.even:hover > td,
.tablesorter-default tbody > tr.odd:hover > td {
background-color: #fff;
color: #000;
}
/* table processing indicator */
.tablesorter-default .tablesorter-processing {
background-position: center center !important;
background-repeat: no-repeat !important;
/* background-image: url(images/loading.gif) !important; */
background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=') !important;
}
/* Zebra Widget - row alternating colors */
.tablesorter-default tr.odd > td {
background-color: #dfdfdf;
}
.tablesorter-default tr.even > td {
background-color: #efefef;
}
/* Column Widget - column sort colors */
.tablesorter-default tr.odd td.primary {
background-color: #bfbfbf;
}
.tablesorter-default td.primary,
.tablesorter-default tr.even td.primary {
background-color: #d9d9d9;
}
.tablesorter-default tr.odd td.secondary {
background-color: #d9d9d9;
}
.tablesorter-default td.secondary,
.tablesorter-default tr.even td.secondary {
background-color: #e6e6e6;
}
.tablesorter-default tr.odd td.tertiary {
background-color: #e6e6e6;
}
.tablesorter-default td.tertiary,
.tablesorter-default tr.even td.tertiary {
background-color: #f2f2f2;
}
/* caption */
.tablesorter-default > caption {
background-color: #fff;
}
/* filter widget */
.tablesorter-default .tablesorter-filter-row {
background-color: #eee;
}
.tablesorter-default .tablesorter-filter-row td {
background-color: #eee;
border-bottom: #ccc 1px solid;
line-height: normal;
text-align: center; /* center the input */
-webkit-transition: line-height 0.1s ease;
-moz-transition: line-height 0.1s ease;
-o-transition: line-height 0.1s ease;
transition: line-height 0.1s ease;
}
/* optional disabled input styling */
.tablesorter-default .tablesorter-filter-row .disabled {
opacity: 0.5;
filter: alpha(opacity=50);
cursor: not-allowed;
}
/* hidden filter row */
.tablesorter-default .tablesorter-filter-row.hideme td {
/*** *********************************************** ***/
/*** change this padding to modify the thickness ***/
/*** of the closed filter row (height = padding x 2) ***/
padding: 2px;
/*** *********************************************** ***/
margin: 0;
line-height: 0;
cursor: pointer;
}
.tablesorter-default .tablesorter-filter-row.hideme * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
/* filters */
.tablesorter-default input.tablesorter-filter,
.tablesorter-default select.tablesorter-filter {
width: 95%;
height: auto;
margin: 4px auto;
padding: 4px;
background-color: #fff;
border: 1px solid #bbb;
color: #333;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: height 0.1s ease;
-moz-transition: height 0.1s ease;
-o-transition: height 0.1s ease;
transition: height 0.1s ease;
}
/* rows hidden by filtering (needed for child rows) */
.tablesorter .filtered {
display: none;
}
/* ajax error row */
.tablesorter .tablesorter-errorRow td {
text-align: center;
cursor: pointer;
background-color: #e6bf99;
}

View File

@ -0,0 +1,214 @@
/*************
Dropbox Theme (by thezoggy)
*************/
/* overall */
.tablesorter-dropbox {
width: 100%;
font: 13px/32px "Open Sans","lucida grande","Segoe UI",arial,verdana,"lucida sans unicode",tahoma,sans-serif;
color: #555;
text-align: left;
background-color: #fff;
border-collapse: collapse;
border-top: 1px solid #82cffa;
border-spacing: 0;
}
/* header */
.tablesorter-dropbox th,
.tablesorter-dropbox thead td,
.tablesorter-dropbox tfoot th,
.tablesorter-dropbox tfoot td {
background-color: #f0f9ff;
border-color: #82cffa #e7f2fb #96c4ea;
border-style: solid;
border-width: 1px;
padding: 3px 6px;
font-size: 13px;
font-weight: normal;
line-height: 29px;
color: #2281CF;
text-align: left;
}
.tablesorter-dropbox .header,
.tablesorter-dropbox thead tr,
.tablesorter-dropbox .tablesorter-headerRow {
background-color: #f0f9ff;
border-bottom: 1px solid #96c4ea;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.12), 0 0 0 #000000 inset;
white-space: normal;
}
.tablesorter-dropbox .tablesorter-headerSortUp,
.tablesorter-dropbox .tablesorter-headerSortDown,
.tablesorter-dropbox .tablesorter-headerAsc,
.tablesorter-dropbox .tablesorter-headerDesc {
font-weight: 600;
}
.tablesorter-dropbox .tablesorter-header {
cursor: pointer;
}
.tablesorter-dropbox .tablesorter-header i.tablesorter-icon {
width: 9px;
height: 9px;
padding: 0 10px 0 4px;
display: inline-block;
background-position: center right;
background-repeat: no-repeat;
content: "";
}
.tablesorter-dropbox .tablesorter-headerSortUp i.tablesorter-icon,
.tablesorter-dropbox .tablesorter-headerAsc i.tablesorter-icon {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALhJREFUeNpi/P//PwMhwILMiexYx8bIxNTy/9+/muUVQb9g4kzIitg4edI4+YRLQTSyOCPMupjerUI8whK3OXgEhH58+fDuy9sXqkuKvd+hmMTOxdvCxS8sxMUvxACiQXwU6+Im7DDg5BNKY+fiY2BmYWMA0SA+SByuiJ2bbzIHrwAzMxsb0AGMDCAaxAeJg+SZ7wtaqfAISfQAdTIwMUM8ywhUyMTEzPD/71+5FXvPLWUkJpwAAgwAZqYvvHStbD4AAAAASUVORK5CYII=');
/* background-image: url(images/dropbox-asc.png); */
}
.tablesorter-dropbox .tablesorter-headerSortUp:hover i.tablesorter-icon,
.tablesorter-dropbox .tablesorter-headerAsc:hover i.tablesorter-icon {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALVJREFUeNpi/P//PwMhwILMCc+qZGNkYmr5/+9fzcpp7b9g4kzIitjYOdM4uXlLQTSyOCPMuqi8OiEefsHbHFzcQj++fX335eN71WWTmt6hmMTOwdXCycMnBDSJAUSD+CjWxRQ0GHBw86Sxc3AyMDOzMIBoEB8kDlfEzsk1mYOLByjPCnQAIwOIBvFB4iB55rsfmVS4+QV7QNYwMTNDHApUyMTExPDv/z+5Feu3L2UkJpwAAgwA244u+I9CleAAAAAASUVORK5CYII=');
/* background-image: url(images/dropbox-asc-hovered.png); */
}
.tablesorter-dropbox .tablesorter-headerSortDown i.tablesorter-icon,
.tablesorter-dropbox .tablesorter-headerDesc i.tablesorter-icon {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALdJREFUeNpi/P//PwMhwBLdtVGFhZ3zNhMzC4bkv79/GP78/K7KCDIpZ9mVw+xcfDaMTExwBf///WP4+e3TkSlROrZg7UxMLLns3HxnmFnZmGGK/v7+9ff3j2+5YHkQMSlC48Kv719m/f//D2IKkAbxQeJwRSDw4/OHmr+/fr0DqmAA0SA+TA6uaEq0zjugG+r//vkFcks9iA/3HbJvvn18O+vf379yP758mMXAoAAXZyQmnAACDADX316BiTFbMQAAAABJRU5ErkJggg==');
/* background-image: url(images/dropbox-desc.png); */
}
.tablesorter-dropbox .tablesorter-headerSortDown:hover i.tablesorter-icon,
.tablesorter-dropbox .tablesorter-headerDesc:hover i.tablesorter-icon {
background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALNJREFUeNpi/P//PwMhwBJf3uP879e3PUzMzBiS//7+ZWBi43JhBJmU2z7nIzMzEx8jIyNcAUj8799/nyZXpvCzgARYuXjTWBkZVjCzIEz7++cvw+//DGkgNiPMTWVT1l5hZvynDTINbMp/pqtdOcE6IDkmmM5fv3/5//v37z9QBQOIBvFhcnBFEwoj7/5jZFnz9+8fBhAN4sN9h+ybH9++JrGxscr/+vE1CVmckZhwAggwANvlUyq5Dd1wAAAAAElFTkSuQmCC');
/* background-image: url(images/dropbox-desc-hovered.png); */
}
.tablesorter-dropbox thead .sorter-false {
cursor: default;
}
.tablesorter-dropbox thead .sorter-false i.tablesorter-icon {
display: none;
}
/* tbody */
.tablesorter-dropbox td {
padding: 5px 6px;
line-height: 32px;
color: #555;
text-align: left;
border-top: 1px solid #edf1f5;
border-bottom: 1px solid #edf1f5;
}
/* hovered row colors */
.tablesorter-dropbox tbody > tr.hover > td,
.tablesorter-dropbox tbody > tr:hover > td,
.tablesorter-dropbox tbody > tr.even:hover > td,
.tablesorter-dropbox tbody > tr.odd:hover > td {
background-color: rgba(230, 245, 255, 0.3);
border-right: 0;
border-left: 0;
border-color: #c6d8e4;
/* trick to do border-top and bottom colors */
border-style: double;
}
/* table processing indicator */
.tablesorter-dropbox .tablesorter-processing {
background-position: center center !important;
background-repeat: no-repeat !important;
/* background-image: url(images/loading.gif) !important; */
background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=') !important;
}
/* Zebra Widget - row alternating colors */
.tablesorter-dropbox tr.odd > td {
}
.tablesorter-dropbox tr.even > td {
}
/* Column Widget - column sort colors */
.tablesorter-dropbox td.primary,
.tablesorter-dropbox tr.odd td.primary {
}
.tablesorter-dropbox tr.even td.primary {
}
.tablesorter-dropbox td.secondary,
.tablesorter-dropbox tr.odd td.secondary {
}
.tablesorter-dropbox tr.even td.secondary {
}
.tablesorter-dropbox td.tertiary,
.tablesorter-dropbox tr.odd td.tertiary {
}
.tablesorter-dropbox tr.even td.tertiary {
}
/* caption */
.tablesorter-dropbox > caption {
background-color: #fff;
}
/* Filter Widget */
.tablesorter-dropbox .tablesorter-filter-row {
background-color: #fff;
}
.tablesorter-dropbox .tablesorter-filter-row td {
background-color: #fff;
line-height: normal;
text-align: center; /* center the input */
-webkit-transition: line-height 0.1s ease;
-moz-transition: line-height 0.1s ease;
-o-transition: line-height 0.1s ease;
transition: line-height 0.1s ease;
}
/* optional disabled input styling */
.tablesorter-dropbox .tablesorter-filter-row .disabled {
opacity: 0.5;
filter: alpha(opacity=50);
cursor: not-allowed;
}
/* hidden filter row */
.tablesorter-dropbox .tablesorter-filter-row.hideme td {
/*** *********************************************** ***/
/*** change this padding to modify the thickness ***/
/*** of the closed filter row (height = padding x 2) ***/
padding: 2px;
/*** *********************************************** ***/
margin: 0;
line-height: 0;
cursor: pointer;
}
.tablesorter-dropbox .tablesorter-filter-row.hideme * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
/* filters */
.tablesorter-dropbox input.tablesorter-filter,
.tablesorter-dropbox select.tablesorter-filter {
width: 98%;
height: auto;
margin: 0;
background-color: #fff;
border: 1px solid #bbb;
color: #333;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: height 0.1s ease;
-moz-transition: height 0.1s ease;
-o-transition: height 0.1s ease;
transition: height 0.1s ease;
}
/* rows hidden by filtering (needed for child rows) */
.tablesorter .filtered {
display: none;
}
/* ajax error row */
.tablesorter .tablesorter-errorRow td {
text-align: center;
cursor: pointer;
background-color: #e6bf99;
}

View File

@ -0,0 +1,212 @@
/*************
Green Theme
*************/
/* overall */
.tablesorter-green {
width: 100%;
text-align: left;
border-spacing: 0;
border: #cdcdcd 1px solid;
border-width: 1px 0 0 1px;
}
.tablesorter-green th,
.tablesorter-green td {
font: 12px/18px Arial, Sans-serif;
border: #cdcdcd 1px solid;
border-width: 0 1px 1px 0;
}
/* header */
.tablesorter-green thead tr .tablesorter-header,
.tablesorter-green tfoot tr {
background-position: center center;
background-repeat: repeat-x;
background-image: url(data:image/gif;base64,R0lGODlhAQBkAOYAAN/e39XU1fX19tTU1eXm5uTl5ePk5OLj4+Hi4vX29fT19PP08/Lz8vHy8fDx8O/w7+7v7uzt7Orr6ufo5/T08/Pz8ufn5uLi4eDg39/f3t3d3Nzc29HR0NDQz8/Pzuvq6urp6eno6Ojn5+fm5tfW1tbV1dTT09PS0tLR0dHQ0NDPz/f39/b29vX19fT09PPz8/Ly8vHx8e/v7+7u7u3t7ezs7Ovr6+rq6unp6ejo6Ofn5+bm5uXl5eTk5OPj4+Li4uHh4eDg4N/f397e3t3d3dzc3Nvb29ra2tnZ2djY2NfX19XV1dPT09LS0tHR0dDQ0M/Pz8rKysXFxf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAFMALAAAAAABAGQAAAdegCsrLC0tLi+ILi6FCSwsCS0KkhQVDA0OMjM0NTYfICEiIzw9P0AYGUQaG0ZHSEoDTU9Qs08pTk1MSyRJR0VDQT8+PTw7Ojg3NTMyMTAvi4WOhC0vMTI1OT9GTlFSgQA7);
/* background-image: url(images/green-header.gif); */
}
.tablesorter-green th,
.tablesorter-green thead td {
font-weight: bold;
border-right: #cdcdcd 1px solid;
border-collapse: collapse;
padding: 6px;
}
.tablesorter-green .header,
.tablesorter-green .tablesorter-header-inner {
background-position: 5px center;
background-repeat: no-repeat;
background-image: url(data:image/gif;base64,R0lGODlhEAAQAOYAAA5NDBBYDlWWUzRUM5DVjp7inJ/fnQ1ECiCsGhyYFxqKFRFdDhBXDQxCCiO8HSK2HCCqGh2aGByUFxuPFhqNFhmHFRZ2EhVvERRpEBBVDSS8HiGyHB+mGh6fGRuTFxiAFBd5Eww/Cgs5CRp7Fiu+JRx8GCy/JjHAKyynKCuhJzXCMDbCMDnDMyNuHz3EODy9N0LFPSl7JkvIRjycOFDKS1LKTVPLT1XLUFTCT17OWTBkLmbQYnDTbHXVcXnWdoXago/djGmUZ112XCJEIEdjRf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEUALAAAAAAQABAAAAdlgEWCg4SFhoIvh4cVLECKhCMeJjwFj0UlEwgaMD4Gii0WFAkRHQ47BIY6IQAZDAwBCyAPOJa1toRBGBAwNTY3OT0/AoZCDQoOKi4yNDOKRCIfGycrKZYDBxIkKLZDFxy3RTHgloEAOw==);
/* background-image: url(images/green-unsorted.gif); */
border-collapse: collapse;
white-space: normal;
cursor: pointer;
}
.tablesorter-green thead .headerSortUp .tablesorter-header-inner,
.tablesorter-green thead .tablesorter-headerSortUp .tablesorter-header-inner,
.tablesorter-green thead .tablesorter-headerAsc .tablesorter-header-inner {
background-image: url(data:image/gif;base64,R0lGODlhEAAQANUAAA5NDBBYDpDVjp7inJ/fnSCsGhyYFxFdDhBXDSO8HSK2HB2aGBuPFhqNFhmHFRZ2EhBVDSS8Hh6fGRuTFxd5Eww/Chp7Fhx8GCy/JjnDMyNuHzy9N0LFPVTCTzBkLmbQYnDTbHnWdo/djP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACMALAAAAAAQABAAAAY4wJFwSCwaj8ikcslMbpojR0bEtEwwoIHywihEOCECUvNoGBaSxEdg9FQAEAQicKAoOtC8fs8fBgEAOw==)
/* background-image: url(images/green-asc.gif); */
}
.tablesorter-green thead .headerSortDown .tablesorter-header-inner,
.tablesorter-green thead .tablesorter-headerSortDown .tablesorter-header-inner,
.tablesorter-green thead .tablesorter-headerDesc .tablesorter-header-inner {
background-image: url(data:image/gif;base64,R0lGODlhEAAQANUAAFWWUzRUMw1EChqKFQxCCiO8HSCqGhyUFxVvERRpECGyHB+mGhiAFAs5CSu+JTHAKyynKCuhJzXCMDbCMD3EOELFPSl7JkvIRjycOFDKS1LKTVPLT1XLUF7OWXXVcYXagmmUZ112XCJEIEdjRf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACQALAAAAAAQABAAAAY4QJJwSCwaj8ikcskkghKGimbD6Xg+AGOIMChIKJcMBjlqMBSPSUQZEBwcEKYIsWiSLPa8fs9HBgEAOw==)
/* background-image: url(images/green-desc.gif); */
}
.tablesorter-green th.tablesorter-header .tablesorter-header-inner,
.tablesorter-green td.tablesorter-header .tablesorter-header-inner {
padding-left: 23px;
}
.tablesorter-green thead .tablesorter-header.sorter-false .tablesorter-header-inner {
background-image: none;
cursor: default;
padding-left: 6px;
}
/* tfoot */
.tablesorter-green tbody td,
.tablesorter-green tfoot th {
padding: 6px;
vertical-align: top;
}
/* tbody */
.tablesorter-green td {
color: #3d3d3d;
padding: 6px;
}
/* hovered row colors
you'll need to add additional lines for
rows with more than 2 child rows
*/
.tablesorter-green tbody > tr.hover > td,
.tablesorter-green tbody > tr:hover > td,
.tablesorter-green tbody > tr:hover + tr.tablesorter-childRow > td,
.tablesorter-green tbody > tr:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td,
.tablesorter-green tbody > tr.even.hover > td,
.tablesorter-green tbody > tr.even:hover > td,
.tablesorter-green tbody > tr.even:hover + tr.tablesorter-childRow > td,
.tablesorter-green tbody > tr.even:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td {
background-color: #d9d9d9;
}
.tablesorter-green tbody > tr.odd.hover > td,
.tablesorter-green tbody > tr.odd:hover > td,
.tablesorter-green tbody > tr.odd:hover + tr.tablesorter-childRow > td,
.tablesorter-green tbody > tr.odd:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td {
background-color: #bfbfbf;
}
/* table processing indicator */
.tablesorter-green .tablesorter-processing {
background-position: center center !important;
background-repeat: no-repeat !important;
/* background-image: url(images/loading.gif) !important; */
background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=') !important;
}
/* Zebra Widget - row alternating colors */
.tablesorter-green tr.odd > td {
background-color: #ebfaeb;
}
.tablesorter-green tr.even > td {
background-color: #fff;
}
/* Column Widget - column sort colors */
.tablesorter-green td.primary,
.tablesorter-green tr.odd td.primary {
background-color: #99e6a6;
}
.tablesorter-green tr.even td.primary {
background-color: #c2f0c9;
}
.tablesorter-green td.secondary,
.tablesorter-green tr.odd td.secondary {
background-color: #c2f0c9;
}
.tablesorter-green tr.even td.secondary {
background-color: #d6f5db;
}
.tablesorter-green td.tertiary,
.tablesorter-green tr.odd td.tertiary {
background-color: #d6f5db;
}
.tablesorter-green tr.even td.tertiary {
background-color: #ebfaed;
}
/* caption */
.tablesorter-green > caption {
background-color: #fff;
}
/* filter widget */
.tablesorter-green .tablesorter-filter-row {
background-color: #eee;
}
.tablesorter-green .tablesorter-filter-row td {
background-color: #eee;
line-height: normal;
text-align: center; /* center the input */
-webkit-transition: line-height 0.1s ease;
-moz-transition: line-height 0.1s ease;
-o-transition: line-height 0.1s ease;
transition: line-height 0.1s ease;
}
/* optional disabled input styling */
.tablesorter-green .tablesorter-filter-row .disabled {
opacity: 0.5;
filter: alpha(opacity=50);
cursor: not-allowed;
}
/* hidden filter row */
.tablesorter-green .tablesorter-filter-row.hideme td {
/*** *********************************************** ***/
/*** change this padding to modify the thickness ***/
/*** of the closed filter row (height = padding x 2) ***/
padding: 2px;
/*** *********************************************** ***/
margin: 0;
line-height: 0;
cursor: pointer;
}
.tablesorter-green .tablesorter-filter-row.hideme * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
/* filters */
.tablesorter-green input.tablesorter-filter,
.tablesorter-green select.tablesorter-filter {
width: 98%;
height: auto;
margin: 0;
padding: 4px;
background-color: #fff;
border: 1px solid #bbb;
color: #333;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: height 0.1s ease;
-moz-transition: height 0.1s ease;
-o-transition: height 0.1s ease;
transition: height 0.1s ease;
}
/* rows hidden by filtering (needed for child rows) */
.tablesorter .filtered {
display: none;
}
/* ajax error row */
.tablesorter .tablesorter-errorRow td {
text-align: center;
cursor: pointer;
background-color: #e6bf99;
}

View File

@ -0,0 +1,251 @@
/*************
Grey Theme
*************/
/* overall */
.tablesorter-grey {
width: 100%;
margin: 10px 0 15px;
text-align: left;
border-spacing: 0;
border-left: #555 1px solid;
}
/* header */
.tablesorter-grey th,
.tablesorter-grey thead td {
font: bold 12px/18px Arial, Sans-serif;
color: #c8c8c8;
background-color: #3c3c3c;
background-image: -moz-linear-gradient(top, #555, #3c3c3c);
background-image: -ms-linear-gradient(top, #555, #3c3c3c);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555), to(#3c3c3c));
background-image: -webkit-linear-gradient(top, #555, #3c3c3c);
background-image: -o-linear-gradient(top, #555, #3c3c3c);
background-image: linear-gradient(to bottom, #555,#3c3c3c);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#555555', endColorstr='#3c3c3c',GradientType=0 );
background-repeat: repeat-x;
border-right: #555 1px solid;
text-shadow: 0 1px 0 rgba(128, 128, 128, 0.7);
-webkit-box-shadow: inset 0 1px 0 #222;
-moz-box-shadow: inset 0 1px 0 #222;
box-shadow: inset 0 1px 0 #222;
padding: 4px;
}
.tablesorter-grey .tablesorter-header-inner,
.tablesorter-grey .tablesorter-header-inner {
position: relative;
padding: 4px 15px 4px 4px;
}
.tablesorter-grey .header,
.tablesorter-grey .tablesorter-header {
cursor: pointer;
}
.tablesorter-grey .header i,
.tablesorter-grey .tablesorter-header i.tablesorter-icon {
width: 18px;
height: 10px;
position: absolute;
right: 2px;
top: 50%;
margin-top: -10px;
/* white (unsorted) double arrow */
background-image: url(data:image/gif;base64,R0lGODlhFQAJAIAAAP///////yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==);
background-repeat: no-repeat;
background-position: center right;
padding: 4px;
white-space: normal;
}
.tablesorter-grey th.headerSortUp,
.tablesorter-grey th.tablesorter-headerSortUp,
.tablesorter-grey th.headerSortDown,
.tablesorter-grey th.tablesorter-headerSortDown {
color: #ddd;
background-color: #135185;
background-image: -moz-linear-gradient(top, #195c93, #0e4776);
background-image: -ms-linear-gradient(top, #195c93, #0e4776);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#195c93), to(#0e4776));
background-image: -webkit-linear-gradient(top, #195c93, #0e4776);
background-image: -o-linear-gradient(top, #195c93, #0e4776);
background-image: linear-gradient(to bottom, #195c93, #0e4776);
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#195c93', endColorstr='#0e4776',GradientType=0 );
}
.tablesorter-grey .headerSortUp i.tablesorter-icon,
.tablesorter-grey .tablesorter-headerSortUp i.tablesorter-icon,
.tablesorter-grey .tablesorter-headerAsc i.tablesorter-icon {
/* white asc arrow */
background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7);
}
.tablesorter-grey .headerSortDown i.tablesorter-icon,
.tablesorter-grey .tablesorter-headerSortDown i.tablesorter-icon,
.tablesorter-grey .tablesorter-headerDesc i.tablesorter-icon {
/* white desc arrow */
background-image: url(data:image/gif;base64,R0lGODlhFQAEAIAAAP///////yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7);
}
.tablesorter-grey thead .sorter-false {
cursor: default;
}
.tablesorter-grey thead .sorter-false i.tablesorter-icon {
display: none;
}
/* tfoot */
.tablesorter-grey tbody td,
.tablesorter-grey tfoot th,
.tablesorter-grey tfoot td {
padding: 4px;
vertical-align: top;
border-right: #555 1px solid;
}
.tablesorter-grey tfoot th,
.tablesorter-grey tfoot td {
padding: 8px;
}
/* tbody */
.tablesorter-grey td {
color: #eee;
background-color: #6d6d6d;
padding: 4px;
vertical-align: top;
}
/* hovered row colors
you'll need to add additional lines for
rows with more than 2 child rows
*/
.tablesorter-grey tbody > tr.hover > td,
.tablesorter-grey tbody > tr:hover > td,
.tablesorter-grey tbody > tr:hover + tr.tablesorter-childRow > td,
.tablesorter-grey tbody > tr:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td,
.tablesorter-grey tbody > tr.even.hover > td,
.tablesorter-grey tbody > tr.even:hover > td,
.tablesorter-grey tbody > tr.even:hover + tr.tablesorter-childRow > td,
.tablesorter-grey tbody > tr.even:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td {
background-color: #134b78;
}
.tablesorter-grey tbody > tr.odd.hover > td,
.tablesorter-grey tbody > tr.odd:hover > td,
.tablesorter-grey tbody > tr.odd:hover + tr.tablesorter-childRow > td,
.tablesorter-grey tbody > tr.odd:hover + tr.tablesorter-childRow + tr.tablesorter-childRow > td {
background-color: #134b78;
}
/* table processing indicator */
.tablesorter-grey .tablesorter-processing {
background-position: center center !important;
background-repeat: no-repeat !important;
/* background-image: url(images/loading.gif) !important; */
background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=') !important;
}
/* Zebra Widget - row alternating colors */
.tablesorter-grey tbody tr.odd > td {
background-color: #5e5e5e;
}
.tablesorter-grey tbody tr.even > td {
background-color: #6d6d6d;
}
/* Column Widget - column sort colors */
.tablesorter-grey td.primary,
.tablesorter-grey tr.odd td.primary {
color: #ddd;
background-color: #165388;
}
.tablesorter-grey tr.even td.primary {
color: #ddd;
background-color: #195c93;
}
.tablesorter-grey td.secondary,
.tablesorter-grey tr.odd td.secondary {
color: #ddd;
background-color: #185C9A;
}
.tablesorter-grey tr.even td.secondary {
color: #ddd;
background-color: #1D67A5;
}
.tablesorter-grey td.tertiary,
.tablesorter-grey tr.odd td.tertiary {
color: #ddd;
background-color: #1B67AD;
}
.tablesorter-grey tr.even td.tertiary {
color: #ddd;
background-color: #2073B7;
}
/* caption */
.tablesorter-grey > caption {
background-color: #fff;
}
/* filter widget */
.tablesorter-grey .tablesorter-filter-row {
background-color: #3c3c3c;
}
.tablesorter-grey .tablesorter-filter-row td {
background-color: #3c3c3c;
line-height: normal;
text-align: center; /* center the input */
-webkit-transition: line-height 0.1s ease;
-moz-transition: line-height 0.1s ease;
-o-transition: line-height 0.1s ease;
transition: line-height 0.1s ease;
}
/* optional disabled input styling */
.tablesorter-grey .tablesorter-filter-row .disabled {
opacity: 0.5;
filter: alpha(opacity=50);
cursor: not-allowed;
}
/* hidden filter row */
.tablesorter-grey .tablesorter-filter-row.hideme td {
/*** *********************************************** ***/
/*** change this padding to modify the thickness ***/
/*** of the closed filter row (height = padding x 2) ***/
padding: 2px;
/*** *********************************************** ***/
margin: 0;
line-height: 0;
cursor: pointer;
}
.tablesorter-grey .tablesorter-filter-row.hideme * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
/* filters */
.tablesorter-grey input.tablesorter-filter,
.tablesorter-grey select.tablesorter-filter {
width: 98%;
height: auto;
margin: 0;
padding: 4px;
background-color: #6d6d6d;
border: 1px solid #555;
color: #ddd;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: height 0.1s ease;
-moz-transition: height 0.1s ease;
-o-transition: height 0.1s ease;
transition: height 0.1s ease;
}
/* rows hidden by filtering (needed for child rows) */
.tablesorter .filtered {
display: none;
}
/* ajax error row */
.tablesorter .tablesorter-errorRow td {
text-align: center;
cursor: pointer;
background-color: #e6bf99;
}

View File

@ -0,0 +1,212 @@
/*************
Ice Theme (by thezoggy)
*************/
/* overall */
.tablesorter-ice {
width: 100%;
background-color: #fff;
margin: 10px 0 15px;
text-align: left;
border-spacing: 0;
border: #ccc 1px solid;
border-width: 1px 0 0 1px;
}
.tablesorter-ice th,
.tablesorter-ice td {
border: #ccc 1px solid;
border-width: 0 1px 1px 0;
}
/* header */
.tablesorter-ice th,
.tablesorter-ice thead td {
font: 12px/18px Arial, Sans-serif;
color: #555;
background-color: #f6f8f9;
border-collapse: collapse;
padding: 4px;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.7);
}
.tablesorter-ice tbody td,
.tablesorter-ice tfoot th,
.tablesorter-ice tfoot td {
padding: 4px;
vertical-align: top;
}
.tablesorter-ice .header,
.tablesorter-ice .tablesorter-header {
background-color: #f6f8f9;
background-position: center right;
background-repeat: no-repeat;
background-image: url(data:image/gif;base64,R0lGODlhDAAMAMQAAAJEjAJCiwJBigJAiANFjgNGjgNEjQRIkQRHkANIkAVMlAVQmAZWnQZUnAdYoAhdpAhZoAlhqQlepQliqQppsApmrQxutgtutQtutAxwtwxwtg1yug1zugxtsw1yuP8A/yH5BAEAAB8ALAAAAAAMAAwAAAUx4Cd+3GiOW4ado2d9VMVm1xg9ptadTsP+QNZEcjoQTBDGCAFgLRSfQgCYMAiCn8EvBAA7);
/* background-image: url(images/ice-unsorted.gif) */
padding: 4px 20px 4px 4px;
white-space: normal;
cursor: pointer;
}
.tablesorter-ice .headerSortUp,
.tablesorter-ice .tablesorter-headerSortUp,
.tablesorter-ice .tablesorter-headerAsc {
color: #333;
background-color: #ebedee;
background-position: center right;
background-repeat: no-repeat;
background-image: url(data:image/gif;base64,R0lGODlhDAAMANUAAAJCiwNHkANFjgNEjQRIkQNJkQRMlARKkwRKkgVPlwZSmgdaogdYnwhfpghcowlhqgliqglgqAlgpwljqwporwpmrQplrAtsswtqsgtrsgtqsQxttAtvtQtttAxyuQxwtwxxtwxvtg10uw1zuQ1xuP8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACUALAAAAAAMAAwAAAY6wJKwJBoahyNQ6Dj0fDoZCpPEuWgqk4jxs8FQLI+Gg8Esm5kQydFQMC7IwkOAqUiUCAIzIjA4lwBlQQA7);
/* background-image: url(images/ice-desc.gif) */
}
.tablesorter-ice .headerSortDown,
.tablesorter-ice .tablesorter-headerSortDown,
.tablesorter-ice .tablesorter-headerDesc {
color: #333;
background-color: #ebedee;
background-position: center right;
background-repeat: no-repeat;
background-image: url(data:image/gif;base64,R0lGODlhDAAMANUAAAE/iAJBigNFjgNEjQNFjQNDiwRHkQRHjwNHjwROlgRMlQRMlARJkgRKkgZQmAVPlgZWnQZSmgZRmAdXoAdXnwdUnAdbogdZoQhbowlhqAlepglkrAliqQtstAtqsQxyugxyuQxwuAxxuAxxtwxwtgxvtQ10vA12vA10u/8A/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACkALAAAAAAMAAwAAAY6wJQwdRoah6bP6DhEiVIdDxNEGm4yxlDpiJkwv2AmR2OhVCSJBsJ4gUQeCwOB6VAwBAXwYRAIpwBfQQA7);
/* background-image: url(images/ice-asc.gif); */
}
.tablesorter-ice thead .sorter-false {
background-image: none;
cursor: default;
padding: 4px;
}
/* tfoot */
.tablesorter-ice tfoot .tablesorter-headerSortUp,
.tablesorter-ice tfoot .tablesorter-headerSortDown,
.tablesorter-ice tfoot .tablesorter-headerAsc,
.tablesorter-ice tfoot .tablesorter-headerDesc {
background-color: #ebedee;
}
/* tbody */
.tablesorter-ice td {
color: #333;
}
/* hovered row colors */
.tablesorter-ice tbody > tr.hover > td,
.tablesorter-ice tbody > tr:hover > td,
.tablesorter-ice tbody > tr.even:hover > td,
.tablesorter-ice tbody > tr.odd:hover > td {
background-color: #ebf2fa;
}
/* table processing indicator */
.tablesorter-ice .tablesorter-processing {
background-position: center center !important;
background-repeat: no-repeat !important;
/* background-image: url(images/loading.gif) !important; */
background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=') !important;
}
/* Zebra Widget - row alternating colors */
.tablesorter-ice tr.odd > td {
background-color: #dfdfdf;
}
.tablesorter-ice tr.even > td {
background-color: #efefef;
}
/* Column Widget - column sort colors */
.tablesorter-ice td.primary,
.tablesorter-ice tr.odd td.primary {
background-color: #9ae5e5;
}
.tablesorter-ice tr.even td.primary {
background-color: #c2f0f0;
}
.tablesorter-ice td.secondary,
.tablesorter-ice tr.odd td.secondary {
background-color: #c2f0f0;
}
.tablesorter-ice tr.even td.secondary {
background-color: #d5f5f5;
}
.tablesorter-ice td.tertiary,
.tablesorter-ice tr.odd td.tertiary {
background-color: #d5f5f5;
}
.tablesorter-ice tr.even td.tertiary {
background-color: #ebfafa;
}
/* sticky headers */
.tablesorter-ice.containsStickyHeaders thead tr:nth-child(1) th,
.tablesorter-ice.containsStickyHeaders thead tr:nth-child(1) td {
border-top: #ccc 1px solid;
}
/* caption */
.tablesorter-ice > caption {
background-color: #fff;
}
/* filter widget */
.tablesorter-ice .tablesorter-filter-row {
background-color: #eee;
}
.tablesorter-ice .tablesorter-filter-row td {
background-color: #eee;
line-height: normal;
text-align: center; /* center the input */
-webkit-transition: line-height 0.1s ease;
-moz-transition: line-height 0.1s ease;
-o-transition: line-height 0.1s ease;
transition: line-height 0.1s ease;
}
/* optional disabled input styling */
.tablesorter-ice .tablesorter-filter-row .disabled {
opacity: 0.5;
filter: alpha(opacity=50);
cursor: not-allowed;
}
/* hidden filter row */
.tablesorter-ice .tablesorter-filter-row.hideme td {
/*** *********************************************** ***/
/*** change this padding to modify the thickness ***/
/*** of the closed filter row (height = padding x 2) ***/
padding: 2px;
/*** *********************************************** ***/
margin: 0;
line-height: 0;
cursor: pointer;
}
.tablesorter-ice .tablesorter-filter-row.hideme * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
/* filters */
.tablesorter-ice input.tablesorter-filter,
.tablesorter-ice select.tablesorter-filter {
width: 98%;
height: auto;
margin: 0;
padding: 4px;
background-color: #fff;
border: 1px solid #bbb;
color: #333;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: height 0.1s ease;
-moz-transition: height 0.1s ease;
-o-transition: height 0.1s ease;
transition: height 0.1s ease;
}
/* rows hidden by filtering (needed for child rows) */
.tablesorter .filtered {
display: none;
}
/* ajax error row */
.tablesorter .tablesorter-errorRow td {
text-align: center;
cursor: pointer;
background-color: #e6bf99;
}

View File

@ -0,0 +1,164 @@
/*************
jQuery UI Theme
*************/
/* overall */
.tablesorter-jui {
width: 100%;
border-collapse: separate;
border-spacing: 2px; /* adjust spacing between table cells */
margin: 10px 0 15px;
padding: 5px;
font-size: 0.8em;
}
/* header */
.tablesorter-jui thead th,
.tablesorter-jui thead td,
.tablesorter-jui tfoot th,
.tablesorter-jui tfoot td {
position: relative;
background-repeat: no-repeat;
background-position: right center;
/* UI hover and active states make the font normal and the table resizes, this fixes it */
font-weight: bold !important;
border-width: 1px !important;
text-align: left;
padding: 8px; /* wider than the icon */
}
.tablesorter-jui .header,
.tablesorter-jui .tablesorter-header {
cursor: pointer;
white-space: normal;
}
.tablesorter-jui .tablesorter-header-inner {
padding-right: 20px;
}
.tablesorter-jui thead tr th .ui-icon {
position: absolute;
right: 3px;
top: 50%;
margin-top: -8px; /* half the icon height; older IE doesn't like this */
}
.tablesorter-jui thead .sorter-false {
cursor: default;
}
.tablesorter-jui thead tr .sorter-false .ui-icon {
display: none;
}
/* tfoot */
.tablesorter-jui tfoot th,
.tablesorter-jui tfoot td {
font-weight: normal !important;
font-size: .9em;
padding: 2px;
}
/* tbody */
.tablesorter-jui td {
padding: 4px;
vertical-align: top;
}
/* hovered row colors */
.tablesorter-jui tbody > tr.hover > td,
.tablesorter-jui tbody > tr:hover > td {
opacity: 0.7;
filter: alpha(opacity=70);
}
/* table processing indicator */
.tablesorter-jui .tablesorter-processing .tablesorter-header-inner {
background-position: center center !important;
background-repeat: no-repeat !important;
/* background-image: url(images/loading.gif) !important; */
background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=') !important;
}
/* Zebra widget - This allows you to use ui-state-default as the zebra stripe color */
.tablesorter-jui tr.ui-state-default {
background-image: none;
font-weight: normal;
}
/* processing background color */
.tablesorter-jui .tablesorter-processing {
background-color: #ddd; /* older browsers that don't support rgba */
background-color: rgba(255,255,255,0.8);
}
/* caption */
.tablesorter-jui > caption {
border: 0;
}
/* filter widget */
.tablesorter-jui .tablesorter-filter-row {
background-color: transparent;
}
.tablesorter-jui .tablesorter-filter-row td {
background-color: transparent;
line-height: normal;
text-align: center; /* center the input */
-webkit-transition: line-height 0.1s ease;
-moz-transition: line-height 0.1s ease;
-o-transition: line-height 0.1s ease;
transition: line-height 0.1s ease;
}
/* optional disabled input styling */
.tablesorter-jui .tablesorter-filter-row .disabled {
opacity: 0.5;
filter: alpha(opacity=50);
cursor: not-allowed;
}
/* hidden filter row */
.tablesorter-jui .tablesorter-filter-row.hideme td {
/*** *********************************************** ***/
/*** change this padding to modify the thickness ***/
/*** of the closed filter row (height = padding x 2) ***/
padding: 2px;
/*** *********************************************** ***/
margin: 0;
line-height: 0;
cursor: pointer;
}
.tablesorter-jui .tablesorter-filter-row.hideme * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
/* filters */
.tablesorter-jui input.tablesorter-filter,
.tablesorter-jui select.tablesorter-filter {
width: 98%;
height: auto;
margin: 0;
padding: 4px;
background-color: #fff;
border: 1px solid #bbb;
color: #333;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: height 0.1s ease;
-moz-transition: height 0.1s ease;
-o-transition: height 0.1s ease;
transition: height 0.1s ease;
}
/* rows hidden by filtering (needed for child rows) */
.tablesorter .filtered {
display: none;
}
/* ajax error row */
.tablesorter .tablesorter-errorRow td {
text-align: center;
cursor: pointer;
background-color: #e6bf99;
}

View File

@ -0,0 +1,176 @@
/*************
Materialize theme (http://materializecss.com/)
*************/
/* jQuery materialize Theme */
.tablesorter-materialize {
width: 100%;
}
.tablesorter-materialize thead th,
.tablesorter-materialize thead td,
.tablesorter-materialize tfoot th,
.tablesorter-materialize tfoot td {
font: 14px/20px Arial, Sans-serif;
font-weight: bold;
padding: 4px;
margin: 0 0 18px;
background-color: #eee;
}
.tablesorter-materialize .tablesorter-header {
cursor: pointer;
}
.tablesorter-materialize .sorter-false {
cursor: default;
}
.tablesorter-materialize .tablesorter-header-inner {
position: relative;
padding: 4px 18px 4px 4px;
}
/* sort icons */
.tablesorter-materialize thead .tablesorter-header {
background-repeat: no-repeat;
background-position: center right;
padding: 4px 18px 4px 4px;
white-space: normal;
cursor: pointer;
}
/* black unsorted icon */
.tablesorter-materialize thead .tablesorter-headerUnSorted {
/* <svg xmlns="http://www.w3.org/2000/svg" width="18" height="12" viewBox="0 0 24 16"><path d="M15 8 1 8 8 0zM15 9 1 9 8 16z" fill="#222"/></svg> */
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDI0IDE2Ij48cGF0aCBkPSJNMTUgOCAxIDggOCAwek0xNSA5IDEgOSA4IDE2eiIgZmlsbD0iIzIyMiIvPjwvc3ZnPg==);
}
/* black asc icon */
.tablesorter-materialize thead .tablesorter-headerAsc {
/* <svg xmlns="http://www.w3.org/2000/svg" width="18" height="12" viewBox="0 0 24 16"><path d="M15 11 1 11 8 3z" fill="#222"/></svg> */
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDI0IDE2Ij48cGF0aCBkPSJNMTUgMTEgMSAxMSA4IDN6IiBmaWxsPSIjMjIyIi8+PC9zdmc+);
}
/* black desc icon */
.tablesorter-materialize thead .tablesorter-headerDesc {
/* <svg xmlns="http://www.w3.org/2000/svg" width="18" height="12" viewBox="0 0 24 16"><path d="M15 6 1 6 8 13z" fill="#222"/></svg> */
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDI0IDE2Ij48cGF0aCBkPSJNMTUgNiAxIDYgOCAxM3oiIGZpbGw9IiMyMjIiLz48L3N2Zz4=);
}
/* white unsorted icon */
.tablesorter-materialize-dark thead .tablesorter-headerUnSorted {
/* <svg xmlns="http://www.w3.org/2000/svg" width="18" height="12" viewBox="0 0 24 16"><path d="M15 8 1 8 8 0zM15 9 1 9 8 16z" fill="#fff"/></svg> */
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDI0IDE2Ij48cGF0aCBkPSJNMTUgOCAxIDggOCAwek0xNSA5IDEgOSA4IDE2eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==);
}
/* white asc icon */
.tablesorter-materialize-dark thead .tablesorter-headerAsc {
/* <svg xmlns="http://www.w3.org/2000/svg" width="18" height="12" viewBox="0 0 24 16"><path d="M15 11 1 11 8 3z" fill="#fff"/></svg> */
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDI0IDE2Ij48cGF0aCBkPSJNMTUgMTEgMSAxMSA4IDN6IiBmaWxsPSIjZmZmIi8+PC9zdmc+);
}
/* white desc icon */
.tablesorter-materialize-dark thead .tablesorter-headerDesc {
/* <svg xmlns="http://www.w3.org/2000/svg" width="18" height="12" viewBox="0 0 24 16"><path d="M15 6 1 6 8 13z" fill="#fff"/></svg> */
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMiIgdmlld0JveD0iMCAwIDI0IDE2Ij48cGF0aCBkPSJNMTUgNiAxIDYgOCAxM3oiIGZpbGw9IiNmZmYiLz48L3N2Zz4=);
}
/* since materialize (table-striped) uses nth-child(), we just use this to add a zebra stripe color */
.tablesorter-materialize > tbody > tr.odd > td,
.tablesorter-materialize > tbody > tr.tablesorter-hasChildRow.odd:hover ~ tr.tablesorter-hasChildRow.odd ~ .tablesorter-childRow.odd > td {
background-color: #f9f9f9;
}
.tablesorter-materialize > tbody > tr.hover > td,
.tablesorter-materialize > tbody > tr.odd:hover > td,
.tablesorter-materialize > tbody > tr.even:hover > td,
.tablesorter-materialize > tbody > tr.tablesorter-hasChildRow.odd:hover ~ .tablesorter-childRow.odd > td,
.tablesorter-materialize > tbody > tr.tablesorter-hasChildRow.even:hover ~ .tablesorter-childRow.even > td {
background-color: #f5f5f5;
}
.tablesorter-materialize > tbody > tr.even > td,
.tablesorter-materialize > tbody > tr.tablesorter-hasChildRow.even:hover ~ tr.tablesorter-hasChildRow.even ~ .tablesorter-childRow.even > td {
background-color: #fff;
}
/* processing icon */
.tablesorter-materialize .tablesorter-processing {
background-image: url('data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=');
background-position: center center !important;
background-repeat: no-repeat !important;
}
/* caption */
.tablesorter-materialize > .caption {
background-color: #fff;
}
/* filter widget */
.tablesorter-materialize .tablesorter-filter-row input.tablesorter-filter,
.tablesorter-materialize .tablesorter-filter-row select.tablesorter-filter {
width: 98%;
margin: 0;
padding: 4px 6px;
color: #333;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: height 0.1s ease;
-moz-transition: height 0.1s ease;
-o-transition: height 0.1s ease;
transition: height 0.1s ease;
}
.tablesorter-materialize .tablesorter-filter-row .tablesorter-filter.disabled {
background-color: #eee;
color: #555;
cursor: not-allowed;
border: 1px solid #ccc;
border-radius: 4px;
box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.075) inset;
box-sizing: border-box;
transition: height 0.1s ease;
}
.tablesorter-materialize .tablesorter-filter-row {
background-color: #efefef;
}
.tablesorter-materialize .tablesorter-filter-row td {
background-color: #efefef;
line-height: normal;
text-align: center;
padding: 4px 6px;
vertical-align: middle;
-webkit-transition: line-height 0.1s ease;
-moz-transition: line-height 0.1s ease;
-o-transition: line-height 0.1s ease;
transition: line-height 0.1s ease;
}
/* hidden filter row */
.tablesorter-materialize .tablesorter-filter-row.hideme td {
padding: 2px; /* change this to modify the thickness of the closed border row */
margin: 0;
line-height: 0;
}
.tablesorter-materialize .tablesorter-filter-row.hideme * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
/* rows hidden by filtering (needed for child rows) */
.tablesorter .filtered {
display: none;
}
/* pager plugin */
.tablesorter-materialize .tablesorter-pager select {
padding: 4px 6px;
display: inline-block;
width: auto;
}
.tablesorter-materialize .tablesorter-pager .pagedisplay {
border: 0;
}
/* ajax error row */
.tablesorter .tablesorter-errorRow td {
text-align: center;
cursor: pointer;
background-color: #e6bf99;
}

View File

@ -0,0 +1,197 @@
/*************
Metro Dark Theme
*************/
/* overall */
.tablesorter-metro-dark {
width: 100%;
font: 12px/18px 'Segoe UI Semilight', 'Open Sans', Verdana, Arial, Helvetica, sans-serif;
color: #000;
background-color: #333;
border-spacing: 0;
margin: 10px 0 15px;
text-align: left;
}
.tablesorter-metro-dark tr.dark-row th, .tablesorter-metro-dark tr.dark-row td, .tablesorter-metro-dark caption.dark-row {
background-color: #222;
color: #fff;
padding: 2px;
text-align: left;
font-size: 14px;
}
/* header/footer */
.tablesorter-metro-dark caption,
.tablesorter-metro-dark th,
.tablesorter-metro-dark thead td,
.tablesorter-metro-dark tfoot th,
.tablesorter-metro-dark tfoot td {
font-weight: 300;
font-size: 15px;
color: #ddd;
background-color: #333;
padding: 4px;
}
.tablesorter-metro-dark .header,
.tablesorter-metro-dark .tablesorter-header {
background-image: url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQBAMAAADQT4M0AAAAGFBMVEUAAADu7u7u7u7u7u7u7u7u7u7u7u7u7u5jNePWAAAACHRSTlMAMxIHKwEgMWD59H4AAABSSURBVAjXY2BgYFJgAAHzYhDJ6igSAKTYBAUTgJSioKAQAwNzoaCguAFDiCAQuDIkgigxBgiA8cJAVCpQt6AgSL+JoKAzA0gjUBsQqBcBCYhFAAE/CV4zeSzxAAAAAElFTkSuQmCC);
background-position: right 5px center;
background-repeat: no-repeat;
cursor: pointer;
white-space: normal;
}
.tablesorter-metro-dark .tablesorter-header-inner {
padding: 0 18px 0 4px;
}
.tablesorter-metro-dark thead .headerSortUp,
.tablesorter-metro-dark thead .tablesorter-headerSortUp,
.tablesorter-metro-dark thead .tablesorter-headerAsc {
background-image: url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQBAMAAADQT4M0AAAAIVBMVEUAAADu7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u5meJAOAAAACnRSTlMAMwsqXt+gIBUGxGoDMAAAAFlJREFUCNctzC0SQAAUReEzGNQ3AlHRiSRZFCVZYgeswRL8hLdK7834wj3tAlGP6y7fYHpKS6w6WwbVG0I1NZVnZPG8/DYxOYlnhUYkA06R1s9ESsxR4NIdPhkPFDFYuEnMAAAAAElFTkSuQmCC);
}
.tablesorter-metro-dark thead .headerSortDown,
.tablesorter-metro-dark thead .tablesorter-headerSortDown,
.tablesorter-metro-dark thead .tablesorter-headerDesc {
background-image: url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAQBAMAAADQT4M0AAAALVBMVEUAAADu7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7i0NViAAAADnRSTlMAMiweCQITTvDctZZqaTlM310AAABcSURBVAjXY2BgYEtgAAFHERDJqigUAKSYBQUNgFSioKAYAwOLIBA4MASBKFUGQxAlzAAF+94BwWuGKBC1lIFl3rt3Lx0YGCzevWsGSjK9e6cAUlT3HKyW9wADAwDRrBiDy6bKzwAAAABJRU5ErkJggg==);
}
.tablesorter-metro-dark thead .sorter-false {
background-image: none;
cursor: default;
padding: 4px;
}
/* tbody */
.tablesorter-metro-dark td {
background-color: #fff;
padding: 4px;
vertical-align: top;
}
/* hovered row colors */
.tablesorter-metro-dark tbody > tr.hover > td,
.tablesorter-metro-dark tbody > tr:hover > td,
.tablesorter-metro-dark tbody > tr.even:hover > td,
.tablesorter-metro-dark tbody > tr.odd:hover > td {
background-color: #bbb;
color: #000;
}
/* table processing indicator */
.tablesorter-metro-dark .tablesorter-processing {
background-position: center center !important;
background-repeat: no-repeat !important;
/* background-image: url(images/loading.gif) !important; */
background-image: url(data:image/gif;base64,R0lGODlhFAAUAKEAAO7u7lpaWgAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQBCgACACwAAAAAFAAUAAACQZRvoIDtu1wLQUAlqKTVxqwhXIiBnDg6Y4eyx4lKW5XK7wrLeK3vbq8J2W4T4e1nMhpWrZCTt3xKZ8kgsggdJmUFACH5BAEKAAIALAcAAAALAAcAAAIUVB6ii7jajgCAuUmtovxtXnmdUAAAIfkEAQoAAgAsDQACAAcACwAAAhRUIpmHy/3gUVQAQO9NetuugCFWAAAh+QQBCgACACwNAAcABwALAAACE5QVcZjKbVo6ck2AF95m5/6BSwEAIfkEAQoAAgAsBwANAAsABwAAAhOUH3kr6QaAcSrGWe1VQl+mMUIBACH5BAEKAAIALAIADQALAAcAAAIUlICmh7ncTAgqijkruDiv7n2YUAAAIfkEAQoAAgAsAAAHAAcACwAAAhQUIGmHyedehIoqFXLKfPOAaZdWAAAh+QQFCgACACwAAAIABwALAAACFJQFcJiXb15zLYRl7cla8OtlGGgUADs=) !important;
}
/* pager */
.tablesorter-metro-dark .tablesorter-pager button {
background-color: #444;
color: #eee;
border: #555 1px solid;
cursor: pointer;
}
.tablesorter-metro-dark .tablesorter-pager button:hover {
background-color: #555;
}
/* Zebra Widget - row alternating colors */
.tablesorter-metro-dark tr.odd > td {
background-color: #eee;
}
.tablesorter-metro-dark tr.even > td {
background-color: #fff;
}
/* Column Widget - column sort colors */
.tablesorter-metro-dark tr.odd td.primary {
background-color: #bfbfbf;
}
.tablesorter-metro-dark td.primary,
.tablesorter-metro-dark tr.even td.primary {
background-color: #d9d9d9;
}
.tablesorter-metro-dark tr.odd td.secondary {
background-color: #d9d9d9;
}
.tablesorter-metro-dark td.secondary,
.tablesorter-metro-dark tr.even td.secondary {
background-color: #e6e6e6;
}
.tablesorter-metro-dark tr.odd td.tertiary {
background-color: #e6e6e6;
}
.tablesorter-metro-dark td.tertiary,
.tablesorter-metro-dark tr.even td.tertiary {
background-color: #f2f2f2;
}
/* filter widget */
.tablesorter-metro-dark .tablesorter-filter-row {
background-color: #eee;
}
.tablesorter-metro-dark .tablesorter-filter-row td {
background-color: #eee;
line-height: normal;
text-align: center; /* center the input */
-webkit-transition: line-height 0.1s ease;
-moz-transition: line-height 0.1s ease;
-o-transition: line-height 0.1s ease;
transition: line-height 0.1s ease;
}
/* optional disabled input styling */
.tablesorter-metro-dark .tablesorter-filter-row .disabled {
opacity: 0.5;
filter: alpha(opacity=50);
cursor: not-allowed;
}
/* hidden filter row */
.tablesorter-metro-dark .tablesorter-filter-row.hideme td {
/*** *********************************************** ***/
/*** change this padding to modify the thickness ***/
/*** of the closed filter row (height = padding x 2) ***/
padding: 2px;
/*** *********************************************** ***/
margin: 0;
line-height: 0;
cursor: pointer;
}
.tablesorter-metro-dark .tablesorter-filter-row.hideme * {
height: 1px;
min-height: 0;
border: 0;
padding: 0;
margin: 0;
/* don't use visibility: hidden because it disables tabbing */
opacity: 0;
filter: alpha(opacity=0);
}
/* filters */
.tablesorter-metro-dark input.tablesorter-filter,
.tablesorter-metro-dark select.tablesorter-filter {
width: 95%;
height: auto;
margin: 0;
padding: 4px;
background-color: #fff;
border: 1px solid #bbb;
color: #333;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-transition: height 0.1s ease;
-moz-transition: height 0.1s ease;
-o-transition: height 0.1s ease;
transition: height 0.1s ease;
}
/* rows hidden by filtering (needed for child rows) */
.tablesorter .filtered {
display: none;
}
/* ajax error row */
.tablesorter .tablesorter-errorRow td {
text-align: center;
cursor: pointer;
background-color: #e6bf99;
}

View File

@ -0,0 +1,38 @@
/* Grouping widget css */
tr.group-header td {
background: #eee;
}
.group-name {
text-transform: uppercase;
font-weight: bold;
}
.group-count {
color: #999;
}
.group-hidden {
display: none !important;
}
.group-header, .group-header td {
user-select: none;
-moz-user-select: none;
}
/* collapsed arrow */
tr.group-header td i {
display: inline-block;
width: 0;
height: 0;
border-top: 4px solid transparent;
border-bottom: 4px solid #888;
border-right: 4px solid #888;
border-left: 4px solid transparent;
margin-right: 7px;
user-select: none;
-moz-user-select: none;
}
tr.group-header.collapsed td i {
border-top: 5px solid transparent;
border-bottom: 5px solid transparent;
border-left: 5px solid #888;
border-right: 0;
margin-right: 10px;
}