2021-01-03
This commit is contained in:
commit
18468be006
22
Websites/SharePrices/SharePrices.sln
Normal file
22
Websites/SharePrices/SharePrices.sln
Normal 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
|
BIN
Websites/SharePrices/SharePrices.v12.suo
Normal file
BIN
Websites/SharePrices/SharePrices.v12.suo
Normal file
Binary file not shown.
216
Websites/SharePrices/SharePrices/App_Code/DataAccessLayer.vb
Normal file
216
Websites/SharePrices/SharePrices/App_Code/DataAccessLayer.vb
Normal 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
|
@ -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
|
649
Websites/SharePrices/SharePrices/CreateDBSchema.sql
Normal file
649
Websites/SharePrices/SharePrices/CreateDBSchema.sql
Normal 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
|
||||
|
||||
*/
|
119
Websites/SharePrices/SharePrices/FlotTest.html
Normal file
119
Websites/SharePrices/SharePrices/FlotTest.html
Normal 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>
|
89
Websites/SharePrices/SharePrices/HtmlPage1.html
Normal file
89
Websites/SharePrices/SharePrices/HtmlPage1.html
Normal 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>
|
12
Websites/SharePrices/SharePrices/My Project/Application.Designer.vb
generated
Normal file
12
Websites/SharePrices/SharePrices/My Project/Application.Designer.vb
generated
Normal 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
|
||||
|
@ -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>
|
34
Websites/SharePrices/SharePrices/My Project/AssemblyInfo.vb
Normal file
34
Websites/SharePrices/SharePrices/My Project/AssemblyInfo.vb
Normal 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")>
|
@ -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
|
61
Websites/SharePrices/SharePrices/My Project/Resources.Designer.vb
generated
Normal file
61
Websites/SharePrices/SharePrices/My Project/Resources.Designer.vb
generated
Normal 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
|
117
Websites/SharePrices/SharePrices/My Project/Resources.resx
Normal file
117
Websites/SharePrices/SharePrices/My Project/Resources.resx
Normal 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>
|
72
Websites/SharePrices/SharePrices/My Project/Settings.Designer.vb
generated
Normal file
72
Websites/SharePrices/SharePrices/My Project/Settings.Designer.vb
generated
Normal 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
|
@ -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>
|
97
Websites/SharePrices/SharePrices/SharePrices.aspx
Normal file
97
Websites/SharePrices/SharePrices/SharePrices.aspx
Normal 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">×</span></span> !-->
|
||||
<table class="modal-title"><tr><td id="modalTitle">Title</td><td class="close">×</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>
|
15
Websites/SharePrices/SharePrices/SharePrices.aspx.designer.vb
generated
Normal file
15
Websites/SharePrices/SharePrices/SharePrices.aspx.designer.vb
generated
Normal 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
|
136
Websites/SharePrices/SharePrices/SharePrices.aspx.vb
Normal file
136
Websites/SharePrices/SharePrices/SharePrices.aspx.vb
Normal 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 + ""esCount=6&newsCount=0&enableFuzzyQuery=false"esQueryId=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
|
222
Websites/SharePrices/SharePrices/SharePrices.vbproj
Normal file
222
Websites/SharePrices/SharePrices/SharePrices.vbproj
Normal 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>
|
27
Websites/SharePrices/SharePrices/SharePrices.vbproj.user
Normal file
27
Websites/SharePrices/SharePrices/SharePrices.vbproj.user
Normal 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>
|
66
Websites/SharePrices/SharePrices/SharePricesModal.css
Normal file
66
Websites/SharePrices/SharePrices/SharePricesModal.css
Normal 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; }
|
70
Websites/SharePrices/SharePrices/SharePricesStyles.css
Normal file
70
Websites/SharePrices/SharePrices/SharePricesStyles.css
Normal 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; }
|
30
Websites/SharePrices/SharePrices/Web.Debug.config
Normal file
30
Websites/SharePrices/SharePrices/Web.Debug.config
Normal 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>
|
31
Websites/SharePrices/SharePrices/Web.Release.config
Normal file
31
Websites/SharePrices/SharePrices/Web.Release.config
Normal 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>
|
24
Websites/SharePrices/SharePrices/Web.config
Normal file
24
Websites/SharePrices/SharePrices/Web.config
Normal 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>
|
BIN
Websites/SharePrices/SharePrices/bin/SharePrices.dll
Normal file
BIN
Websites/SharePrices/SharePrices/bin/SharePrices.dll
Normal file
Binary file not shown.
24
Websites/SharePrices/SharePrices/bin/SharePrices.dll.config
Normal file
24
Websites/SharePrices/SharePrices/bin/SharePrices.dll.config
Normal 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>
|
BIN
Websites/SharePrices/SharePrices/bin/SharePrices.pdb
Normal file
BIN
Websites/SharePrices/SharePrices/bin/SharePrices.pdb
Normal file
Binary file not shown.
36
Websites/SharePrices/SharePrices/bin/SharePrices.xml
Normal file
36
Websites/SharePrices/SharePrices/bin/SharePrices.xml
Normal 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>
|
1312
Websites/SharePrices/SharePrices/jquery-ui.css
vendored
Normal file
1312
Websites/SharePrices/SharePrices/jquery-ui.css
vendored
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
BIN
Websites/SharePrices/SharePrices/obj/Debug/SharePrices.dll
Normal file
BIN
Websites/SharePrices/SharePrices/obj/Debug/SharePrices.dll
Normal file
Binary file not shown.
BIN
Websites/SharePrices/SharePrices/obj/Debug/SharePrices.pdb
Normal file
BIN
Websites/SharePrices/SharePrices/obj/Debug/SharePrices.pdb
Normal file
Binary file not shown.
@ -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
|
Binary file not shown.
36
Websites/SharePrices/SharePrices/obj/Debug/SharePrices.xml
Normal file
36
Websites/SharePrices/SharePrices/obj/Debug/SharePrices.xml
Normal 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>
|
Binary file not shown.
77
Websites/SharePrices/SharePrices/scripts/FlotGaps.js
Normal file
77
Websites/SharePrices/SharePrices/scripts/FlotGaps.js
Normal 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;
|
||||
}
|
||||
}
|
1520
Websites/SharePrices/SharePrices/scripts/SharePrices.js
Normal file
1520
Websites/SharePrices/SharePrices/scripts/SharePrices.js
Normal file
File diff suppressed because it is too large
Load Diff
2
Websites/SharePrices/SharePrices/scripts/jquery-3.5.1.min.js
vendored
Normal file
2
Websites/SharePrices/SharePrices/scripts/jquery-3.5.1.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
13
Websites/SharePrices/SharePrices/scripts/jquery-ui.min.js
vendored
Normal file
13
Websites/SharePrices/SharePrices/scripts/jquery-ui.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -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);
|
3168
Websites/SharePrices/SharePrices/scripts/jquery.flot.js
Normal file
3168
Websites/SharePrices/SharePrices/scripts/jquery.flot.js
Normal file
File diff suppressed because it is too large
Load Diff
786
Websites/SharePrices/SharePrices/scripts/jquery.flot.pie.js
Normal file
786
Websites/SharePrices/SharePrices/scripts/jquery.flot.pie.js
Normal 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);
|
7
Websites/SharePrices/SharePrices/scripts/jquery.flot.time.min.js
vendored
Normal file
7
Websites/SharePrices/SharePrices/scripts/jquery.flot.time.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
3
Websites/SharePrices/SharePrices/scripts/js.cookie-2.2.1.min.js
vendored
Normal file
3
Websites/SharePrices/SharePrices/scripts/js.cookie-2.2.1.min.js
vendored
Normal 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(){})});
|
@ -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;
|
||||
}
|
@ -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);
|
||||
}
|
@ -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
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user