diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3ed1868 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +# https://git-scm.com/docs/gitignore +# https://help.github.com/articles/ignoring-files +# Example .gitignore files: https://github.com/github/gitignore +/nbproject \ No newline at end of file diff --git a/README.md b/README.md index c7865d5..8f6a80b 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,18 @@ WWW SQL Designer was created by [Ondrej Zara](http://ondras.zarovi.cz/) and is b If you wish to support this project, Donate at PayPal at PayPal! +## Shortcuts + +- **F2** = save local +- **F4** = load local + +- **a** = New table +- **e** = Edit table | Edit row +- **f** = add field +- **x** = create foreign key +- **c** = connect foreign key +- **+** / **-** = zoom in or out + # News ## Moved to GitHub diff --git a/backend/asp-file/Default.aspx b/backend/asp-file/Default.aspx index 5be09a7..d5384c3 100644 --- a/backend/asp-file/Default.aspx +++ b/backend/asp-file/Default.aspx @@ -1 +1 @@ -<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="backend_asp_file_Default" validateRequest="false" %> +<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="backend_asp_file_Default" validateRequest="false" %> diff --git a/backend/asp-file/Default.aspx.cs b/backend/asp-file/Default.aspx.cs index 6bd232c..f05ba3b 100644 --- a/backend/asp-file/Default.aspx.cs +++ b/backend/asp-file/Default.aspx.cs @@ -1,70 +1,70 @@ -using System; -using System.Collections.Generic; -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.IO; - -public partial class backend_asp_file_Default : System.Web.UI.Page -{ - protected void Page_Load(object sender, EventArgs e) - { - Response.Clear(); - - string action = Request.Params["action"].ToLower(); - - if (action.Equals("list")) - { - list(); - } - - if (action.Equals("load")) - { - load(); - } - - if (action.Equals("save")) - { - save(); - } - - Response.End(); - } - - private void list() - { - string[] filePaths = Directory.GetFiles(Server.MapPath("data")); - foreach (string filePath in filePaths) - { - Response.Write(Path.GetFileName(filePath) + "\n"); - } - } - - private void load() - { - string fNaam = "data/" + Request.Params["keyword"].ToLower(); - Response.ContentType = "text/xml"; - if (File.Exists(Server.MapPath(fNaam))) - { - Response.WriteFile(Server.MapPath(fNaam)); - } - else - { - Response.StatusCode = 404; - } - } - - private void save() - { - string fNaam = "data/" + Request.Params["keyword"].ToLower(); - FileStream fs = new FileStream(Server.MapPath(fNaam), FileMode.Create); - - byte[] buffer = new byte[1024]; - int count; - while ((count = Request.InputStream.Read(buffer, 0, buffer.Length)) != 0) - fs.Write(buffer, 0, count); - - fs.Close(); - - } -} +using System; +using System.Collections.Generic; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.IO; + +public partial class backend_asp_file_Default : System.Web.UI.Page +{ + protected void Page_Load(object sender, EventArgs e) + { + Response.Clear(); + + string action = Request.Params["action"].ToLower(); + + if (action.Equals("list")) + { + list(); + } + + if (action.Equals("load")) + { + load(); + } + + if (action.Equals("save")) + { + save(); + } + + Response.End(); + } + + private void list() + { + string[] filePaths = Directory.GetFiles(Server.MapPath("data")); + foreach (string filePath in filePaths) + { + Response.Write(Path.GetFileName(filePath) + "\n"); + } + } + + private void load() + { + string fNaam = "data/" + Request.Params["keyword"].ToLower(); + Response.ContentType = "text/xml"; + if (File.Exists(Server.MapPath(fNaam))) + { + Response.WriteFile(Server.MapPath(fNaam)); + } + else + { + Response.StatusCode = 404; + } + } + + private void save() + { + string fNaam = "data/" + Request.Params["keyword"].ToLower(); + FileStream fs = new FileStream(Server.MapPath(fNaam), FileMode.Create); + + byte[] buffer = new byte[1024]; + int count; + while ((count = Request.InputStream.Read(buffer, 0, buffer.Length)) != 0) + fs.Write(buffer, 0, count); + + fs.Close(); + + } +} diff --git a/backend/perl-file/index.pl b/backend/perl-file/index.pl index cbdf5bb..5fff9b5 100644 --- a/backend/perl-file/index.pl +++ b/backend/perl-file/index.pl @@ -72,4 +72,4 @@ else { print $query->header(-status => "501 Not Implemented"); } - \ No newline at end of file + diff --git a/backend/php-cubrid/cubrid_mysql_compat.php b/backend/php-cubrid/cubrid_mysql_compat.php index 3ae2a8e..38b6139 100644 --- a/backend/php-cubrid/cubrid_mysql_compat.php +++ b/backend/php-cubrid/cubrid_mysql_compat.php @@ -1,399 +1,399 @@ - 0) { - list($host, $port)=explode(":", $server, 2); - } else { - $host=$server; - $port=$GLOBALS['cubrid_default_port']; // default port - } - - // save database name - $GLOBALS['cubrid_database']=$database; - - return cubrid_connect($host, $port, $database, $username, $password); -} - -// MySQL syntax: -// bool mysql_close ( [resource link_identifier] ) -function cubrid_mysql_close($link_identifier) { - return cubrid_disconnect($link_identifier); -} - -// MySQL syntax: -function cubrid_mysql_errno($link_identifier = '') { - // int mysql_errno ( [resource link_identifier] ) - return cubrid_error_code(); -} - -// MySQL syntax: -function cubrid_mysql_error($link_identifier = '') { - // string mysql_error ( [resource link_identifier] ) - return cubrid_error_msg(); -} - -// MySQL syntax: -// resource mysql_query ( string query [, resource link_identifier] ) -function cubrid_mysql_query_native($query, $link_identifier) { - $result=cubrid_execute($link_identifier, $query); - // Cubrid does not do commit automatically by default (auto-commit is off by default) - cubrid_commit ($link_identifier); - return $result; -} - -// MySQL syntax: -// resource mysql_query ( string query [, resource link_identifier] ) -function cubrid_mysql_query($query, $link_identifier, $last_insert_id_column = '') { - $cubrid_query=trim($query); // need to trim to make sure we are handling properly the ";" terminator - - if ($GLOBALS['calculate_last_insert_id']) { - // HACK - Cubrid does not support yet INSERT_ID() - // We need to alter the INSERT query to be able to get last_insert_id - if (startsWith($cubrid_query, "insert", false)) { - if ($cubrid_query[strlen($cubrid_query) - 1] == ";") { // remove the ";" last char - $cubrid_query=substr($cubrid_query, 0, strlen($cubrid_query) - 1) . " INTO :xyz;"; - } else { - $cubrid_query=$cubrid_query . " INTO :xyz;"; - } - } - } - - $result=cubrid_execute($link_identifier, $cubrid_query); - - if (!$result) { - return false; - } - - if ($GLOBALS['calculate_last_insert_id']) { - if (startsWith($cubrid_query, "insert", false)) { - // get the last_insert_id for the specified column (In Cubrid can be multiple auto_increment columns) - if (strlen($last_insert_id_column) > 0) { - $GLOBALS['cubrid_last_insert_id']=cubrid_get_value(cubrid_last_insert_id_query($last_insert_id_column), - $link_identifier); - } - } else { - $GLOBALS['cubrid_last_insert_id']=0; // (re)set to 0 - } - } - cubrid_commit ($link_identifier); - return $result; -} - -// MySQL syntax: -// array mysql_free_result ( resource $link_identifier ) -function cubrid_mysql_free_result($link_identifier) { - return cubrid_free_result($link_identifier); -} - -// MySQL syntax: -// array mysql_fetch_row ( resource result ) -function cubrid_mysql_fetch_row($result) { - return cubrid_fetch_row($result); -} - -// MySQL syntax: -// array mysql_fetch_array ( resource result [, int result_type] ) -function cubrid_mysql_fetch_array($result, $result_type = 0) { - return cubrid_fetch($result, $result_type); -} - -// MySQL syntax: -// object mysql_fetch_object ( resource result ) -function cubrid_mysql_fetch_object($result) { - return cubrid_fetch_object($result); -} - -// MySQL syntax: -// bool mysql_data_seek ( resource result, int row_number ) -function cubrid_mysql_move_cursor($result, $offset) { - return cubrid_move_cursor($result, $offset); -} - -// MySQL syntax: -// object mysql_fetch_field ( resource result [, int field_offset] ) -function cubrid_mysql_fetch_field($result) { - return cubrid_fetch_field($result); -} - -// MySQL syntax: -// int mysql_insert_id ( [resource link_identifier] ) -function cubrid_mysql_insert_id($link_identifier = -1) { - return $GLOBALS['cubrid_last_insert_id']; -} - -// MySQL syntax: -// int mysql_num_rows ( resource result ) -function cubrid_mysql_num_rows($resultSet) { - return cubrid_num_rows($resultSet); -} - -// MySQL syntax: -// int mysql_num_fields ( resource result ) -function cubrid_mysql_num_fields($resultSet) { - return cubrid_num_cols($resultSet); -} - -// MySQL syntax: -// bool mysql_data_seek ( resource result, int row_number ) -function cubrid_mysql_data_seek($result, $row_number) { - return cubrid_data_seek($result, $row_number); -} - -// MySQL syntax: -// Zero if successful. Non-zero if an error occurred. -function cubrid_mysql_commit($link_identifier) { - return cubrid_commit($link_identifier); -} - -// MySQL syntax: -// Zero if successful. Non-zero if an error occurred. -function cubrid_mysql_rollback($link_identifier) { - return cubrid_rollback($link_identifier); -} - -// MySQL syntax: -// string mysql_real_escape_string ( string unescaped_string [, resource link_identifier] ) -function cubrid_mysql_real_escape_string($unescaped_string, $link_identifier = '') { - return str_replace("'", "''", $unescaped_string); -} - -// MySQL syntax: -// string mysql_result ( resource $result , int $row [, mixed $field = 0 ] ) -function cubrid_mysql_result($result, $row, $field = 0) { - return cubrid_result($result, $row, $field); -} - -// MySQL syntax: -// array mysql_fetch_assoc ( resource $result ) -function cubrid_mysql_fetch_assoc($result) { - return cubrid_fetch_assoc($result); -} - -// implements SHOW TABLES -function cubrid_SHOW_TABLES($link_identifier) { - return cubrid_mysql_query_native(get_SQL_SHOW_TABLES(), $link_identifier); -} - -// implements DESCRIBE -function cubrid_DESCRIBE($table, $link_identifier) { - return cubrid_mysql_query_native(get_SQL_describeTableSQL($table), $link_identifier); -} - -// implements SHOW INDEX -function cubrid_SHOW_INDEX_FROM($table, $link_identifier) { - return cubrid_mysql_query_native(get_SQL_SHOW_INDEX_FROM($table), $link_identifier); -} - -// gets data type for a table -function cubrid_ColumnDataType($identifier, $table, $column) { - $id_result =cubrid_mysql_query_native(get_SQL_ColumnDataType($table, $column), $identifier); - $id_row =cubrid_fetch_row($id_result); - cubrid_free_result ($id_result); - $calculated_value=$id_row[0]; - return $calculated_value; -} - -// gets a single value as a query result -function cubrid_get_value($query, $link_identifier) { - $result=cubrid_execute($link_identifier, $query); - - if ($result) { - $row =cubrid_fetch_row($result); - $value=$row[0]; - } else { - return -1; - } - - return $value; -} - -// returns the last_insert_id value -function cubrid_last_insert_id_query($last_insert_id_column, $cubrid_var = "xyz") { - return "SELECT :" . $cubrid_var . "." . $last_insert_id_column . " FROM db_root"; -} - -// returns the last_insert_id value -function cubrid_last_insert_id($last_insert_id_column, $link_identifier, $cubrid_var = "xyz") { - return cubrid_get_value(cubrid_last_insert_id_query($last_insert_id_column), $link_identifier); -} - -// return the current Cubrid database name -function cubrid_current_database() { - return $GLOBALS['cubrid_database']; -} - -// The following columns are returned: -// Field, Type, Null (YES,NO), Key (PRI,MUL), Default, Extra -function get_SQL_describeTableSQL($table) { - $sql=""; - $sql=$sql . "SELECT a.attr_name as \"Field\"," . " "; - $sql=$sql . "a.data_type || '(' || a.prec || ',' || a.scale || ')' as \"Type\"," . " "; - $sql=$sql . "a.prec || ',' || a.scale as \"Size\"," . " "; - $sql=$sql . "a.is_nullable as \"Null\"," . " "; - $sql=$sql . "'*' as \"Key\"," . " "; - $sql=$sql . "a.default_value as \"Default\"," . " "; - $sql=$sql . "'' as \"Extra\"" . " "; - $sql=$sql . "FROM db_attribute a" . " "; - $sql=$sql . "WHERE a.class_name='" . $table . "'" . " "; - $sql=$sql . "order by a.def_order ASC"; - - return $sql; -} - -// The column data type is returned -function get_SQL_ColumnDataType($table, $column) { - $sql=""; - $sql=$sql . "SELECT a.data_type" . " "; - $sql=$sql . "FROM db_attribute a" . " "; - $sql=$sql . "WHERE a.class_name='" . $table . "'" . " "; - $sql=$sql . "AND a.attr_name='" . $column . "'" . " "; - $sql=$sql . "order by a.def_order ASC"; - - return $sql; -} - -// The following columns are returned: -// Table,Non_unique,Key_name,Seq_in_index,Column_name,Collation,Cardinality,Sub_part,Packed,Index_type,Comment -function get_SQL_SHOW_INDEX_FROM($table) { - $query=""; - $query=$query . "select distinct a.class_name as \"Table\"," . " "; - $query=$query . "DECODE(a.is_unique, 'YES', 'True') as \"Non_unique\"," . " "; - $query=$query . "a.index_name as \"Key_name\"," . " "; - $query=$query . "b.key_order as \"Seq_in_index\"," . " "; - $query=$query . "b.key_attr_name as \"Column_name\"," . " "; - $query=$query . "'' as \"Collation\"," . " "; - $query=$query . "'' as \"Cardinality\"," . " "; - $query=$query . "'' as \"Sub_part\"," . " "; - $query=$query . "'' as \"Packed\"," . " "; - $query=$query . "'' as \"Index_type\"," . " "; - $query=$query . "'' as \"Comment\"" . " "; - $query=$query . "from \"db_index\" a, \"db_index_key\" b" . " "; - $query=$query . "where a.index_name = b.index_name" . " "; - $query=$query . "and b.key_attr_name in (select attr_name from db_attribute where class_name = '" . $table . "')" . " "; - $query=$query . "and a.is_foreign_key = 'NO'" . " "; - $query=$query . "and a.class_name = '" . $table . "'" . " "; - $query=$query . "order by a.index_name, b.key_order,b.key_attr_name"; - - return $query; -} - -// returns the list of non-system tables -function get_SQL_SHOW_TABLES($pattern = '') { - if (strlen($pattern) > 0) { - return "select class_name from db_class where class_type='CLASS' and is_system_class='NO' WHERE class_name LIKE '" - . $pattern . "' order by class_name ASC"; - } else { - return "select class_name from db_class where class_type='CLASS' and is_system_class='NO' order by class_name ASC"; - } -} - -// gets Primary Keys information -function columnIsPK($dbl, $table, $column) { - $ret = false; - - $sql = ""; - $sql = $sql . "select db_index_key.key_attr_name" . " "; - $sql = $sql . "from db_index, db_index_key" . " "; - $sql = $sql . "where db_index.index_name = db_index_key.index_name" . " "; - $sql = $sql . "and db_index.class_name='" . $table . "'" . " "; - $sql = $sql . "and db_index_key.key_attr_name='" . $column . "'" . " "; - $sql = $sql . "and db_index.is_primary_key='YES'"; - - $tableSql = cubrid_execute($dbl, $sql); - - if (@cubrid_num_rows($tableSql) > 0) { - $ret=true; - } - - return $ret; -} - -// emulates DROP TABLE IF EXISTS -function DROP_TABLE_IF_EXISTS($tablename, $link_identifier) { - $id_result - =cubrid_mysql_query_native("SELECT class_name FROM db_class WHERE class_name='" . $tablename . "'", - $link_identifier); - $rows=cubrid_num_rows($id_result); - - if ($rows > 0) { - cubrid_execute($link_identifier, "DROP TABLE " . $tablename); - } -} - -// The following columns are returned: -// Field, Type, Null (YES,NO), Key (PRI,MUL), Default, Extra -function get_SQL_SHOW_COLUMNS($table) { - $sql=""; - $sql=$sql . "SELECT a.attr_name as \"Field\"," . " "; - $sql=$sql . "a.data_type || '(' || a.prec || ',' || a.scale || ')' as \"Type\"," . " "; - $sql=$sql . "a.prec || ',' || a.scale as \"Size\"," . " "; - $sql=$sql . "a.is_nullable as \"Null\"," . " "; - $sql=$sql . "'*' as \"Key\"," . " "; - $sql=$sql . "a.default_value as \"Default\"," . " "; - $sql=$sql . "'' as \"Extra\"" . " "; - $sql=$sql . "FROM db_attribute a" . " "; - $sql=$sql . "WHERE a.class_name='" . $table . "'" . " "; - $sql=$sql . "order by a.def_order ASC"; - - return $sql; -} - -function startsWith($haystack, $needle, $case = true) { - if ($case) { - return strpos($haystack, $needle, 0) == 0; - } else { - return stripos($haystack, $needle, 0) == 0; - } -} - -function endsWith($haystack, $needle, $case = true) { - $expectedPosition=strlen($haystack) - strlen($needle); - - if ($case) { - return strrpos($haystack, $needle, 0) == $expectedPosition; - } else { - return strripos($haystack, $needle, 0) == $expectedPosition; - } -} - -?> \ No newline at end of file + 0) { + list($host, $port)=explode(":", $server, 2); + } else { + $host=$server; + $port=$GLOBALS['cubrid_default_port']; // default port + } + + // save database name + $GLOBALS['cubrid_database']=$database; + + return cubrid_connect($host, $port, $database, $username, $password); +} + +// MySQL syntax: +// bool mysql_close ( [resource link_identifier] ) +function cubrid_mysql_close($link_identifier) { + return cubrid_disconnect($link_identifier); +} + +// MySQL syntax: +function cubrid_mysql_errno($link_identifier = '') { + // int mysql_errno ( [resource link_identifier] ) + return cubrid_error_code(); +} + +// MySQL syntax: +function cubrid_mysql_error($link_identifier = '') { + // string mysql_error ( [resource link_identifier] ) + return cubrid_error_msg(); +} + +// MySQL syntax: +// resource mysql_query ( string query [, resource link_identifier] ) +function cubrid_mysql_query_native($query, $link_identifier) { + $result=cubrid_execute($link_identifier, $query); + // Cubrid does not do commit automatically by default (auto-commit is off by default) + cubrid_commit ($link_identifier); + return $result; +} + +// MySQL syntax: +// resource mysql_query ( string query [, resource link_identifier] ) +function cubrid_mysql_query($query, $link_identifier, $last_insert_id_column = '') { + $cubrid_query=trim($query); // need to trim to make sure we are handling properly the ";" terminator + + if ($GLOBALS['calculate_last_insert_id']) { + // HACK - Cubrid does not support yet INSERT_ID() + // We need to alter the INSERT query to be able to get last_insert_id + if (startsWith($cubrid_query, "insert", false)) { + if ($cubrid_query[strlen($cubrid_query) - 1] == ";") { // remove the ";" last char + $cubrid_query=substr($cubrid_query, 0, strlen($cubrid_query) - 1) . " INTO :xyz;"; + } else { + $cubrid_query=$cubrid_query . " INTO :xyz;"; + } + } + } + + $result=cubrid_execute($link_identifier, $cubrid_query); + + if (!$result) { + return false; + } + + if ($GLOBALS['calculate_last_insert_id']) { + if (startsWith($cubrid_query, "insert", false)) { + // get the last_insert_id for the specified column (In Cubrid can be multiple auto_increment columns) + if (strlen($last_insert_id_column) > 0) { + $GLOBALS['cubrid_last_insert_id']=cubrid_get_value(cubrid_last_insert_id_query($last_insert_id_column), + $link_identifier); + } + } else { + $GLOBALS['cubrid_last_insert_id']=0; // (re)set to 0 + } + } + cubrid_commit ($link_identifier); + return $result; +} + +// MySQL syntax: +// array mysql_free_result ( resource $link_identifier ) +function cubrid_mysql_free_result($link_identifier) { + return cubrid_free_result($link_identifier); +} + +// MySQL syntax: +// array mysql_fetch_row ( resource result ) +function cubrid_mysql_fetch_row($result) { + return cubrid_fetch_row($result); +} + +// MySQL syntax: +// array mysql_fetch_array ( resource result [, int result_type] ) +function cubrid_mysql_fetch_array($result, $result_type = 0) { + return cubrid_fetch($result, $result_type); +} + +// MySQL syntax: +// object mysql_fetch_object ( resource result ) +function cubrid_mysql_fetch_object($result) { + return cubrid_fetch_object($result); +} + +// MySQL syntax: +// bool mysql_data_seek ( resource result, int row_number ) +function cubrid_mysql_move_cursor($result, $offset) { + return cubrid_move_cursor($result, $offset); +} + +// MySQL syntax: +// object mysql_fetch_field ( resource result [, int field_offset] ) +function cubrid_mysql_fetch_field($result) { + return cubrid_fetch_field($result); +} + +// MySQL syntax: +// int mysql_insert_id ( [resource link_identifier] ) +function cubrid_mysql_insert_id($link_identifier = -1) { + return $GLOBALS['cubrid_last_insert_id']; +} + +// MySQL syntax: +// int mysql_num_rows ( resource result ) +function cubrid_mysql_num_rows($resultSet) { + return cubrid_num_rows($resultSet); +} + +// MySQL syntax: +// int mysql_num_fields ( resource result ) +function cubrid_mysql_num_fields($resultSet) { + return cubrid_num_cols($resultSet); +} + +// MySQL syntax: +// bool mysql_data_seek ( resource result, int row_number ) +function cubrid_mysql_data_seek($result, $row_number) { + return cubrid_data_seek($result, $row_number); +} + +// MySQL syntax: +// Zero if successful. Non-zero if an error occurred. +function cubrid_mysql_commit($link_identifier) { + return cubrid_commit($link_identifier); +} + +// MySQL syntax: +// Zero if successful. Non-zero if an error occurred. +function cubrid_mysql_rollback($link_identifier) { + return cubrid_rollback($link_identifier); +} + +// MySQL syntax: +// string mysql_real_escape_string ( string unescaped_string [, resource link_identifier] ) +function cubrid_mysql_real_escape_string($unescaped_string, $link_identifier = '') { + return str_replace("'", "''", $unescaped_string); +} + +// MySQL syntax: +// string mysql_result ( resource $result , int $row [, mixed $field = 0 ] ) +function cubrid_mysql_result($result, $row, $field = 0) { + return cubrid_result($result, $row, $field); +} + +// MySQL syntax: +// array mysql_fetch_assoc ( resource $result ) +function cubrid_mysql_fetch_assoc($result) { + return cubrid_fetch_assoc($result); +} + +// implements SHOW TABLES +function cubrid_SHOW_TABLES($link_identifier) { + return cubrid_mysql_query_native(get_SQL_SHOW_TABLES(), $link_identifier); +} + +// implements DESCRIBE +function cubrid_DESCRIBE($table, $link_identifier) { + return cubrid_mysql_query_native(get_SQL_describeTableSQL($table), $link_identifier); +} + +// implements SHOW INDEX +function cubrid_SHOW_INDEX_FROM($table, $link_identifier) { + return cubrid_mysql_query_native(get_SQL_SHOW_INDEX_FROM($table), $link_identifier); +} + +// gets data type for a table +function cubrid_ColumnDataType($identifier, $table, $column) { + $id_result =cubrid_mysql_query_native(get_SQL_ColumnDataType($table, $column), $identifier); + $id_row =cubrid_fetch_row($id_result); + cubrid_free_result ($id_result); + $calculated_value=$id_row[0]; + return $calculated_value; +} + +// gets a single value as a query result +function cubrid_get_value($query, $link_identifier) { + $result=cubrid_execute($link_identifier, $query); + + if ($result) { + $row =cubrid_fetch_row($result); + $value=$row[0]; + } else { + return -1; + } + + return $value; +} + +// returns the last_insert_id value +function cubrid_last_insert_id_query($last_insert_id_column, $cubrid_var = "xyz") { + return "SELECT :" . $cubrid_var . "." . $last_insert_id_column . " FROM db_root"; +} + +// returns the last_insert_id value +function cubrid_last_insert_id($last_insert_id_column, $link_identifier, $cubrid_var = "xyz") { + return cubrid_get_value(cubrid_last_insert_id_query($last_insert_id_column), $link_identifier); +} + +// return the current Cubrid database name +function cubrid_current_database() { + return $GLOBALS['cubrid_database']; +} + +// The following columns are returned: +// Field, Type, Null (YES,NO), Key (PRI,MUL), Default, Extra +function get_SQL_describeTableSQL($table) { + $sql=""; + $sql=$sql . "SELECT a.attr_name as \"Field\"," . " "; + $sql=$sql . "a.data_type || '(' || a.prec || ',' || a.scale || ')' as \"Type\"," . " "; + $sql=$sql . "a.prec || ',' || a.scale as \"Size\"," . " "; + $sql=$sql . "a.is_nullable as \"Null\"," . " "; + $sql=$sql . "'*' as \"Key\"," . " "; + $sql=$sql . "a.default_value as \"Default\"," . " "; + $sql=$sql . "'' as \"Extra\"" . " "; + $sql=$sql . "FROM db_attribute a" . " "; + $sql=$sql . "WHERE a.class_name='" . $table . "'" . " "; + $sql=$sql . "order by a.def_order ASC"; + + return $sql; +} + +// The column data type is returned +function get_SQL_ColumnDataType($table, $column) { + $sql=""; + $sql=$sql . "SELECT a.data_type" . " "; + $sql=$sql . "FROM db_attribute a" . " "; + $sql=$sql . "WHERE a.class_name='" . $table . "'" . " "; + $sql=$sql . "AND a.attr_name='" . $column . "'" . " "; + $sql=$sql . "order by a.def_order ASC"; + + return $sql; +} + +// The following columns are returned: +// Table,Non_unique,Key_name,Seq_in_index,Column_name,Collation,Cardinality,Sub_part,Packed,Index_type,Comment +function get_SQL_SHOW_INDEX_FROM($table) { + $query=""; + $query=$query . "select distinct a.class_name as \"Table\"," . " "; + $query=$query . "DECODE(a.is_unique, 'YES', 'True') as \"Non_unique\"," . " "; + $query=$query . "a.index_name as \"Key_name\"," . " "; + $query=$query . "b.key_order as \"Seq_in_index\"," . " "; + $query=$query . "b.key_attr_name as \"Column_name\"," . " "; + $query=$query . "'' as \"Collation\"," . " "; + $query=$query . "'' as \"Cardinality\"," . " "; + $query=$query . "'' as \"Sub_part\"," . " "; + $query=$query . "'' as \"Packed\"," . " "; + $query=$query . "'' as \"Index_type\"," . " "; + $query=$query . "'' as \"Comment\"" . " "; + $query=$query . "from \"db_index\" a, \"db_index_key\" b" . " "; + $query=$query . "where a.index_name = b.index_name" . " "; + $query=$query . "and b.key_attr_name in (select attr_name from db_attribute where class_name = '" . $table . "')" . " "; + $query=$query . "and a.is_foreign_key = 'NO'" . " "; + $query=$query . "and a.class_name = '" . $table . "'" . " "; + $query=$query . "order by a.index_name, b.key_order,b.key_attr_name"; + + return $query; +} + +// returns the list of non-system tables +function get_SQL_SHOW_TABLES($pattern = '') { + if (strlen($pattern) > 0) { + return "select class_name from db_class where class_type='CLASS' and is_system_class='NO' WHERE class_name LIKE '" + . $pattern . "' order by class_name ASC"; + } else { + return "select class_name from db_class where class_type='CLASS' and is_system_class='NO' order by class_name ASC"; + } +} + +// gets Primary Keys information +function columnIsPK($dbl, $table, $column) { + $ret = false; + + $sql = ""; + $sql = $sql . "select db_index_key.key_attr_name" . " "; + $sql = $sql . "from db_index, db_index_key" . " "; + $sql = $sql . "where db_index.index_name = db_index_key.index_name" . " "; + $sql = $sql . "and db_index.class_name='" . $table . "'" . " "; + $sql = $sql . "and db_index_key.key_attr_name='" . $column . "'" . " "; + $sql = $sql . "and db_index.is_primary_key='YES'"; + + $tableSql = cubrid_execute($dbl, $sql); + + if (@cubrid_num_rows($tableSql) > 0) { + $ret=true; + } + + return $ret; +} + +// emulates DROP TABLE IF EXISTS +function DROP_TABLE_IF_EXISTS($tablename, $link_identifier) { + $id_result + =cubrid_mysql_query_native("SELECT class_name FROM db_class WHERE class_name='" . $tablename . "'", + $link_identifier); + $rows=cubrid_num_rows($id_result); + + if ($rows > 0) { + cubrid_execute($link_identifier, "DROP TABLE " . $tablename); + } +} + +// The following columns are returned: +// Field, Type, Null (YES,NO), Key (PRI,MUL), Default, Extra +function get_SQL_SHOW_COLUMNS($table) { + $sql=""; + $sql=$sql . "SELECT a.attr_name as \"Field\"," . " "; + $sql=$sql . "a.data_type || '(' || a.prec || ',' || a.scale || ')' as \"Type\"," . " "; + $sql=$sql . "a.prec || ',' || a.scale as \"Size\"," . " "; + $sql=$sql . "a.is_nullable as \"Null\"," . " "; + $sql=$sql . "'*' as \"Key\"," . " "; + $sql=$sql . "a.default_value as \"Default\"," . " "; + $sql=$sql . "'' as \"Extra\"" . " "; + $sql=$sql . "FROM db_attribute a" . " "; + $sql=$sql . "WHERE a.class_name='" . $table . "'" . " "; + $sql=$sql . "order by a.def_order ASC"; + + return $sql; +} + +function startsWith($haystack, $needle, $case = true) { + if ($case) { + return strpos($haystack, $needle, 0) == 0; + } else { + return stripos($haystack, $needle, 0) == 0; + } +} + +function endsWith($haystack, $needle, $case = true) { + $expectedPosition=strlen($haystack) - strlen($needle); + + if ($case) { + return strrpos($haystack, $needle, 0) == $expectedPosition; + } else { + return strripos($haystack, $needle, 0) == $expectedPosition; + } +} + +?> diff --git a/backend/php-cubrid/index.php b/backend/php-cubrid/index.php index f575585..362fe41 100644 --- a/backend/php-cubrid/index.php +++ b/backend/php-cubrid/index.php @@ -192,4 +192,4 @@ function import($conn) { default: header("HTTP/1.0 501 Not Implemented"); } -?> \ No newline at end of file +?> diff --git a/backend/php-mysql+file/mysql_import.php b/backend/php-mysql+file/mysql_import.php index 8d399e0..796d684 100644 --- a/backend/php-mysql+file/mysql_import.php +++ b/backend/php-mysql+file/mysql_import.php @@ -92,4 +92,4 @@ function import() { $arr[] = ''; return implode("\n",$arr); } -?> \ No newline at end of file +?> diff --git a/backend/php-mysql/index.php b/backend/php-mysql/index.php index 2227eb9..e8f0903 100644 --- a/backend/php-mysql/index.php +++ b/backend/php-mysql/index.php @@ -217,4 +217,4 @@ function import() { save: 501/201 import: 501/200 */ -?> \ No newline at end of file +?> diff --git a/db/mssql/output.xsl b/db/mssql/output.xsl index 1474fcf..8fb73da 100644 --- a/db/mssql/output.xsl +++ b/db/mssql/output.xsl @@ -130,4 +130,4 @@ GO - \ No newline at end of file + diff --git a/db/sqlalchemy/datatypes.xml b/db/sqlalchemy/datatypes.xml index 75cee55..f572f07 100644 --- a/db/sqlalchemy/datatypes.xml +++ b/db/sqlalchemy/datatypes.xml @@ -24,4 +24,4 @@ - \ No newline at end of file + diff --git a/db/sqlalchemy/output.xsl b/db/sqlalchemy/output.xsl index 17d4d1f..d1df527 100644 --- a/db/sqlalchemy/output.xsl +++ b/db/sqlalchemy/output.xsl @@ -169,4 +169,4 @@ - \ No newline at end of file + diff --git a/db/vfp9/output.xsl b/db/vfp9/output.xsl index 1167872..4de2931 100644 --- a/db/vfp9/output.xsl +++ b/db/vfp9/output.xsl @@ -1,229 +1,229 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - LPARAMETERS teLongName, tcCommand, tcPath - - * [teLongName] False: set llDbc=.F. and generates "FREE", Empty: generates without "FREE" and "NAME", otherwise generates "NAME teLongName" - - * [tcCommand] if used, &tcCommand command will run after CREATE TABLE, f.e. "= MyProc( ALIAS(), m.lcTableComment, @lacComments )" - - * [tcPath] path where tables will be created (if not used, tables will be created in current folder) - - - LOCAL ARRAY lacComments[1,2] - - LOCAL llDbc, lcFreeOrName, lcTableComment - - llDbc = VARTYPE( m.teLongName )=[C] - - * no special support for llDbc=True yet (you could improve db\vfp9\output.xsl and remove "xsl:if test=[1=2]" from it) - - lcFreeOrName = IIF( m.llDbc, IIF( EMPTY( m.teLongName ), [], [NAME "] + m.teLongName + ["] ), [FREE] ) - - tcPath = IIF( VARTYPE( m.tcPath )=[L], [], ADDBS( m.tcPath ) ) - - - - - - - - ERASE ' - - .dbf' - - - ERASE ' - - .fpt' - - - ERASE ' - - .cdx' - - - ERASE ' - - .bak' - - - ERASE ' - - .tbk' - - - - - CREATE TABLE (m.tcPath + ' - - ') &lcFreeOrName - ( ; - - - - - - - - - - - NOT NULL - - - NULL - - - - AutoInc - - - - - - - - - - - - COMMENT ' - - - - - - ' - - - - - , ; - - - - ; - - - - - - - - , - - - PRIMARY KEY ( - FULLTEXT KEY ( - UNIQUE KEY ( - KEY ( - - - - - - , - - - ) - - - - - ) - - - lcTableComment = ' - - - - - - ' - - - - - DIMENSION lacComments[FCOUNT(),2] - - - lacComments[ - - ,1] = ' - - ' - - lacComments[ - - ,2] = ' - - - - - - ' - - - - - IF NOT EMPTY( m.tcCommand ) - - &tcCommand - - ENDIF - - - - - - - - - - - - - ALTER TABLE - - ADD FOREIGN KEY ( - - ) REFERENCES - - ( - - ); - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LPARAMETERS teLongName, tcCommand, tcPath + + * [teLongName] False: set llDbc=.F. and generates "FREE", Empty: generates without "FREE" and "NAME", otherwise generates "NAME teLongName" + + * [tcCommand] if used, &tcCommand command will run after CREATE TABLE, f.e. "= MyProc( ALIAS(), m.lcTableComment, @lacComments )" + + * [tcPath] path where tables will be created (if not used, tables will be created in current folder) + + + LOCAL ARRAY lacComments[1,2] + + LOCAL llDbc, lcFreeOrName, lcTableComment + + llDbc = VARTYPE( m.teLongName )=[C] + + * no special support for llDbc=True yet (you could improve db\vfp9\output.xsl and remove "xsl:if test=[1=2]" from it) + + lcFreeOrName = IIF( m.llDbc, IIF( EMPTY( m.teLongName ), [], [NAME "] + m.teLongName + ["] ), [FREE] ) + + tcPath = IIF( VARTYPE( m.tcPath )=[L], [], ADDBS( m.tcPath ) ) + + + + + + + + ERASE ' + + .dbf' + + + ERASE ' + + .fpt' + + + ERASE ' + + .cdx' + + + ERASE ' + + .bak' + + + ERASE ' + + .tbk' + + + + + CREATE TABLE (m.tcPath + ' + + ') &lcFreeOrName + ( ; + + + + + + + + + + + NOT NULL + + + NULL + + + + AutoInc + + + + + + + + + + + + COMMENT ' + + + + + + ' + + + + + , ; + + + + ; + + + + + + + + , + + + PRIMARY KEY ( + FULLTEXT KEY ( + UNIQUE KEY ( + KEY ( + + + + + + , + + + ) + + + + + ) + + + lcTableComment = ' + + + + + + ' + + + + + DIMENSION lacComments[FCOUNT(),2] + + + lacComments[ + + ,1] = ' + + ' + + lacComments[ + + ,2] = ' + + + + + + ' + + + + + IF NOT EMPTY( m.tcCommand ) + + &tcCommand + + ENDIF + + + + + + + + + + + + + ALTER TABLE + + ADD FOREIGN KEY ( + + ) REFERENCES + + ( + + ); + + + + + + + + + diff --git a/dropbox-oauth-receiver.html b/dropbox-oauth-receiver.html index fd16bad..6411592 100644 --- a/dropbox-oauth-receiver.html +++ b/dropbox-oauth-receiver.html @@ -11,4 +11,4 @@

Dropbox sign-in successful

Please close this window.

- \ No newline at end of file + diff --git a/fonts/roboto/Roboto-Black.ttf b/fonts/roboto/Roboto-Black.ttf new file mode 100644 index 0000000..cb905bc Binary files /dev/null and b/fonts/roboto/Roboto-Black.ttf differ diff --git a/fonts/roboto/Roboto-BlackItalic.ttf b/fonts/roboto/Roboto-BlackItalic.ttf new file mode 100644 index 0000000..3ebdc7d Binary files /dev/null and b/fonts/roboto/Roboto-BlackItalic.ttf differ diff --git a/fonts/roboto/Roboto-Bold.ttf b/fonts/roboto/Roboto-Bold.ttf new file mode 100644 index 0000000..68822ca Binary files /dev/null and b/fonts/roboto/Roboto-Bold.ttf differ diff --git a/fonts/roboto/Roboto-BoldItalic.ttf b/fonts/roboto/Roboto-BoldItalic.ttf new file mode 100644 index 0000000..aebf8eb Binary files /dev/null and b/fonts/roboto/Roboto-BoldItalic.ttf differ diff --git a/fonts/roboto/Roboto-Italic.ttf b/fonts/roboto/Roboto-Italic.ttf new file mode 100644 index 0000000..2041cbc Binary files /dev/null and b/fonts/roboto/Roboto-Italic.ttf differ diff --git a/fonts/roboto/Roboto-Light.ttf b/fonts/roboto/Roboto-Light.ttf new file mode 100644 index 0000000..aa45340 Binary files /dev/null and b/fonts/roboto/Roboto-Light.ttf differ diff --git a/fonts/roboto/Roboto-LightItalic.ttf b/fonts/roboto/Roboto-LightItalic.ttf new file mode 100644 index 0000000..a85444f Binary files /dev/null and b/fonts/roboto/Roboto-LightItalic.ttf differ diff --git a/fonts/roboto/Roboto-Medium.ttf b/fonts/roboto/Roboto-Medium.ttf new file mode 100644 index 0000000..a3c1a1f Binary files /dev/null and b/fonts/roboto/Roboto-Medium.ttf differ diff --git a/fonts/roboto/Roboto-MediumItalic.ttf b/fonts/roboto/Roboto-MediumItalic.ttf new file mode 100644 index 0000000..b828205 Binary files /dev/null and b/fonts/roboto/Roboto-MediumItalic.ttf differ diff --git a/fonts/roboto/Roboto-Regular.ttf b/fonts/roboto/Roboto-Regular.ttf new file mode 100644 index 0000000..0e58508 Binary files /dev/null and b/fonts/roboto/Roboto-Regular.ttf differ diff --git a/fonts/roboto/Roboto-Thin.ttf b/fonts/roboto/Roboto-Thin.ttf new file mode 100644 index 0000000..8779333 Binary files /dev/null and b/fonts/roboto/Roboto-Thin.ttf differ diff --git a/fonts/roboto/Roboto-ThinItalic.ttf b/fonts/roboto/Roboto-ThinItalic.ttf new file mode 100644 index 0000000..b79cb26 Binary files /dev/null and b/fonts/roboto/Roboto-ThinItalic.ttf differ diff --git a/fonts/roboto/RobotoCondensed-Bold.ttf b/fonts/roboto/RobotoCondensed-Bold.ttf new file mode 100644 index 0000000..3e06c7c Binary files /dev/null and b/fonts/roboto/RobotoCondensed-Bold.ttf differ diff --git a/fonts/roboto/RobotoCondensed-BoldItalic.ttf b/fonts/roboto/RobotoCondensed-BoldItalic.ttf new file mode 100644 index 0000000..aaf9fe0 Binary files /dev/null and b/fonts/roboto/RobotoCondensed-BoldItalic.ttf differ diff --git a/fonts/roboto/RobotoCondensed-Italic.ttf b/fonts/roboto/RobotoCondensed-Italic.ttf new file mode 100644 index 0000000..d2b611f Binary files /dev/null and b/fonts/roboto/RobotoCondensed-Italic.ttf differ diff --git a/fonts/roboto/RobotoCondensed-Light.ttf b/fonts/roboto/RobotoCondensed-Light.ttf new file mode 100644 index 0000000..d4eb198 Binary files /dev/null and b/fonts/roboto/RobotoCondensed-Light.ttf differ diff --git a/fonts/roboto/RobotoCondensed-LightItalic.ttf b/fonts/roboto/RobotoCondensed-LightItalic.ttf new file mode 100644 index 0000000..a08f3f4 Binary files /dev/null and b/fonts/roboto/RobotoCondensed-LightItalic.ttf differ diff --git a/fonts/roboto/RobotoCondensed-Regular.ttf b/fonts/roboto/RobotoCondensed-Regular.ttf new file mode 100644 index 0000000..b9fc49c Binary files /dev/null and b/fonts/roboto/RobotoCondensed-Regular.ttf differ diff --git a/images/back_dark.png b/images/back_dark.png new file mode 100644 index 0000000..93d1d76 Binary files /dev/null and b/images/back_dark.png differ diff --git a/images/back_dim.png b/images/back_dim.png new file mode 100644 index 0000000..83f4bb7 Binary files /dev/null and b/images/back_dim.png differ diff --git a/images/back_matrix.png b/images/back_matrix.png new file mode 100644 index 0000000..7178a71 Binary files /dev/null and b/images/back_matrix.png differ diff --git a/index.html b/index.html index 24b98ad..879aa88 100644 --- a/index.html +++ b/index.html @@ -1,283 +1,371 @@ - - WWW SQL Designer - - - - - - - - - - - - - - - - - - - - - - - - - - + + WWW SQL Designer + + + + + + + + + + + + + + - -
+ + + + + + + + + + + + + + + + + + + + + + -
-
-
- + +
+
+ +

+ [F2] Save local | [F4] Load local
[+] / [-] zoom
+

+ -
+
+ + + + + + + + + + + + + + + + - - - - - - - -
- - - - - - - - - -
- - - -
- -
+
+ + + + +
+
+ + +
+ + +
+ + + + +
+
+ + + +
+
-
- -
- -
-
-
- - -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * - - -
- * - - -
- - - - -
- - - - -
- - - -
- * - - -
- * - - -
- * - - -
+
-
+
+
+

+
+
+ + +
+
+ +
+ +
+ +
+ +
+

+
+
+
+ + +
+
+
+ + +
+
+
+
+ + + * +
+
+
+
+ + + * +
+
+
+
+ + + +
+
+
+
+ + + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + * +
+
+
+
+ + + * +
+
+
+
+ + + * +
+
+
+
+ + +
+
+ * +
+
+ +
+
+
+
+
    +
  • +
  • +
+
+ +
+ + +
+
+ + + +
+
+ + + + + + +
+
+
+
+ + +
+ + + + + +
+
+
+
+
+
+

+
+ +
+ + +
+
+
+
+ +
+
+

+
+
+ + +
+ + +
+
+
+

+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ +
+ +
+
+
    +
  • + +
  • +
  • + +
  • +
+
+
+
+ +
+ +
+
+
+
+
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + - * -
- -
- - - - - - - - - - -
-
- -
- - -
-
- - - -
-
- - - -
-
- -
-
-
- - -
- - - - - -
-
-
- - -
-
-
- -
-
- - - - -
-
- - - - - - - - - - - - - - - - - -
- - - - - -

-
- -
-
-
-
-
- -
-
-
- -
- - - - - - - - - - - -
- - - -
- - - -
-
- - - diff --git a/js/config.js b/js/config.js index 20af61c..14f1df9 100644 --- a/js/config.js +++ b/js/config.js @@ -1,30 +1,54 @@ var CONFIG = { - AVAILABLE_DBS: ["mysql", "sqlite", "web2py", "mssql", "postgresql", "oracle", "sqlalchemy", "vfp9", "cubrid", "web2py"], - DEFAULT_DB: "mysql", + AVAILABLE_DBS: ["mysql", "sqlite", "web2py", "mssql", "postgresql", "oracle", "sqlalchemy", "vfp9", "cubrid", "web2py"], + DEFAULT_DB: "mysql", AVAILABLE_LOCALES: ["ar", "cs", "de", "el", "en", "eo", "es", "fr", "hu", "it", "ja", "ko", "nl", "pl", "pt_BR", "ro", "ru", "sv", "zh"], DEFAULT_LOCALE: "en", - + AVAILABLE_BACKENDS: ["php-mysql", "php-s3", "php-blank", "php-file", "php-sqlite", "php-mysql+file", "php-postgresql", "php-pdo", "perl-file", "php-cubrid", "asp-file", "web2py"], DEFAULT_BACKEND: ["php-mysql"], - RELATION_THICKNESS: 2, - RELATION_SPACING: 15, - RELATION_COLORS: ["#000", "#800", "#080", "#008", "#088", "#808", "#088"], - - STATIC_PATH: "", - XHR_PATH: "", + RELATION_THICKNESS: 2, + RELATION_SPACING: 15, + RELATION_COLORS: ["#323232", "#F44336", "#E91E63", "#9C27B0", "#3F51B5", "#673AB7", "#2196F3", "#03A9F4", "#00BCD4", "#009688", "#4CAF50", "#8BC34A", "#CDDC39", "#FFC107", "#FF5722", "#795548", "#607D8B"], + + STATIC_PATH: "", + XHR_PATH: "", - /* - * The key below needs to be set individually by you if you want to use the Dropbox load/save feature. - * To do that, first sign up with Dropbox (may require a specific developer / SDK sign-up), go to - * https://www.dropbox.com/developers/apps and use "Create app" to add a new "Dropbox API app". - * Limit the app to its own folder. Call it, for instance, "wwwsqldesigner". - * Under "OAuth 2", "Redirect URIs", add the URL to the "dropbox-oauth-receiver.html" file on your server. - * E.g, if you install wwwsqldesigner on your local web server under "http://localhost/sqldesigner/", then add - * http://localhost/sqldesigner/dropbox-oauth-receiver.html as a Redirection URI. - * Copy the shown "App key" and paste it here below instead of the null value: - */ - DROPBOX_KEY: null // such as: "d6stdscwewhl6sa" + /* + * The key below needs to be set individually by you if you want to use the Dropbox load/save feature. + * To do that, first sign up with Dropbox (may require a specific developer / SDK sign-up), go to + * https://www.dropbox.com/developers/apps and use "Create app" to add a new "Dropbox API app". + * Limit the app to its own folder. Call it, for instance, "wwwsqldesigner". + * Under "OAuth 2", "Redirect URIs", add the URL to the "dropbox-oauth-receiver.html" file on your server. + * E.g, if you install wwwsqldesigner on your local web server under "http://localhost/sqldesigner/", then add + * http://localhost/sqldesigner/dropbox-oauth-receiver.html as a Redirection URI. + * Copy the shown "App key" and paste it here below instead of the null value: + */ + DROPBOX_KEY: null, // such as: "d6stdscwewhl6sa" -} + MATERIAL_TYPE_COLORS: ["#2196F3", "#F44336", "#E91E63", "#9C27B0", "#673AB7", "#3F51B5", "#03A9F4", "#00BCD4", "#009688", "#4CAF50", "#8BC34A", "#CDDC39", "#FFC107", "#FF5722", "#795548", "#607D8B"], + SHORTCUTS: { + saveLocal: { + key: 'F2', + code: false + }, + loadLocal: { + key: 'F4', + code: false + }, + addtable: {key: 'a', code: 65}, + edittable: {key: 'e', code: 69}, + editrow: {key: 'e', code: 69}, + addrow: {key: 'f', code: 70}, + removetable: {key: 'DELETE', code: 46}, + removerow: {key: 'DELETE', code: 46}, + uprow: {key: 'CTRL + UP', code: 38}, + downrow: {key: 'CTRL + DOWN', code: 40}, + foreigncreate: {key: 'x', code: 88}, + foreignconnect: {key: 'c', code: 67}, + zoomin: {key: '+', code: false}, + zoomout: {key: '-', code: false}, + toggle: {key: 'spacebar', code: 32} + } +}; diff --git a/js/globals.js b/js/globals.js index 46c7699..23c267e 100644 --- a/js/globals.js +++ b/js/globals.js @@ -1,65 +1,73 @@ function _(str) { /* getText */ - if (!(str in window.LOCALE)) { return str; } - return window.LOCALE[str]; + if (!(str in window.LOCALE)) { + return str; + } + return window.LOCALE[str]; } if (typeof String.prototype.endsWith !== 'function') { - String.prototype.endsWith = function(suffix) { - return this.indexOf(suffix, this.length - suffix.length) !== -1; - }; + String.prototype.endsWith = function (suffix) { + return this.indexOf(suffix, this.length - suffix.length) !== -1; + }; } if (!String.prototype.trim) { - String.prototype.trim = function() { - return this.match(/^\s*([\s\S]*?)\s*$/)[1]; - } + String.prototype.trim = function () { + return this.match(/^\s*([\s\S]*?)\s*$/)[1]; + } } if (!String.trim) { - String.trim = function(obj) { return String.prototype.trim.call(obj);} + String.trim = function (obj) { + return String.prototype.trim.call(obj); + } } if (!Object.create) { - Object.create = function (o) { - if (arguments.length > 1) { throw new Error("Object.create polyfill only accepts the first parameter"); } - var tmp = function() {}; - tmp.prototype = o; - return new tmp(); - }; + Object.create = function (o) { + if (arguments.length > 1) { + throw new Error("Object.create polyfill only accepts the first parameter"); + } + var tmp = function () {}; + tmp.prototype = o; + return new tmp(); + }; } var DATATYPES = false; var LOCALE = {}; var SQL = { - _subscribers: {}, - - publish: function(message, publisher, data) { - var subscribers = this._subscribers[message] || []; - var obj = { - target: publisher, - data: data - } - subscribers.forEach(function(subscriber) { subscriber(obj); }); - }, - - subscribe: function(message, subscriber) { - if (!(message in this._subscribers)) { - this._subscribers[message] = []; - } - var index = this._subscribers[message].indexOf(subscriber); - if (index == -1) { this._subscribers[message].push(subscriber); } - }, - - unsubscribe: function(message, subscriber) { - var index = this._subscribers[message].indexOf(subscriber); - if (index > -1) { this._subscribers[message].splice(index, 1); } - }, - - escape: function(str) { - return str.replace(/&/g, "&").replace(/>/g, ">").replace(/ -1) { + this._subscribers[message].splice(index, 1); + } + }, + escape: function (str) { + return str.replace(/&/g, "&").replace(/>/g, ">").replace(/= (5*1024*1024)/2) { /* this is a very big db structure... */ - alert("Warning: your database structure is above 5 megabytes in size, this is above the localStorage single key limit allowed by some browsers, example Mozilla Firefox 10"); - return; - } - - var key = this.promptName("serversaveprompt"); - if (!key) { return; } - - key = "wwwsqldesigner_databases_" + (key || "default"); - - try { - localStorage.setItem(key, xml); - if (localStorage.getItem(key) != xml) { throw new Error("Content verification failed"); } - } catch (e) { - alert("Error saving database structure to localStorage! ("+e.message+")"); - } +SQL.IO.prototype.clientlocalsave = function () { + if (!window.localStorage) { + alert("Sorry, your browser does not seem to support localStorage."); + return; + } + + var xml = this.owner.toXML(); + if (xml.length >= (5 * 1024 * 1024) / 2) { /* this is a very big db structure... */ + alert("Warning: your database structure is above 5 megabytes in size, this is above the localStorage single key limit allowed by some browsers, example Mozilla Firefox 10"); + return; + } + + var key = this.promptName("serversaveprompt"); + if (!key) { + return; + } + + key = "wwwsqldesigner_databases_" + (key || "default"); + + try { + localStorage.setItem(key, xml); + if (localStorage.getItem(key) != xml) { + throw new Error("Content verification failed"); + } + } catch (e) { + alert("Error saving database structure to localStorage! (" + e.message + ")"); + } } -SQL.IO.prototype.clientlocalload = function() { - if (!window.localStorage) { - alert("Sorry, your browser does not seem to support localStorage."); - return; - } - - var key = this.promptName("serverloadprompt"); - if (!key) { return; } - - key = "wwwsqldesigner_databases_" + (key || "default"); - - try { - var xml = localStorage.getItem(key); - if (!xml) { throw new Error("No data available"); } - } catch (e) { - alert("Error loading database structure from localStorage! ("+e.message+")"); - return; - } - - this.fromXMLText(xml); +SQL.IO.prototype.clientlocalload = function () { + if (!window.localStorage) { + alert("Sorry, your browser does not seem to support localStorage."); + return; + } + + var key = this.promptName("serverloadprompt"); + if (!key) { + return; + } + + key = "wwwsqldesigner_databases_" + (key || "default"); + + try { + var xml = localStorage.getItem(key); + if (!xml) { + throw new Error("No data available"); + } + } catch (e) { + alert("Error loading database structure from localStorage! (" + e.message + ")"); + return; + } + + this.fromXMLText(xml); } -SQL.IO.prototype.clientlocallist = function() { - if (!window.localStorage) { - alert("Sorry, your browser does not seem to support localStorage."); - return; - } - - /* --- Define some useful vars --- */ - var baseKeysName = "wwwsqldesigner_databases_"; - var localLen = localStorage.length; - var data = ""; - var schemasFound = false; - var code = 200; - - /* --- work --- */ - try { - for (var i = 0; i< localLen; ++i) { - var key = localStorage.key(i); - if((new RegExp(baseKeysName)).test(key)) { - var result = key.substring(baseKeysName.length); - schemasFound = true; - data += result + "\n"; - } - } - if (!schemasFound) { - throw new Error("No data available"); - } - } catch (e) { - alert("Error loading database names from localStorage! ("+e.message+")"); - return; - } - this.listresponse(data, code); +SQL.IO.prototype.clientlocallist = function () { + if (!window.localStorage) { + alert("Sorry, your browser does not seem to support localStorage."); + return; + } + + /* --- Define some useful vars --- */ + var baseKeysName = "wwwsqldesigner_databases_"; + var localLen = localStorage.length; + var data = ""; + var schemasFound = false; + var code = 200; + + /* --- work --- */ + try { + for (var i = 0; i < localLen; ++i) { + var key = localStorage.key(i); + if ((new RegExp(baseKeysName)).test(key)) { + var result = key.substring(baseKeysName.length); + schemasFound = true; + data += result + "\n"; + } + } + if (!schemasFound) { + throw new Error("No data available"); + } + } catch (e) { + alert("Error loading database names from localStorage! (" + e.message + ")"); + return; + } + this.listresponse(data, code); } /* ------------------------- Dropbox start ------------------------ */ @@ -228,272 +245,302 @@ SQL.IO.prototype.clientlocallist = function() { /** * The following code uses this lib: https://github.com/dropbox/dropbox-js */ -SQL.IO.prototype.dropBoxInit = function() { - if (CONFIG.DROPBOX_KEY) { - this.dropboxClient = new Dropbox.Client({ key: CONFIG.DROPBOX_KEY }); - } else { - this.dropboxClient = null; - // Hide the Dropbox buttons - var elems = document.querySelectorAll("[id^=dropbox]"); // gets all tags whose id start with "dropbox" - [].slice.call(elems).forEach( - function(elem) { elem.style.display = "none"; } - ); - } +SQL.IO.prototype.dropBoxInit = function () { + if (CONFIG.DROPBOX_KEY) { + this.dropboxClient = new Dropbox.Client({key: CONFIG.DROPBOX_KEY}); + } else { + this.dropboxClient = null; + // Hide the Dropbox buttons + var elems = document.querySelectorAll("[id^=dropbox]"); // gets all tags whose id start with "dropbox" + [].slice.call(elems).forEach( + function (elem) { + elem.style.display = "none"; + } + ); + } } -SQL.IO.prototype.showDropboxError = function(error) { - var prefix = _("Dropbox error")+": "; - var msg = error.status; - - switch (error.status) { - case Dropbox.ApiError.INVALID_TOKEN: - // If you're using dropbox.js, the only cause behind this error is that - // the user token expired. - // Get the user through the authentication flow again. - msg = _("Token expired - retry the operation, authenticating again with Dropbox"); - this.dropboxClient.reset(); - break; - - case Dropbox.ApiError.NOT_FOUND: - // The file or folder you tried to access is not in the user's Dropbox. - // Handling this error is specific to your application. - msg = _("File not found"); - break; - - case Dropbox.ApiError.OVER_QUOTA: - // The user is over their Dropbox quota. - // Tell them their Dropbox is full. Refreshing the page won't help. - msg = _("Dropbox is full"); - break; - - case Dropbox.ApiError.RATE_LIMITED: - // Too many API requests. Tell the user to try again later. - // Long-term, optimize your code to use fewer API calls. - break; - - case Dropbox.ApiError.NETWORK_ERROR: - // An error occurred at the XMLHttpRequest layer. - // Most likely, the user's network connection is down. - // API calls will not succeed until the user gets back online. - msg = _("Network error"); - break; - - case Dropbox.ApiError.INVALID_PARAM: - case Dropbox.ApiError.OAUTH_ERROR: - case Dropbox.ApiError.INVALID_METHOD: - default: - // Caused by a bug in dropbox.js, in your application, or in Dropbox. - // Tell the user an error occurred, ask them to refresh the page. - } - - alert (prefix+msg); +SQL.IO.prototype.showDropboxError = function (error) { + var prefix = _("Dropbox error") + ": "; + var msg = error.status; + + switch (error.status) { + case Dropbox.ApiError.INVALID_TOKEN: + // If you're using dropbox.js, the only cause behind this error is that + // the user token expired. + // Get the user through the authentication flow again. + msg = _("Token expired - retry the operation, authenticating again with Dropbox"); + this.dropboxClient.reset(); + break; + + case Dropbox.ApiError.NOT_FOUND: + // The file or folder you tried to access is not in the user's Dropbox. + // Handling this error is specific to your application. + msg = _("File not found"); + break; + + case Dropbox.ApiError.OVER_QUOTA: + // The user is over their Dropbox quota. + // Tell them their Dropbox is full. Refreshing the page won't help. + msg = _("Dropbox is full"); + break; + + case Dropbox.ApiError.RATE_LIMITED: + // Too many API requests. Tell the user to try again later. + // Long-term, optimize your code to use fewer API calls. + break; + + case Dropbox.ApiError.NETWORK_ERROR: + // An error occurred at the XMLHttpRequest layer. + // Most likely, the user's network connection is down. + // API calls will not succeed until the user gets back online. + msg = _("Network error"); + break; + + case Dropbox.ApiError.INVALID_PARAM: + case Dropbox.ApiError.OAUTH_ERROR: + case Dropbox.ApiError.INVALID_METHOD: + default: + // Caused by a bug in dropbox.js, in your application, or in Dropbox. + // Tell the user an error occurred, ask them to refresh the page. + } + + alert(prefix + msg); }; -SQL.IO.prototype.showDropboxAuthenticate = function(connectedCallBack) { - if (!this.dropboxClient) return false; - - // We want to use a popup window for authentication as the default redirection won't work for us as it'll make us lose our schema data - var href = window.location.href; - var prefix = href.substring(0, href.lastIndexOf('/')) + "/"; - this.dropboxClient.authDriver(new Dropbox.AuthDriver.Popup({ receiverUrl: prefix+"dropbox-oauth-receiver.html" })); - - // Now let's authenticate us - var sql_io = this; - sql_io.dropboxClient.authenticate( function(error, client) { - if (error) { - sql_io.showDropboxError(error); - } else { - // We're authenticated - connectedCallBack(); - } - return; - }); - - return true; +SQL.IO.prototype.showDropboxAuthenticate = function (connectedCallBack) { + if (!this.dropboxClient) + return false; + + // We want to use a popup window for authentication as the default redirection won't work for us as it'll make us lose our schema data + var href = window.location.href; + var prefix = href.substring(0, href.lastIndexOf('/')) + "/"; + this.dropboxClient.authDriver(new Dropbox.AuthDriver.Popup({receiverUrl: prefix + "dropbox-oauth-receiver.html"})); + + // Now let's authenticate us + var sql_io = this; + sql_io.dropboxClient.authenticate(function (error, client) { + if (error) { + sql_io.showDropboxError(error); + } else { + // We're authenticated + connectedCallBack(); + } + return; + }); + + return true; } -SQL.IO.prototype.dropboxsave = function() { - var sql_io = this; - sql_io.showDropboxAuthenticate( function() { - var key = sql_io.promptName("serversaveprompt", ".xml"); - if (!key) { return; } - - var filename = (key || "default") + ".xml"; - - sql_io.listresponse("Saving...", 200); - var xml = sql_io.owner.toXML(); - sql_io.dropboxClient.writeFile(filename, xml, function(error, stat) { - if (error) { - sql_io.listresponse("", 200); - return sql_io.showDropboxError(error); - } - sql_io.listresponse(filename+" "+_("was saved to Dropbox"), 200); - }); - }); +SQL.IO.prototype.dropboxsave = function () { + var sql_io = this; + sql_io.showDropboxAuthenticate(function () { + var key = sql_io.promptName("serversaveprompt", ".xml"); + if (!key) { + return; + } + + var filename = (key || "default") + ".xml"; + + sql_io.listresponse("Saving...", 200); + var xml = sql_io.owner.toXML(); + sql_io.dropboxClient.writeFile(filename, xml, function (error, stat) { + if (error) { + sql_io.listresponse("", 200); + return sql_io.showDropboxError(error); + } + sql_io.listresponse(filename + " " + _("was saved to Dropbox"), 200); + }); + }); } -SQL.IO.prototype.dropboxload = function() { - var sql_io = this; - sql_io.showDropboxAuthenticate( function() { - var key = sql_io.promptName("serverloadprompt", ".xml"); - if (!key) { return; } - - var filename = (key || "default") + ".xml"; - - sql_io.listresponse("Loading...", 200); - sql_io.dropboxClient.readFile(filename, function(error, data) { - sql_io.listresponse("", 200); - if (error) { - return sql_io.showDropboxError(error); - } - sql_io.fromXMLText(data); - }); - }); +SQL.IO.prototype.dropboxload = function () { + var sql_io = this; + sql_io.showDropboxAuthenticate(function () { + var key = sql_io.promptName("serverloadprompt", ".xml"); + if (!key) { + return; + } + + var filename = (key || "default") + ".xml"; + + sql_io.listresponse("Loading...", 200); + sql_io.dropboxClient.readFile(filename, function (error, data) { + sql_io.listresponse("", 200); + if (error) { + return sql_io.showDropboxError(error); + } + sql_io.fromXMLText(data); + }); + }); } -SQL.IO.prototype.dropboxlist = function() { - var sql_io = this; - sql_io.showDropboxAuthenticate( function() { - sql_io.listresponse("Loading...", 200); - sql_io.dropboxClient.readdir("/", function(error, entries) { - if (error) { - sql_io.listresponse("", 200); - return sql_io.showDropboxError(error); - } - var data = entries.join("\n")+"\n"; - sql_io.listresponse(data, 200); - }); - }); +SQL.IO.prototype.dropboxlist = function () { + var sql_io = this; + sql_io.showDropboxAuthenticate(function () { + sql_io.listresponse("Loading...", 200); + sql_io.dropboxClient.readdir("/", function (error, entries) { + if (error) { + sql_io.listresponse("", 200); + return sql_io.showDropboxError(error); + } + var data = entries.join("\n") + "\n"; + sql_io.listresponse(data, 200); + }); + }); } /* ------------------------- Dropbox end ------------------------ */ -SQL.IO.prototype.clientsql = function() { - var bp = this.owner.getOption("staticpath"); - var path = bp + "db/"+window.DATATYPES.getAttribute("db")+"/output.xsl"; - this.owner.window.showThrobber(); - OZ.Request(path, this.finish.bind(this), {xml:true}); +SQL.IO.prototype.clientsql = function () { + var bp = this.owner.getOption("staticpath"); + var path = bp + "db/" + window.DATATYPES.getAttribute("db") + "/output.xsl"; + this.owner.window.showThrobber(); + OZ.Request(path, this.finish.bind(this), {xml: true}); } -SQL.IO.prototype.finish = function(xslDoc) { - this.owner.window.hideThrobber(); - var xml = this.owner.toXML(); - var sql = ""; - try { - if (window.XSLTProcessor && window.DOMParser) { - var parser = new DOMParser(); - var xmlDoc = parser.parseFromString(xml, "text/xml"); - var xsl = new XSLTProcessor(); - xsl.importStylesheet(xslDoc); - var result = xsl.transformToDocument(xmlDoc); - sql = result.documentElement.textContent; - } else if (window.ActiveXObject || "ActiveXObject" in window) { - var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); - xmlDoc.loadXML(xml); - sql = xmlDoc.transformNode(xslDoc); - } else { - throw new Error("No XSLT processor available"); - } - } catch(e) { - alert(_("xmlerror")+': '+e.message); - return; - } - this.dom.ta.value = sql.trim(); +SQL.IO.prototype.finish = function (xslDoc) { + this.owner.window.hideThrobber(); + var xml = this.owner.toXML(); + var sql = ""; + try { + if (window.XSLTProcessor && window.DOMParser) { + var parser = new DOMParser(); + var xmlDoc = parser.parseFromString(xml, "text/xml"); + var xsl = new XSLTProcessor(); + xsl.importStylesheet(xslDoc); + var result = xsl.transformToDocument(xmlDoc); + sql = result.documentElement.textContent; + } else if (window.ActiveXObject || "ActiveXObject" in window) { + var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); + xmlDoc.loadXML(xml); + sql = xmlDoc.transformNode(xslDoc); + } else { + throw new Error("No XSLT processor available"); + } + } catch (e) { + alert(_("xmlerror") + ': ' + e.message); + return; + } + this.dom.ta.value = sql.trim(); } -SQL.IO.prototype.serversave = function(e, keyword) { - var name = keyword || prompt(_("serversaveprompt"), this._name); - if (!name) { return; } - this._name = name; - var xml = this.owner.toXML(); - var bp = this.owner.getOption("xhrpath"); - var url = bp + "backend/"+this.dom.backend.value+"/?action=save&keyword="+encodeURIComponent(name); - var h = {"Content-type":"application/xml"}; - this.owner.window.showThrobber(); - this.owner.setTitle(name); - OZ.Request(url, this.saveresponse, {xml:true, method:"post", data:xml, headers:h}); +SQL.IO.prototype.serversave = function (e, keyword) { + var name = keyword || prompt(_("serversaveprompt"), this._name); + if (!name) { + return; + } + this._name = name; + var xml = this.owner.toXML(); + var bp = this.owner.getOption("xhrpath"); + var url = bp + "backend/" + this.dom.backend.value + "/?action=save&keyword=" + encodeURIComponent(name); + var h = {"Content-type": "application/xml"}; + this.owner.window.showThrobber(); + this.owner.setTitle(name); + OZ.Request(url, this.saveresponse, {xml: true, method: "post", data: xml, headers: h}); } -SQL.IO.prototype.quicksave = function(e) { - this.serversave(e, this._name); -} +SQL.IO.prototype.quicksave = function (e) { + this.clientlocalsave(); +}; -SQL.IO.prototype.serverload = function(e, keyword) { - var name = keyword || prompt(_("serverloadprompt"), this._name); - if (!name) { return; } - this._name = name; - var bp = this.owner.getOption("xhrpath"); - var url = bp + "backend/"+this.dom.backend.value+"/?action=load&keyword="+encodeURIComponent(name); - this.owner.window.showThrobber(); - this.name = name; - OZ.Request(url, this.loadresponse, {xml:true}); -} +SQL.IO.prototype.quickload = function (e) { + this.clientlocalload(); +}; -SQL.IO.prototype.serverlist = function(e) { - var bp = this.owner.getOption("xhrpath"); - var url = bp + "backend/"+this.dom.backend.value+"/?action=list"; - this.owner.window.showThrobber(); - OZ.Request(url, this.listresponse); +SQL.IO.prototype.serverload = function (e, keyword) { + var name = keyword || prompt(_("serverloadprompt"), this._name); + if (!name) { + return; + } + this._name = name; + var bp = this.owner.getOption("xhrpath"); + var url = bp + "backend/" + this.dom.backend.value + "/?action=load&keyword=" + encodeURIComponent(name); + this.owner.window.showThrobber(); + this.name = name; + OZ.Request(url, this.loadresponse, {xml: true}); } -SQL.IO.prototype.serverimport = function(e) { - var name = prompt(_("serverimportprompt"), ""); - if (!name) { return; } - var bp = this.owner.getOption("xhrpath"); - var url = bp + "backend/"+this.dom.backend.value+"/?action=import&database="+name; - this.owner.window.showThrobber(); - OZ.Request(url, this.importresponse, {xml:true}); +SQL.IO.prototype.serverlist = function (e) { + var bp = this.owner.getOption("xhrpath"); + var url = bp + "backend/" + this.dom.backend.value + "/?action=list"; + this.owner.window.showThrobber(); + OZ.Request(url, this.listresponse); } -SQL.IO.prototype.check = function(code) { - switch (code) { - case 201: - case 404: - case 500: - case 501: - case 503: - var lang = "http"+code; - this.dom.ta.value = _("httpresponse")+": "+_(lang); - return false; - break; - default: return true; - } +SQL.IO.prototype.serverimport = function (e) { + var name = prompt(_("serverimportprompt"), ""); + if (!name) { + return; + } + var bp = this.owner.getOption("xhrpath"); + var url = bp + "backend/" + this.dom.backend.value + "/?action=import&database=" + name; + this.owner.window.showThrobber(); + OZ.Request(url, this.importresponse, {xml: true}); } -SQL.IO.prototype.saveresponse = function(data, code) { - this.owner.window.hideThrobber(); - this.check(code); +SQL.IO.prototype.check = function (code) { + switch (code) { + case 201: + case 404: + case 500: + case 501: + case 503: + var lang = "http" + code; + this.dom.ta.value = _("httpresponse") + ": " + _(lang); + return false; + break; + default: + return true; + } } -SQL.IO.prototype.loadresponse = function(data, code) { - this.owner.window.hideThrobber(); - if (!this.check(code)) { return; } - this.fromXML(data); - this.owner.setTitle(this.name); +SQL.IO.prototype.saveresponse = function (data, code) { + this.owner.window.hideThrobber(); + this.check(code); } -SQL.IO.prototype.listresponse = function(data, code) { - this.owner.window.hideThrobber(); - if (!this.check(code)) { return; } - this.dom.ta.value = data; +SQL.IO.prototype.loadresponse = function (data, code) { + this.owner.window.hideThrobber(); + if (!this.check(code)) { + return; + } + this.fromXML(data); + this.owner.setTitle(this.name); } -SQL.IO.prototype.importresponse = function(data, code) { - this.owner.window.hideThrobber(); - if (!this.check(code)) { return; } - if (this.fromXML(data)) { - this.owner.alignTables(); - } +SQL.IO.prototype.listresponse = function (data, code) { + this.owner.window.hideThrobber(); + if (!this.check(code)) { + return; + } + this.dom.ta.value = data; } -SQL.IO.prototype.press = function(e) { - switch (e.keyCode) { - case 113: - if (OZ.opera) { - e.preventDefault(); - } - this.quicksave(e); - break; - } +SQL.IO.prototype.importresponse = function (data, code) { + this.owner.window.hideThrobber(); + if (!this.check(code)) { + return; + } + if (this.fromXML(data)) { + this.owner.alignTables(); + } } + +SQL.IO.prototype.press = function (e) { + switch (e.keyCode) { + case 113: + if (OZ.opera) { + e.preventDefault(); + } + this.quicksave(e); + break; + case 115: + if (OZ.opera) { + e.preventDefault(); + } + this.quickload(e); + break; + } +}; diff --git a/js/keymanager.js b/js/keymanager.js index 5e08e2a..ba3a2d6 100644 --- a/js/keymanager.js +++ b/js/keymanager.js @@ -1,202 +1,213 @@ /* ----------------- key manager ---------- */ -SQL.KeyManager = function(owner) { - this.owner = owner; - this.dom = { - container:OZ.$("keys") - } - this.build(); -} - -SQL.KeyManager.prototype.build = function() { - this.dom.list = OZ.$("keyslist"); - this.dom.type = OZ.$("keytype"); - this.dom.name = OZ.$("keyname"); - this.dom.left = OZ.$("keyleft"); - this.dom.right = OZ.$("keyright"); - this.dom.fields = OZ.$("keyfields"); - this.dom.avail = OZ.$("keyavail"); - this.dom.listlabel = OZ.$("keyslistlabel"); - - var ids = ["keyadd","keyremove"]; - for (var i=0;i=0;i--) { - var k = this.table.keys[i]; - if (!k.rows.length) { this.table.removeKey(k); } - } -} - -SQL.KeyManager.prototype.sync = function(table) { /* sync content with given table */ - this.table = table; - this.dom.listlabel.innerHTML = _("keyslistlabel").replace(/%s/,table.getTitle()); - - OZ.DOM.clear(this.dom.list); - for (var i=0;i= 0; i--) { + var k = this.table.keys[i]; + if (!k.rows.length) { + this.table.removeKey(k); + } + } +} + +SQL.KeyManager.prototype.sync = function (table) { /* sync content with given table */ + this.table = table; + this.dom.listlabel.innerHTML = _("keyslistlabel").replace(/%s/, table.getTitle()); + + OZ.DOM.clear(this.dom.list); + for (var i = 0; i < table.keys.length; i++) { + var k = table.keys[i]; + var o = OZ.DOM.elm("option"); + this.dom.list.appendChild(o); + var str = (i + 1) + ": " + k.getLabel(); + o.innerHTML = str; + } + if (table.keys.length) { + this.switchTo(0); + } else { + this.disable(); + } +} + +SQL.KeyManager.prototype.redrawListItem = function () { + var index = this.table.keys.indexOf(this.key); + this.option.innerHTML = (index + 1) + ": " + this.key.getLabel(); +} + +SQL.KeyManager.prototype.switchTo = function (index) { /* show Nth key */ + this.enable(); + var k = this.table.keys[index]; + this.key = k; + this.option = this.dom.list.getElementsByTagName("option")[index]; + + this.dom.list.selectedIndex = index; + this.dom.name.value = k.getName(); + + var opts = this.dom.type.getElementsByTagName("option"); + for (var i = 0; i < opts.length; i++) { + if (opts[i].value == k.getType()) { + this.dom.type.selectedIndex = i; + } + } + + OZ.DOM.clear(this.dom.fields); + for (var i = 0; i < k.rows.length; i++) { + var o = OZ.DOM.elm("option"); + o.innerHTML = k.rows[i].getTitle(); + o.value = o.innerHTML; + this.dom.fields.appendChild(o); + } + + OZ.DOM.clear(this.dom.avail); + for (var i = 0; i < this.table.rows.length; i++) { + var r = this.table.rows[i]; + if (k.rows.indexOf(r) != -1) { + continue; + } + var o = OZ.DOM.elm("option"); + o.innerHTML = r.getTitle(); + o.value = o.innerHTML; + this.dom.avail.appendChild(o); + } +} + +SQL.KeyManager.prototype.disable = function () { + OZ.DOM.clear(this.dom.fields); + OZ.DOM.clear(this.dom.avail); + this.dom.keyremove.disabled = true; + this.dom.left.disabled = true; + this.dom.right.disabled = true; + this.dom.list.disabled = true; + this.dom.name.disabled = true; + this.dom.type.disabled = true; + this.dom.fields.disabled = true; + this.dom.avail.disabled = true; +} + +SQL.KeyManager.prototype.enable = function () { + this.dom.keyremove.disabled = false; + this.dom.left.disabled = false; + this.dom.right.disabled = false; + this.dom.list.disabled = false; + this.dom.name.disabled = false; + this.dom.type.disabled = false; + this.dom.fields.disabled = false; + this.dom.avail.disabled = false; +} + +SQL.KeyManager.prototype.left = function (e) { /* add field to index */ + var opts = this.dom.avail.getElementsByTagName("option"); + for (var i = 0; i < opts.length; i++) { + var o = opts[i]; + if (o.selected) { + var row = this.table.findNamedRow(o.value); + this.key.addRow(row); + } + } + this.switchTo(this.dom.list.selectedIndex); +} + +SQL.KeyManager.prototype.right = function (e) { /* remove field from index */ + var opts = this.dom.fields.getElementsByTagName("option"); + for (var i = 0; i < opts.length; i++) { + var o = opts[i]; + if (o.selected) { + var row = this.table.findNamedRow(o.value); + this.key.removeRow(row); + } + } + this.switchTo(this.dom.list.selectedIndex); +} + +SQL.KeyManager.prototype.open = function (table) { + this.sync(table); + this.owner.window.open(_("tablekeys"), this.dom.container, this.purge); } diff --git a/js/map.js b/js/map.js index c280d34..09624eb 100644 --- a/js/map.js +++ b/js/map.js @@ -3,34 +3,52 @@ SQL.Map = function(owner) { this.owner = owner; SQL.Visual.apply(this); - this.dom.container = OZ.$("minimap"); - this.width = this.dom.container.offsetWidth - 2; - this.height = this.dom.container.offsetHeight - 2; - + this.dom.container = OZ.$("minimapcontainer"); + this.dom.minimap = OZ.$("minimap"); + this.dom.zoomlevel = OZ.$("zoomlevel"); + this.dom.buttons = OZ.$('minimapbuttons'); + this.dom.zoomin = OZ.$("zoomin"); + this.dom.zoomout = OZ.$("zoomout"); + + this.width = this.dom.minimap.offsetWidth - 2; + this.height = this.dom.minimap.offsetHeight - 2; + this.dom.port = OZ.DOM.elm("div",{className:"port", zIndex:1}); - this.dom.container.appendChild(this.dom.port); + this.dom.minimap.appendChild(this.dom.port); this.sync = this.sync.bind(this); - + this.zScale = 1; + this.flag = false; this.sync(); - + OZ.Event.add(window, "resize", this.sync); OZ.Event.add(window, "scroll", this.sync); - OZ.Event.add(this.dom.container, "mousedown", this.down.bind(this)); - OZ.Event.add(this.dom.container, "touchstart", this.down.bind(this)); - OZ.Event.add(this.dom.container, "touchmove", OZ.Event.prevent); + OZ.Event.add(this.dom.container, "mouseenter", this.onEnter.bind(this)); + OZ.Event.add(this.dom.container, "mouseleave", this.onLeave.bind(this)); + OZ.Event.add(this.dom.minimap, "mousedown", this.down.bind(this)); + // OZ.Event.add(this.dom.minimap, "touchstart", this.down.bind(this)); + // OZ.Event.add(this.dom.minimap, "touchmove", OZ.Event.prevent); + OZ.Event.add(this.dom.zoomin, "click", this.zoom.bind(this, .05)); + OZ.Event.add(this.dom.zoomout, "click", this.zoom.bind(this, -.05)); + OZ.Event.add(document, "keydown", this.press.bind(this)); + } SQL.Map.prototype = Object.create(SQL.Visual.prototype); +SQL.Map.prototype.appendChild = function (elm) { + if (elm instanceof Element) + this.dom.minimap.appendChild(elm); +}; + SQL.Map.prototype.down = function(e) { /* mousedown - move view and start drag */ this.flag = true; - this.dom.container.style.cursor = "move"; - var pos = OZ.DOM.pos(this.dom.container); + this.dom.minimap.style.cursor = "move"; + var pos = OZ.DOM.pos(this.dom.minimap); this.x = Math.round(pos[0] + this.l + this.w/2); this.y = Math.round(pos[1] + this.t + this.h/2); this.move(e); - + if (e.type == "touchstart") { var eventMove = "touchmove"; var eventUp = "touchend"; @@ -46,47 +64,41 @@ SQL.Map.prototype.down = function(e) { /* mousedown - move view and start drag * SQL.Map.prototype.move = function(e) { /* mousemove */ if (!this.flag) { return; } OZ.Event.prevent(e); - + if (e.type.match(/touch/)) { if (e.touches.length > 1) { return; } var event = e.touches[0]; } else { var event = e; } - + var dx = event.clientX - this.x; var dy = event.clientY - this.y; if (this.l + dx < 0) { dx = -this.l; } if (this.t + dy < 0) { dy = -this.t; } if (this.l + this.w + 4 + dx > this.width) { dx = this.width - 4 - this.l - this.w; } if (this.t + this.h + 4 + dy > this.height) { dy = this.height - 4 - this.t - this.h; } - - + + this.x += dx; this.y += dy; - + this.l += dx; this.t += dy; - + var coefX = this.width / this.owner.width; var coefY = this.height / this.owner.height; var left = this.l / coefX; var top = this.t / coefY; - - if (OZ.webkit) { - document.body.scrollLeft = Math.round(left); - document.body.scrollTop = Math.round(top); - } else { + document.documentElement.scrollLeft = Math.round(left); document.documentElement.scrollTop = Math.round(top); - } - this.redraw(); } SQL.Map.prototype.up = function(e) { /* mouseup */ this.flag = false; - this.dom.container.style.cursor = ""; + this.dom.minimap.style.cursor = ""; OZ.Event.remove(this.documentMove); OZ.Event.remove(this.documentUp); } @@ -101,12 +113,12 @@ SQL.Map.prototype.sync = function() { /* when window changes, adjust map */ var h = dims[1] * scaleY - 4 - 0; var x = scroll[0] * scaleX; var y = scroll[1] * scaleY; - + this.w = Math.round(w); this.h = Math.round(h); this.l = Math.round(x); this.t = Math.round(y); - + this.redraw(); } @@ -116,3 +128,44 @@ SQL.Map.prototype.redraw = function() { this.dom.port.style.left = this.l+"px"; this.dom.port.style.top = this.t+"px"; } + +SQL.Map.prototype.zoom = function (level) { + this.zScale += level; + this.dom.zoomlevel.innerHTML = this.zScale === 1 ? '' : this.zScale.toFixed(2); + OZ.$('area').style.transform = "scale(" + this.zScale + "," + this.zScale +")"; +}; + +SQL.Map.prototype.press = function (e) { + var target = OZ.Event.target(e).nodeName.toLowerCase(); + + if (target === "textarea" || target === "input") { + return; + } /* not when in form field */ + + if (this.owner.rowManager.selected) { + return; + } /* do not process keypresses if a row is selected */ + + switch (e.keyCode) { + case 107: + //num plus + this.zoom(0.05); + break; + case 109: + //num minus + this.zoom(-0.05); + break; + } +}; + +SQL.Map.prototype.onEnter = function (e) { + this.dom.port.style.borderColor = "rgba(0,0,0,0.8)"; + this.dom.buttons.style.transform = "translateY(0)"; + this.dom.buttons.style.opacity = "1"; +}; + +SQL.Map.prototype.onLeave = function (e) { + this.dom.port.style.borderColor = "rgba(0,0,0,0.3)"; + this.dom.buttons.style.transform = "translateY(-40px)"; + this.dom.buttons.style.opacity = "0"; +}; \ No newline at end of file diff --git a/js/mui.min.js b/js/mui.min.js new file mode 100644 index 0000000..2f3efb3 --- /dev/null +++ b/js/mui.min.js @@ -0,0 +1 @@ +!function e(t,n,i){function o(s,l){if(!n[s]){if(!t[s]){var a="function"==typeof require&&require;if(!l&&a)return a(s,!0);if(r)return r(s,!0);throw new Error("Cannot find module '"+s+"'")}var c=n[s]={exports:{}};t[s][0].call(c.exports,function(e){var n=t[s][1][e];return o(n?n:e)},c,c.exports,e,t,n,i)}return n[s].exports}for(var r="function"==typeof require&&require,s=0;sd&&(m=l+(n+1)*s-(-1*i+o+r),h=t*s+2*l-p,v=Math.min(m,h)),{height:p+"px",top:i+"px",scrollTop:v}}var o=15,r=32,s=42,l=8;t.exports={getMenuPositionalCSS:i}},{}],4:[function(e,t,n){"use strict";function i(e,t){if(t&&e.setAttribute){for(var n,i=h(e),o=t.split(" "),r=0;r-1}function s(e){if(void 0===e)return"undefined";var t=Object.prototype.toString.call(e);if(0===t.indexOf("[object "))return t.slice(8,-1).toLowerCase();throw new Error("MUI: Could not understand type: "+t)}function l(e,t,n,i){i=void 0!==i&&i;var o=e._muiEventCache=e._muiEventCache||{};t.split(" ").map(function(t){e.addEventListener(t,n,i),o[t]=o[t]||[],o[t].push([n,i])})}function a(e,t,n,i){i=void 0!==i&&i;var o,r,s,l=e._muiEventCache=e._muiEventCache||{};t.split(" ").map(function(t){for(o=l[t]||[],s=o.length;s--;)r=o[s],(void 0===n||r[0]===n&&r[1]===i)&&(o.splice(s,1),e.removeEventListener(t,r[0],r[1]))})}function c(e,t,n,i){t.split(" ").map(function(t){l(e,t,function i(o){n&&n.apply(this,arguments),a(e,t,i)},i)})}function u(e,t){var n=window;if(void 0===t){if(e===n){var i=document.documentElement;return(n.pageXOffset||i.scrollLeft)-(i.clientLeft||0)}return e.scrollLeft}e===n?n.scrollTo(t,d(n)):e.scrollLeft=t}function d(e,t){var n=window;if(void 0===t){if(e===n){var i=document.documentElement;return(n.pageYOffset||i.scrollTop)-(i.clientTop||0)}return e.scrollTop}e===n?n.scrollTo(u(n),t):e.scrollTop=t}function f(e){var t=window,n=e.getBoundingClientRect(),i=d(t),o=u(t);return{top:n.top+i,left:n.left+o,height:n.height,width:n.width}}function p(e){var t=!1,n=!0,i=document,o=i.defaultView,r=i.documentElement,s=i.addEventListener?"addEventListener":"attachEvent",l=i.addEventListener?"removeEventListener":"detachEvent",a=i.addEventListener?"":"on",c=function(n){"readystatechange"==n.type&&"complete"!=i.readyState||(("load"==n.type?o:i)[l](a+n.type,c,!1),!t&&(t=!0)&&e.call(o,n.type||n))},u=function(){try{r.doScroll("left")}catch(e){return void setTimeout(u,50)}c("poll")};if("complete"==i.readyState)e.call(o,"lazy");else{if(i.createEventObject&&r.doScroll){try{n=!o.frameElement}catch(e){}n&&u()}i[s](a+"DOMContentLoaded",c,!1),i[s](a+"readystatechange",c,!1),o[s](a+"load",c,!1)}}function m(e,t){if(t&&e.setAttribute){for(var n,i=h(e),o=t.split(" "),r=0;r=0;)i=i.replace(" "+n+" "," ");e.setAttribute("class",i.trim())}}function h(e){var t=(e.getAttribute("class")||"").replace(/[\n\t]/g,"");return" "+t+" "}function v(e){return e.replace(y,function(e,t,n,i){return i?n.toUpperCase():n}).replace(g,"Moz$1")}function b(e,t,n){var i;return i=n.getPropertyValue(t),""!==i||e.ownerDocument||(i=e.style[v(t)]),i}var y=/([\:\-\_]+(.))/g,g=/^moz([A-Z])/;t.exports={addClass:i,css:o,hasClass:r,off:a,offset:f,on:l,one:c,ready:p,removeClass:m,type:s,scrollLeft:u,scrollTop:d}},{}],5:[function(e,t,n){"use strict";function i(){var e=window;if(b.debug&&"undefined"!=typeof e.console)try{e.console.log.apply(e.console,arguments)}catch(n){var t=Array.prototype.slice.call(arguments);e.console.log(t.join("\n"))}}function o(e){var t,n=document;t=n.head||n.getElementsByTagName("head")[0]||n.documentElement;var i=n.createElement("style");return i.type="text/css",i.styleSheet?i.styleSheet.cssText=e:i.appendChild(n.createTextNode(e)),t.insertBefore(i,t.firstChild),i}function r(e,t){if(!t)throw new Error("MUI: "+e);"undefined"!=typeof console&&console.error("MUI Warning: "+e)}function s(e){if(g.push(e),void 0===g._initialized){var t=document,n="animationstart mozAnimationStart webkitAnimationStart";y.on(t,n,l),g._initialized=!0}}function l(e){if("mui-node-inserted"===e.animationName)for(var t=e.target,n=g.length-1;n>=0;n--)g[n](t)}function a(e){var t="";for(var n in e)t+=e[n]?n+" ":"";return t.trim()}function c(){if(void 0!==v)return v;var e=document.createElement("x");return e.style.cssText="pointer-events:auto",v="auto"===e.style.pointerEvents}function u(e,t){return function(){e[t].apply(e,arguments)}}function d(e,t,n,i,o){var r,s=document.createEvent("HTMLEvents"),n=void 0===n||n,i=void 0===i||i;if(s.initEvent(t,n,i),o)for(r in o)s[r]=o[r];return e&&e.dispatchEvent(s),s}function f(){if(E+=1,1===E){var e=window,t=document;h={left:y.scrollLeft(e),top:y.scrollTop(e)},y.addClass(t.body,C),e.scrollTo(h.left,h.top)}}function p(e){if(0!==E&&(E-=1,0===E)){var t=window,n=document;y.removeClass(n.body,C),e&&t.scrollTo(h.left,h.top)}}function m(e){var t=window.requestAnimationFrame;t?t(e):setTimeout(e,0)}var h,v,b=e("../config"),y=e("./jqLite"),g=[],E=0,C="mui-body--scroll-lock";t.exports={callback:u,classNames:a,disableScrollLock:p,dispatchEvent:d,enableScrollLock:f,log:i,loadStyle:o,onNodeInserted:s,raiseError:r,requestAnimationFrame:m,supportsPointerEvents:c}},{"../config":2,"./jqLite":4}],6:[function(e,t,n){"use strict";function i(e){e._muiDropdown!==!0&&(e._muiDropdown=!0,e.hasAttribute("type")||(e.type="button"),s.on(e,"click",o))}function o(e){if(0===e.button){var t=this;null===t.getAttribute("disabled")&&r(t)}}function r(e){function t(){s.removeClass(o,u),s.off(r,"click",t)}function n(){var n=i.getBoundingClientRect(),l=e.getBoundingClientRect(),a=l.top-n.top+l.height;s.css(o,"top",a+"px"),s.addClass(o,u),setTimeout(function(){s.on(r,"click",t)},0)}var i=e.parentNode,o=e.nextElementSibling,r=i.ownerDocument;return o&&s.hasClass(o,d)?void(s.hasClass(o,u)?t():n()):l.raiseError("Dropdown menu element not found")}var s=e("./lib/jqLite"),l=e("./lib/util"),a="data-mui-toggle",c='[data-mui-toggle="dropdown"]',u="mui--is-open",d="mui-dropdown__menu";t.exports={initListeners:function(){for(var e=document,t=e.querySelectorAll(c),n=t.length-1;n>=0;n--)i(t[n]);l.onNodeInserted(function(e){"dropdown"===e.getAttribute(a)&&i(e)})}}},{"./lib/jqLite":4,"./lib/util":5}],7:[function(e,t,n){t.exports=e(4)},{}],8:[function(e,t,n){"use strict";function i(e){var t;if("on"===e){for(var n,i,s,l=arguments.length-1;l>0;l--)n=arguments[l],"object"===m.type(n)&&(i=n),n instanceof Element&&1===n.nodeType&&(s=n);i=i||{},void 0===i.keyboard&&(i.keyboard=!0),void 0===i.static&&(i.static=!1),t=o(i,s)}else"off"===e?t=r():p.raiseError("Expecting 'on' or 'off'");return t}function o(e,t){var n=document,i=n.body,o=n.getElementById(h);if(n.activeElement&&(f=n.activeElement),p.enableScrollLock(),o){for(;o.firstChild;)o.removeChild(o.firstChild);t&&o.appendChild(t)}else o=n.createElement("div"),o.setAttribute("id",h),o.setAttribute("tabindex","-1"),t&&o.appendChild(t),i.appendChild(o);return v.test(navigator.userAgent)&&m.css(o,"cursor","pointer"),e.keyboard?s():l(),e.static?u(o):c(o),o.muiOptions=e,o.focus(),o}function r(){var e,t=document.getElementById(h);if(t){for(;t.firstChild;)t.removeChild(t.firstChild);t.parentNode.removeChild(t),e=t.muiOptions.onclose,u(t)}return p.disableScrollLock(),l(),f&&f.focus(),e&&e(),t}function s(){m.on(document,"keyup",a)}function l(){m.off(document,"keyup",a)}function a(e){27===e.keyCode&&r()}function c(e){m.on(e,"click",d)}function u(e){m.off(e,"click",d)}function d(e){e.target.id===h&&r()}var f,p=e("./lib/util"),m=e("./lib/jqLite"),h="mui-overlay",v=/(iPad|iPhone|iPod)/g;t.exports=i},{"./lib/jqLite":4,"./lib/util":5}],9:[function(e,t,n){"use strict";function i(e){e._muiRipple!==!0&&(e._muiRipple=!0,"INPUT"!==e.tagName&&l.on(e,f,o))}function o(e){if("mousedown"!==e.type||0===e.button){var t=this;if(t.disabled!==!0){t.muiMouseUp||(l.on(t,p,r),t.muiMouseUp=!0);var n=s(e,t);t.appendChild(n),a.requestAnimationFrame(function(){l.addClass(n,"mui--animate-in mui--active")})}}}function r(e){for(var t,n=this.children,i=n.length,o=[];i--;)t=n[i],l.hasClass(t,u)&&(l.addClass(t,"mui--animate-out"),o.push(t));o.length&&setTimeout(function(){for(var e,t,n=o.length;n--;)e=o[n],t=e.parentNode,t&&t.removeChild(e)},m)}function s(e,t){var n,i,o,r=l.offset(t),s="touchstart"===e.type?e.touches[0]:e,a=s.pageX-r.left,c=s.pageY-r.top;return n=2*Math.sqrt(r.width*r.width+r.height*r.height),o=document.createElement("div"),o.className=u,i=n/2,l.css(o,{height:n+"px",width:n+"px",top:c-i+"px",left:a-i+"px"}),o}var l=e("./lib/jqLite"),a=e("./lib/util"),c="mui-btn",u="mui-ripple-effect",d="ontouchstart"in document.documentElement,f=d?"touchstart":"mousedown",p=d?"touchend":"mouseup mouseleave",m=600;t.exports={initListeners:function(){for(var e=document,t=e.getElementsByClassName(c),n=t.length-1;n>=0;n--)i(t[n]);a.onNodeInserted(function(e){l.hasClass(e,c)&&i(e)})}}},{"./lib/jqLite":4,"./lib/util":5}],10:[function(e,t,n){"use strict";function i(e){e._muiSelect!==!0&&(e._muiSelect=!0,"ontouchstart"in p.documentElement||new o(e))}function o(e){this.selectEl=e,this.wrapperEl=e.parentNode,this.useDefault=!1,s.on(e,"mousedown",l.callback(this,"mousedownHandler")),s.on(e,"focus",l.callback(this,"focusHandler")),s.on(e,"click",l.callback(this,"clickHandler")),this.wrapperEl.tabIndex=-1;var t=l.callback(this,"wrapperFocusHandler");s.on(this.wrapperEl,"focus",t)}function r(e,t){l.enableScrollLock(),this.indexMap={},this.origIndex=null,this.currentIndex=null,this.selectEl=t,this.menuEl=this._createMenuEl(e,t),this.clickCallbackFn=l.callback(this,"clickHandler"),this.keydownCallbackFn=l.callback(this,"keydownHandler"),this.destroyCallbackFn=l.callback(this,"destroy"),e.appendChild(this.menuEl),s.scrollTop(this.menuEl,this.menuEl._muiScrollTop),setTimeout(function(){"body"!==p.activeElement.nodeName.toLowerCase()&&p.activeElement.blur()},0),s.on(this.menuEl,"click",this.clickCallbackFn),s.on(p,"keydown",this.keydownCallbackFn),s.on(m,"resize",this.destroyCallbackFn);var n=this.destroyCallbackFn;setTimeout(function(){s.on(p,"click",n)},0)}var s=e("./lib/jqLite"),l=e("./lib/util"),a=e("./lib/forms"),c="mui-select",u=".mui-select > select",d="mui-select__menu",f="mui--is-selected",p=document,m=window;o.prototype.mousedownHandler=function(e){0===e.button&&this.useDefault!==!0&&e.preventDefault()},o.prototype.focusHandler=function(e){if(this.useDefault!==!0){var t=this.selectEl,n=this.wrapperEl,i=t.tabIndex,o=l.callback(this,"keydownHandler");s.on(p,"keydown",o),t.tabIndex=-1,s.one(n,"blur",function(){t.tabIndex=i,s.off(p,"keydown",o)}),n.focus()}},o.prototype.keydownHandler=function(e){var t=e.keyCode;32!==t&&38!==t&&40!==t||(e.preventDefault(),this.selectEl.disabled!==!0&&this.renderMenu())},o.prototype.wrapperFocusHandler=function(){if(this.selectEl.disabled)return this.wrapperEl.blur()},o.prototype.clickHandler=function(e){0===e.button&&this.renderMenu()},o.prototype.renderMenu=function(){return this.useDefault===!0?this.useDefault=!1:void new r(this.wrapperEl,this.selectEl)},r.prototype._createMenuEl=function(e,t){var n,i,o,r,l,c,u,m,h=p.createElement("div"),v=t.children,b=0,y=this.indexMap,g=0;for(h.className=d,l=0,c=v.length;l=0;t--)i(e[t]);l.onNodeInserted(function(e){"SELECT"===e.tagName&&s.hasClass(e.parentNode,c)&&i(e)})}}},{"./lib/forms":3,"./lib/jqLite":4,"./lib/util":5}],11:[function(e,t,n){"use strict";function i(e){e._muiTabs!==!0&&(e._muiTabs=!0,l.on(e,"click",o))}function o(e){if(0===e.button){var t=this;null===t.getAttribute("disabled")&&r(t)}}function r(e){var t,n,i,o,r,c,u,b,y,g=e.parentNode,E=e.getAttribute(d),C=document.getElementById(E);l.hasClass(g,f)||(C||a.raiseError('Tab pane "'+E+'" not found'),n=s(C),i=n.id,y="["+d+'="'+i+'"]',o=document.querySelectorAll(y)[0],t=o.parentNode,r={paneId:E,relatedPaneId:i},c={paneId:i,relatedPaneId:E},u=a.dispatchEvent(o,h,!0,!0,c),b=a.dispatchEvent(e,p,!0,!0,r),setTimeout(function(){u.defaultPrevented||b.defaultPrevented||(t&&l.removeClass(t,f),n&&l.removeClass(n,f),l.addClass(g,f),l.addClass(C,f),a.dispatchEvent(o,v,!0,!1,c),a.dispatchEvent(e,m,!0,!1,r))},0))}function s(e){for(var t,n=e.parentNode.children,i=n.length,o=null;i--&&!o;)t=n[i],t!==e&&l.hasClass(t,f)&&(o=t);return o}var l=e("./lib/jqLite"),a=e("./lib/util"),c="data-mui-toggle",u="["+c+'="tab"]',d="data-mui-controls",f="mui--is-active",p="mui.tabs.showstart",m="mui.tabs.showend",h="mui.tabs.hidestart",v="mui.tabs.hideend";t.exports={initListeners:function(){for(var e=document.querySelectorAll(u),t=e.length-1;t>=0;t--)i(e[t]);a.onNodeInserted(function(e){"tab"===e.getAttribute(c)&&i(e)})},api:{activate:function(e){var t="["+d+"="+e+"]",n=document.querySelectorAll(t);n.length||a.raiseError('Tab control for pane "'+e+'" not found'),r(n[0])}}}},{"./lib/jqLite":4,"./lib/util":5}],12:[function(e,t,n){"use strict";function i(e){e._muiTextfield!==!0&&(e._muiTextfield=!0,e.value.length?r.addClass(e,c):r.addClass(e,a),r.on(e,"input change",o),r.on(e,"focus",function(){r.addClass(this,u)}))}function o(){var e=this;e.value.length?(r.removeClass(e,a),r.addClass(e,c)):(r.removeClass(e,c),r.addClass(e,a)),r.addClass(e,u)}var r=e("./lib/jqLite"),s=e("./lib/util"),l=".mui-textfield > input, .mui-textfield > textarea",a="mui--is-empty",c="mui--is-not-empty",u="mui--is-dirty",d="mui-textfield--float-label";t.exports={initialize:i,initListeners:function(){for(var e=document,t=e.querySelectorAll(l),n=t.length-1;n>=0;n--)i(t[n]);s.onNodeInserted(function(e){"INPUT"!==e.tagName&&"TEXTAREA"!==e.tagName||i(e)}),setTimeout(function(){var e=".mui-textfield.mui-textfield--float-label > label {"+["-webkit-transition","-moz-transition","-o-transition","transition",""].join(":all .15s ease-out;")+"}";s.loadStyle(e)},150),s.supportsPointerEvents()===!1&&r.on(document,"click",function(e){var t=e.target;if("LABEL"===t.tagName&&r.hasClass(t.parentNode,d)){var n=t.previousElementSibling;n&&n.focus()}})}}},{"./lib/jqLite":4,"./lib/util":5}]},{},[1]); diff --git a/js/options.js b/js/options.js index 90854e5..2956fe2 100644 --- a/js/options.js +++ b/js/options.js @@ -1,76 +1,86 @@ /* --------------------- options ------------ */ -SQL.Options = function(owner) { - this.owner = owner; - this.dom = { - container:OZ.$("opts"), - btn:OZ.$("options") - } - this.dom.btn.value = _("options"); - this.save = this.save.bind(this); - this.build(); +SQL.Options = function (owner) { + this.owner = owner; + this.dom = { + container: OZ.$("opts"), + btn: OZ.$("options") + }; + this.dom.btn.innerHTML = _("options"); + this.save = this.save.bind(this); + this.build(); } -SQL.Options.prototype.build = function() { - this.dom.optionlocale = OZ.$("optionlocale"); - this.dom.optiondb = OZ.$("optiondb"); - this.dom.optionsnap = OZ.$("optionsnap"); - this.dom.optionpattern = OZ.$("optionpattern"); - this.dom.optionhide = OZ.$("optionhide"); - this.dom.optionvector = OZ.$("optionvector"); - this.dom.optionshowsize = OZ.$("optionshowsize"); - this.dom.optionshowtype = OZ.$("optionshowtype"); +SQL.Options.prototype.build = function () { + this.dom.optionlocale = OZ.$("optionlocale"); + this.dom.optiondb = OZ.$("optiondb"); + this.dom.optionpattern = OZ.$("optionpattern"); + this.dom.optionsnap = OZ.$("optionsnap"); + this.dom.optionselectstrategy = OZ.$("optionselectstrategy"); + this.dom.optionhide = OZ.$("optionhide"); + this.dom.optionvector = OZ.$("optionvector"); + this.dom.optionshowsize = OZ.$("optionshowsize"); + this.dom.optionshowtype = OZ.$("optionshowtype"); + this.dom.optionusematerialcolors = OZ.$("optionusematerialcolors"); - var ids = ["language","db","snap","pattern","hide","vector","showsize","showtype","optionsnapnotice","optionpatternnotice","optionsnotice"]; - for (var i=0;i\n'; - - var elm = this.getDataType(); - var t = elm.getAttribute("sql"); - if (this.data.size.length) { t += "("+this.data.size+")"; } - xml += ""+t+"\n"; - - if (this.data.def || this.data.def === null) { - var q = elm.getAttribute("quote"); - var d = this.data.def; - if (d === null) { - d = "NULL"; - } else if (d != "CURRENT_TIMESTAMP") { - d = q+d+q; - } - xml += ""+SQL.escape(d)+""; - } - - for (var i=0;i\n'; - } - - if (this.data.comment) { - xml += ""+SQL.escape(this.data.comment)+"\n"; - } - - xml += "\n"; - return xml; +SQL.Row.prototype.toXML = function () { + var xml = ""; + + var t = this.getTitle().replace(/"/g, """); + var nn = (this.data.nll ? "1" : "0"); + var ai = (this.data.ai ? "1" : "0"); + xml += '\n'; + + var elm = this.getDataType(); + var t = elm.getAttribute("sql"); + if (this.data.size.length) { + t += "(" + this.data.size + ")"; + } + xml += "" + t + "\n"; + + if (this.data.def || this.data.def === null) { + var q = elm.getAttribute("quote"); + var d = this.data.def; + if (d === null) { + d = "NULL"; + } else if (d != "CURRENT_TIMESTAMP") { + d = q + d + q; + } + xml += "" + SQL.escape(d) + ""; + } + + for (var i = 0; i < this.relations.length; i++) { + var r = this.relations[i]; + if (r.row2 != this) { + continue; + } + xml += '\n'; + } + + if (this.data.comment) { + xml += "" + SQL.escape(this.data.comment) + "\n"; + } + + xml += "\n"; + return xml; } -SQL.Row.prototype.fromXML = function(node) { - var name = node.getAttribute("name"); - - var obj = { type:0, size:"" }; - obj.nll = (node.getAttribute("null") == "1"); - obj.ai = (node.getAttribute("autoincrement") == "1"); - - var cs = node.getElementsByTagName("comment"); - if (cs.length && cs[0].firstChild) { obj.comment = cs[0].firstChild.nodeValue; } - - var d = node.getElementsByTagName("datatype"); - if (d.length && d[0].firstChild) { - var s = d[0].firstChild.nodeValue; - var r = s.match(/^([^\(]+)(\((.*)\))?.*$/); - var type = r[1]; - if (r[3]) { obj.size = r[3]; } - var types = window.DATATYPES.getElementsByTagName("type"); - for (var i=0;i 0; +SQL.Row.prototype.isKey = function () { + return this.keys.length > 0; } -SQL.Row.prototype.enter = function(e) { - if (e.keyCode == 13) { - this.collapse(); - } +SQL.Row.prototype.enter = function (e) { + if (e.keyCode == 13) { + this.collapse(); + } } diff --git a/js/rowmanager.js b/js/rowmanager.js index baa643d..6fc4ca8 100644 --- a/js/rowmanager.js +++ b/js/rowmanager.js @@ -1,188 +1,287 @@ /* --------------------- row manager ------------ */ -SQL.RowManager = function(owner) { - this.owner = owner; - this.dom = {}; - this.selected = null; - this.creating = false; - this.connecting = false; - - var ids = ["editrow","removerow","uprow","downrow","foreigncreate","foreignconnect","foreigndisconnect"]; - for (var i=0;i=0;i--) { - var r = rels[i]; - if (r.row2 == this.selected) { this.owner.removeRelation(r); } - } - this.redraw(); -} + this.selected = row; + if (this.selected) { + this.selected.select(); + } + this.redraw(); +}; -SQL.RowManager.prototype.endCreate = function() { - this.creating = false; - this.dom.foreigncreate.value = _("foreigncreate"); -} +SQL.RowManager.prototype.tableClick = function (e) { /* create relation after clicking target table */ + if (!this.creating) { + return; + } -SQL.RowManager.prototype.endConnect = function() { - this.connecting = false; - this.dom.foreignconnect.value = _("foreignconnect"); -} + var r1 = this.selected; + var t2 = e.target; -SQL.RowManager.prototype.up = function(e) { - this.selected.up(); - this.redraw(); -} + var p = this.owner.getOption("pattern"); + p = p.replace(/%T/g, r1.owner.getTitle()); + p = p.replace(/%t/g, t2.getTitle()); + p = p.replace(/%R/g, r1.getTitle()); -SQL.RowManager.prototype.down = function(e) { - this.selected.down(); - this.redraw(); + var r2 = t2.addRow(p, r1.data); + r2.update({"type": SQL.Designer.getFKTypeFor(r1.data.type)}); + r2.update({"ai": false}); + this.owner.addRelation(r1, r2); } -SQL.RowManager.prototype.remove = function(e) { - var result = confirm(_("confirmrow")+" '"+this.selected.getTitle()+"' ?"); - if (!result) { return; } - var t = this.selected.owner; - this.selected.owner.removeRow(this.selected); - - var next = false; - if (t.rows) { next = t.rows[t.rows.length-1]; } - this.select(next); -} +SQL.RowManager.prototype.rowClick = function (e) { /* draw relation after clicking target row */ + if (!this.connecting) { + return; + } -SQL.RowManager.prototype.redraw = function() { - this.endCreate(); - this.endConnect(); - if (this.selected) { - var table = this.selected.owner; - var rows = table.rows; - this.dom.uprow.disabled = (rows[0] == this.selected); - this.dom.downrow.disabled = (rows[rows.length-1] == this.selected); - this.dom.removerow.disabled = false; - this.dom.editrow.disabled = false; - this.dom.foreigncreate.disabled = !(this.selected.isUnique()); - this.dom.foreignconnect.disabled = !(this.selected.isUnique()); - - this.dom.foreigndisconnect.disabled = true; - var rels = this.selected.relations; - for (var i=0;i= 0; i--) { + var r = rels[i]; + if (r.row2 == this.selected) { + this.owner.removeRelation(r); + } + } + this.redraw(); } + +SQL.RowManager.prototype.endCreate = function () { + this.creating = false; + this.owner.snackbar.hide(); + this.dom.foreigncreate.title = _("foreigncreate"); + this.dom.foreigncreate.innerHTML = 'play_circle_outline'; +}; + +SQL.RowManager.prototype.endConnect = function () { + this.connecting = false; + this.owner.snackbar.hide(); + this.dom.foreignconnect.title = _("foreignconnect"); + this.dom.foreignconnect.innerHTML = 'compare_arrows'; +}; + +SQL.RowManager.prototype.up = function (e) { + this.selected.up(); + this.redraw(); +}; + +SQL.RowManager.prototype.down = function (e) { + this.selected.down(); + this.redraw(); +}; + +SQL.RowManager.prototype.next = function (e) { + var t = this.selected.owner; + var next = false; + if (t.rows) { + next = t.rows[this.selected.index + 1 <= t.rows.length - 1 ? this.selected.index + 1 : 0]; + } + this.select(next); +}; + +SQL.RowManager.prototype.prev = function (e) { + var t = this.selected.owner; + var prev = false; + if (t.rows) { + prev = t.rows[this.selected.index - 1 >= 0 ? this.selected.index - 1 : t.rows.length - 1]; + } + this.select(prev); +}; + +SQL.RowManager.prototype.remove = function (e) { + var result = confirm(_("confirmrow") + " '" + this.selected.getTitle() + "' ?"); + if (!result) { + return; + } + var t = this.selected.owner; + this.selected.owner.removeRow(this.selected); + + var next = false; + if (t.rows) { + next = t.rows[t.rows.length - 1]; + } + this.select(next); +}; + +SQL.RowManager.prototype.redraw = function () { + this.endCreate(); + this.endConnect(); + if (this.selected) { + var table = this.selected.owner; + var rows = table.rows; + this.dom.uprow.disabled = (rows[0] == this.selected); + this.dom.downrow.disabled = (rows[rows.length - 1] == this.selected); + this.dom.removerow.disabled = false; + this.dom.editrow.disabled = false; + this.dom.foreigncreate.disabled = !(this.selected.isUnique()); + this.dom.foreignconnect.disabled = !(this.selected.isUnique()); + + this.dom.foreigndisconnect.disabled = true; + var rels = this.selected.relations; + for (var i = 0; i < rels.length; i++) { + var r = rels[i]; + if (r.row2 == this.selected) { + this.dom.foreigndisconnect.disabled = false; + } + } + + } else { + this.dom.uprow.disabled = true; + this.dom.downrow.disabled = true; + this.dom.removerow.disabled = true; + this.dom.editrow.disabled = true; + this.dom.foreigncreate.disabled = true; + this.dom.foreignconnect.disabled = true; + this.dom.foreigndisconnect.disabled = true; + } +}; + +SQL.RowManager.prototype.press = function (e) { + if (!this.selected) { + return; + } + + var target = OZ.Event.target(e).nodeName.toLowerCase(); + if (target == "textarea" || target == "input") { + return; + } /* not when in form field */ + + switch (e.keyCode) { + case 38: + // up + if (e.ctrlKey) + this.up(); + else + this.prev(); + OZ.Event.prevent(e); + break; + case 40: + // down + if (e.ctrlKey) + this.down(); + else + this.next(); + OZ.Event.prevent(e); + break; + case 46: + // delete + this.remove(); + OZ.Event.prevent(e); + break; + case 13: + // intro + this.selected.collapse(); + break; + case 27: + // esc + if (this.connecting) { + this.endConnect(); + } else if (this.creating) { + this.endCreate(); + } else { + this.selected.collapse(); + } + break; + case 69: + // e + this.selected.expand(); + OZ.Event.prevent(e); + break; + case 88: + // x + if (!this.dom.foreigncreate.disabled) + this.foreigncreate(e); + break; + case 67: + //c + if (!this.dom.foreignconnect.disabled) + this.foreignconnect(e); + break; + } +}; + +SQL.RowManager.prototype.edit = function (e) { + if (this.editing) { + this.selected.collapse(); + } else { + this.selected.expand(); + this.setEditing(!this.editing); + } +}; + +SQL.RowManager.prototype.setEditing = function (editing) { + this.editing = editing; + this.dom.editrow.innerHTML = this.editing ? + 'done' : + 'edit'; +}; diff --git a/js/rubberband.js b/js/rubberband.js index 9a08771..e0e8719 100644 --- a/js/rubberband.js +++ b/js/rubberband.js @@ -1,48 +1,60 @@ /* --------------------- rubberband -------------------- */ -SQL.Rubberband = function(owner) { - this.owner = owner; - SQL.Visual.apply(this); - this.dom.container = OZ.$("rubberband"); - OZ.Event.add("area", "mousedown", this.down.bind(this)); -} +/* global SQL, OZ */ + +SQL.Rubberband = function (owner) { + this.owner = owner; + SQL.Visual.apply(this); + this.dom.container = OZ.$("rubberband"); + this.areaPadding = 1; + OZ.Event.add("area", "mousedown", this.down.bind(this)); +}; SQL.Rubberband.prototype = Object.create(SQL.Visual.prototype); -SQL.Rubberband.prototype.down = function(e) { - OZ.Event.prevent(e); - var scroll = OZ.DOM.scroll(); - this.x = this.x0 = e.clientX + scroll[0]; - this.y = this.y0 = e.clientY + scroll[1]; - this.width = 0; - this.height = 0; - this.redraw(); - this.documentMove = OZ.Event.add(document, "mousemove", this.move.bind(this)); - this.documentUp = OZ.Event.add(document, "mouseup", this.up.bind(this)); -} +SQL.Rubberband.prototype.down = function (e) { + OZ.Event.prevent(e); + var scroll = OZ.DOM.scroll(); + this.x = this.x0 = e.clientX + scroll[0]; + this.y = this.y0 = e.clientY + scroll[1]; + this.width = 0; + this.height = 0; + this.redraw(); + this.documentMove = OZ.Event.add(document, "mousemove", this.move.bind(this)); + this.documentUp = OZ.Event.add(document, "mouseup", this.up.bind(this)); +}; -SQL.Rubberband.prototype.move = function(e) { - var scroll = OZ.DOM.scroll(); - var x = e.clientX + scroll[0]; - var y = e.clientY + scroll[1]; - this.width = Math.abs(x-this.x0); - this.height = Math.abs(y-this.y0); - if (x\n'; - for (var i=0;i\n"; - } - xml += "\n"; - return xml; +SQL.Table.prototype.toXML = function () { + var t = this.getTitle().replace(/"/g, """); + var xml = ""; + xml += '\n'; + for (var i = 0; i < this.rows.length; i++) { + xml += this.rows[i].toXML(); + } + for (var i = 0; i < this.keys.length; i++) { + xml += this.keys[i].toXML(); + } + var c = this.getComment(); + if (c) { + xml += "" + SQL.escape(c) + "\n"; + } + xml += "
\n"; + return xml; } -SQL.Table.prototype.fromXML = function(node) { - var name = node.getAttribute("name"); - this.setTitle(name); - var x = parseInt(node.getAttribute("x")) || 0; - var y = parseInt(node.getAttribute("y")) || 0; - this.moveTo(x, y); - var rows = node.getElementsByTagName("row"); - for (var i=0;i 1) { return; } - var event = e.touches[0]; - } else { - var event = e; - } - - for (var i=0;i 1) { + return; + } + var event = e.touches[0]; + } else { + var event = e; + } + + for (var i = 0; i < t.active.length; i++) { + var x = t.x[i] + event.clientX; + var y = t.y[i] + event.clientY; + x = Math.max(x, 0); + y = Math.max(y, 0); + t.active[i].moveTo(x, y); + } } -SQL.Table.prototype.up = function(e) { - var t = SQL.Table; - var d = SQL.Designer; - if (d.getOption("hide")) { - for (var i=0;i 1) { this.dom.removetable.value = _("removetables"); } - } else { - this.dom.removetable.disabled = true; - this.dom.removetable.value = _("removetable"); - } - for (var i=0;i=x && tx=x && tx1x1)) && - ((ty>=y && ty=y && ty1y1))) - { this.selection.push(t); } - } - this.processSelection(); -} -SQL.TableManager.prototype.click = function(e) { /* finish adding new table */ - var newtable = false; - if (this.adding) { - this.adding = false; - OZ.DOM.removeClass("area","adding"); - this.dom.addtable.value = this.oldvalue; - var scroll = OZ.DOM.scroll(); - var x = e.clientX + scroll[0]; - var y = e.clientY + scroll[1]; - newtable = this.owner.addTable(_("newtable"),x,y); - var r = newtable.addRow("id",{ai:true}); - var k = newtable.addKey("PRIMARY",""); - k.addRow(r); - } - this.select(newtable); - this.owner.rowManager.select(false); - if (this.selection.length == 1) { this.edit(e); } -} + this.select(false); -SQL.TableManager.prototype.preAdd = function(e) { /* click add new table */ - if (this.adding) { - this.adding = false; - OZ.DOM.removeClass("area","adding"); - this.dom.addtable.value = this.oldvalue; - } else { - this.adding = true; - OZ.DOM.addClass("area","adding"); - this.oldvalue = this.dom.addtable.value; - this.dom.addtable.value = "["+_("addpending")+"]"; - } -} + this.save = this.save.bind(this); -SQL.TableManager.prototype.clear = function(e) { /* remove all tables */ - if (!this.owner.tables.length) { return; } - var result = confirm(_("confirmall")+" ?"); - if (!result) { return; } - this.owner.clearTables(); -} + OZ.Event.add("area", "click", this.click.bind(this)); + OZ.Event.add(this.dom.addtable, "click", this.preAdd.bind(this)); + OZ.Event.add(this.dom.removetable, "click", this.remove.bind(this)); + OZ.Event.add(this.dom.cleartables, "click", this.clear.bind(this)); + OZ.Event.add(this.dom.addrow, "click", this.addRow.bind(this)); + OZ.Event.add(this.dom.aligntables, "click", this.owner.alignTables.bind(this.owner)); + OZ.Event.add(this.dom.edittable, "click", this.edit.bind(this)); + OZ.Event.add(this.dom.tablekeys, "click", this.keys.bind(this)); + OZ.Event.add(document, "keydown", this.press.bind(this)); -SQL.TableManager.prototype.remove = function(e) { - var titles = this.selection.slice(0); - for (var i=0;i 1) { + this.dom.removetable.dataset.i18n = "removetables"; + } + } else { + this.dom.removetable.disabled = true; + this.dom.removetable.dataset.i18n = "removetable"; + } + for (var i = 0; i < this.selection.length; i++) { + var t = this.selection[i]; + t.owner.raise(t); + t.select(); + } +}; + +SQL.TableManager.prototype.selectRect = function (x, y, width, height) { /* select all tables intersecting a rectangle */ + this.selection = []; + var tables = this.owner.tables; + var x1 = x + width; + var y1 = y + height; + for (var i = 0; i < tables.length; i++) { + var t = tables[i]; + var tx = t.x; + var tx1 = t.x + t.width; + var ty = t.y; + var ty1 = t.y + t.height; + if (this.selectedByStrategy(x, x1, y, y1, tx, tx1, ty, ty1)) + { + this.selection.push(t); + } + } + this.processSelection(); +}; -SQL.TableManager.prototype.keys = function(e) { /* open keys dialog */ - this.owner.keyManager.open(this.selection[0]); +SQL.TableManager.prototype.selectedByStrategy = function(x, x1, y, y1, tx, tx1, ty, ty1) { + if (this.owner.getOption("selectstrategy") === "lazy") + return (((tx >= x && tx < x1) || (tx1 >= x && tx1 < x1) || (tx < x && tx1 > x1)) && + ((ty >= y && ty < y1) || (ty1 >= y && ty1 < y1) || (ty < y && ty1 > y1))); + else + return ((tx >= x && tx < x1) && (tx1 >= x && tx1 < x1)) && + ((ty >= y && ty < y1) && (ty1 >= y && ty1 < y1)); +}; + +SQL.TableManager.prototype.selectAll = function () { + this.selection = this.owner.tables; + this.processSelection(); +}; + +SQL.TableManager.prototype.click = function (e) { /* finish adding new table */ + var newtable = false; + if (this.adding) { + this.adding = false; + OZ.DOM.removeClass("area", "adding"); + this.dom.addtable.innerHTML = (this.oldvalue); + var scroll = OZ.DOM.scroll(); + var x = e.clientX + scroll[0]; + var y = e.clientY + scroll[1]; + newtable = this.owner.addTable(_("newtable"), x, y); + var r = newtable.addRow("id", {ai: true}); + var k = newtable.addKey("PRIMARY", ""); + k.addRow(r); + } + this.select(newtable); + this.owner.rowManager.select(false); + if (this.selection.length === 1) { + this.edit(e); + } +}; + +SQL.TableManager.prototype.preAdd = function (e) { /* click add new table */ + if (this.adding) { + this.adding = false; + OZ.DOM.removeClass("area", "adding"); + this.dom.addtable.innerHTML = (this.oldvalue); + this.owner.snackbar.hide(); + } else { + this.adding = true; + OZ.DOM.addClass("area", "adding"); + this.oldvalue = this.dom.addtable.innerHTML; + this.dom.addtable.innerHTML = 'clear'; + this.owner.snackbar.show(_('addpending')); + } +}; + +SQL.TableManager.prototype.clear = function (e) { /* remove all tables */ + if (!this.owner.tables.length) { + return; + } + var result = confirm(_("confirmall") + " ?"); + if (!result) { + return; + } + this.owner.clearTables(); +}; + +SQL.TableManager.prototype.remove = function (e) { + var titles = this.selection.slice(0); + for (var i = 0; i < titles.length; i++) { + titles[i] = "'" + titles[i].getTitle() + "'"; + } + var result = confirm(_("confirmtable") + " " + titles.join(", ") + "?"); + if (!result) { + return; + } + var sel = this.selection.slice(0); + for (var i = 0; i < sel.length; i++) { + this.owner.removeTable(sel[i]); + } +}; + +SQL.TableManager.prototype.edit = function (e) { + this.owner.window.open(_("edittable"), this.dom.container, this.save); + + var title = this.selection[0].getTitle(); + this.dom.name.value = title; + try { /* throws in ie6 */ + this.dom.comment.value = this.selection[0].getComment(); + } catch (e) { + } + + /* pre-select table name */ + this.dom.name.focus(); + if (OZ.ie) { + try { /* throws in ie6 */ + this.dom.name.select(); + } catch (e) { + } + } else { + this.dom.name.setSelectionRange(0, title.length); + } +}; + +SQL.TableManager.prototype.keys = function (e) { /* open keys dialog */ + this.owner.keyManager.open(this.selection[0]); } -SQL.TableManager.prototype.save = function() { - this.selection[0].setTitle(this.dom.name.value); - this.selection[0].setComment(this.dom.comment.value); +SQL.TableManager.prototype.save = function () { + this.selection[0].setTitle(this.dom.name.value); + this.selection[0].setComment(this.dom.comment.value); } -SQL.TableManager.prototype.press = function(e) { - var target = OZ.Event.target(e).nodeName.toLowerCase(); - if (target == "textarea" || target == "input") { return; } /* not when in form field */ - - if (this.owner.rowManager.selected) { return; } /* do not process keypresses if a row is selected */ +SQL.TableManager.prototype.press = function (e) { + if (e.ctrlKey && e.keyCode === 65) { + // ctrl + a + if (this.owner.window.state) + return; - if (!this.selection.length) { return; } /* nothing if selection is active */ + this.selectAll(); + } else if (this.adding && e.keyCode === 27) { + this.preAdd(e); + } else { + var target = OZ.Event.target(e).nodeName.toLowerCase(); + if (target == "textarea" || target == "input") { + return; + } /* not when in form field */ - switch (e.keyCode) { - case 46: - this.remove(); - OZ.Event.prevent(e); - break; - } -} + if (e.keyCode === 70) { + // f + if (e.ctrlKey) + return; + this.addRow(); + OZ.Event.prevent(e); + return; + } + + if (this.owner.rowManager.selected) { + return; + } /* do not process keypresses if a row is selected */ + + switch (e.keyCode) { + case 65: + // a + this.preAdd(e); + break; + case 46: + // delete + if (this.selection.length) { + this.remove(); + OZ.Event.prevent(e); + } + break; + case 69: + // e + if (e.ctrlKey) + return; + if (this.selection.length) { + this.edit(e); + OZ.Event.prevent(e); + } + break; + } + } +}; diff --git a/js/toggle.js b/js/toggle.js index 6b1ec05..e7ad1b7 100644 --- a/js/toggle.js +++ b/js/toggle.js @@ -1,26 +1,72 @@ /* ------------------ minimize/restore bar ----------- */ +/* global SQL, OZ */ -SQL.Toggle = function(elm) { - this._state = null; - this._elm = elm; - OZ.Event.add(elm, "click", this._click.bind(this)); - - var defaultState = true; - if (document.location.href.match(/toolbar=hidden/)) { defaultState = false; } - this._switch(defaultState); -} - -SQL.Toggle.prototype._click = function(e) { - this._switch(!this._state); -} - -SQL.Toggle.prototype._switch = function(state) { - this._state = state; - if (this._state) { - OZ.$("bar").style.height = ""; - } else { - OZ.$("bar").style.overflow = "hidden"; - OZ.$("bar").style.height = this._elm.offsetHeight + "px"; - } - this._elm.className = (this._state ? "on" : "off"); -} +SQL.Toggle = function (elm, min, owner) { + this.owner = owner; + this._state = null; + this.elm = elm; + this.elmMin = min; + this.bar = OZ.$("bar"); + + var win = OZ.DOM.win(); + this.bar.style.left = Math.round((win[0] - this.bar.offsetWidth) / 2) + "px"; + + var defaultState = true; + if (document.location.href.match(/toolbar=hidden/)) { + defaultState = false; + } + OZ.Event.add(this.elm, "click", this._click.bind(this)); + OZ.Event.add(this.elmMin, "click", this._click.bind(this)); + OZ.Event.add(window, "resize", this.sync.bind(this)); + OZ.Event.add(document, "keydown", this.press.bind(this)); + this._switch(defaultState); +}; + +SQL.Toggle.prototype._click = function (e) { + this._switch(!this._state); +}; + +SQL.Toggle.prototype._switch = function (state) { + this._state = state; + var win = OZ.DOM.win(); + if (this._state) { + // show full bar + this.bar.style.left = Math.round((win[0] - this.bar.offsetWidth) / 2) + "px"; + this.bar.style.transform = "translate(0px, 0px)"; + this.elmMin.style.transitionDelay = "0s"; + this.elmMin.style.transform = "translate(0px, 100px)"; + } else { + // hide bar + this.bar.style.transform = "translate(0px, 160px)"; + this.elmMin.style.left = Math.round((win[0] - this.elmMin.offsetWidth) / 2) + "px"; + this.elmMin.style.transitionDelay = "350ms"; + this.elmMin.style.transform = "translate(0px, 0px)"; + } +}; + +SQL.Toggle.prototype.sync = function () { + var win = OZ.DOM.win(); + if (this._state) + this.bar.style.left = Math.round((win[0] - this.bar.offsetWidth) / 2) + "px"; + else + this.elmMin.style.left = Math.round((win[0] - this.elmMin.offsetWidth) / 2) + "px"; +}; + +SQL.Toggle.prototype.press = function (e) { + var target = OZ.Event.target(e).nodeName.toLowerCase(); + + if (target === "textarea" || target === "input") { + return; + } /* not when in form field */ + + if (this.owner.rowManager.selected) { + return; + } /* do not process keypresses if a row is selected */ + + switch (e.keyCode) { + case 32: + OZ.Event.prevent(e); + this._switch(!this._state); + break; + } +}; \ No newline at end of file diff --git a/js/tooltip.js b/js/tooltip.js new file mode 100644 index 0000000..657d404 --- /dev/null +++ b/js/tooltip.js @@ -0,0 +1,38 @@ +/* global SQL, OZ, CONFIG */ + +SQL.Tooltip = function (owner, elm) { + this._state = null; + this.owner = owner; + this.elm = elm; + OZ.Event.add(this.owner, "mouseenter", this._enter.bind(this)); + OZ.Event.add(this.owner, "mouseleave", this._leave.bind(this)); + OZ.Event.add(this.owner, "click", this._click.bind(this)); + this._update(); +}; + +SQL.Tooltip.prototype._click = function (e) { + OZ.DOM.removeClass(this.elm, 'is-active'); +}; + +SQL.Tooltip.prototype._enter = function (e) { + this._update(); + OZ.DOM.addClass(this.elm, 'is-active'); +}; + +SQL.Tooltip.prototype._leave = function (e) { + OZ.DOM.removeClass(this.elm, 'is-active'); +}; + +SQL.Tooltip.prototype._update = function () { + var shortcut = CONFIG.SHORTCUTS[this.owner.id]; + this.elm.innerHTML = _(this.owner.dataset.i18n || this.owner.id) + (shortcut && shortcut.code ? ' [' + shortcut.key + ']' : ''); + this.x = (this.owner.offsetLeft + (this.owner.offsetWidth / 2)) - (this.elm.offsetWidth / 2); + + if (this.owner.className.indexOf('small') !== -1) + this.y = this.owner.offsetTop - (this.owner.offsetHeight * 2); + else + this.y = this.owner.offsetTop - (this.owner.offsetHeight); + + this.elm.style.top = this.y + 'px'; + this.elm.style.left = this.x + 'px'; +}; \ No newline at end of file diff --git a/js/window.js b/js/window.js index c3cceae..f3c145f 100644 --- a/js/window.js +++ b/js/window.js @@ -1,93 +1,113 @@ /* --------------------- window ------------ */ -SQL.Window = function(owner) { - this.owner = owner; - this.dom = { - container:OZ.$("window"), - background:OZ.$("background"), - ok:OZ.$("windowok"), - cancel:OZ.$("windowcancel"), - title:OZ.$("windowtitle"), - content:OZ.$("windowcontent"), - throbber:OZ.$("throbber") - } - this.dom.ok.value = _("windowok"); - this.dom.cancel.value = _("windowcancel"); - this.dom.throbber.alt = this.dom.throbber.title = _("throbber"); - OZ.Event.add(this.dom.ok, "click", this.ok.bind(this)); - OZ.Event.add(this.dom.cancel, "click", this.close.bind(this)); - OZ.Event.add(document, "keydown", this.key.bind(this)); - - this.sync = this.sync.bind(this); - - OZ.Event.add(window, "scroll", this.sync); - OZ.Event.add(window, "resize", this.sync); - this.state = 0; - this.hideThrobber(); - - this.sync(); -} +/* global SQL, OZ */ -SQL.Window.prototype.showThrobber = function() { - this.dom.throbber.style.visibility = ""; -} +SQL.Window = function (owner) { + this.owner = owner; + this.dom = { + container: OZ.$("window"), + background: OZ.$("background"), + ok: OZ.$("windowok"), + cancel: OZ.$("windowcancel"), + title: OZ.$("windowtitle"), + content: OZ.$("windowcontent"), + throbber: OZ.$("throbber") + }; + this.dom.ok.innerHTML = _("windowok"); + this.dom.cancel.innerHTML = _("windowcancel"); + this.dom.throbber.alt = this.dom.throbber.title = _("throbber"); + OZ.Event.add(this.dom.ok, "click", this.ok.bind(this)); + OZ.Event.add(this.dom.cancel, "click", this.close.bind(this)); + OZ.Event.add(document, "keydown", this.key.bind(this)); + + this.sync = this.sync.bind(this); -SQL.Window.prototype.hideThrobber = function() { - this.dom.throbber.style.visibility = "hidden"; + OZ.Event.add(window, "scroll", this.sync); + OZ.Event.add(window, "resize", this.sync); + this.state = 0; + this.hideThrobber(); + + this.sync(); } -SQL.Window.prototype.open = function(title, content, callback) { - this.state = 1; - this.callback = callback; - while (this.dom.title.childNodes.length > 1) { this.dom.title.removeChild(this.dom.title.childNodes[1]); } - - var txt = OZ.DOM.text(title); - this.dom.title.appendChild(txt); - this.dom.background.style.visibility = "visible"; - OZ.DOM.clear(this.dom.content); - this.dom.content.appendChild(content); - - var win = OZ.DOM.win(); - var scroll = OZ.DOM.scroll(); - this.dom.container.style.left = Math.round(scroll[0] + (win[0] - this.dom.container.offsetWidth)/2)+"px"; - this.dom.container.style.top = Math.round(scroll[1] + (win[1] - this.dom.container.offsetHeight)/2)+"px"; - - this.dom.cancel.style.visibility = (this.callback ? "" : "hidden"); - this.dom.container.style.visibility = "visible"; - - var formElements = ["input","select","textarea"]; - var all = this.dom.container.getElementsByTagName("*"); - for (var i=0;i max) { max = z; } - } - - OZ.$("controls").style.zIndex = max+5; - return max; +SQL.Designer.prototype.init2 = function () { /* secondary init, after locale & datatypes were retrieved */ + this.map = new SQL.Map(this); + this.rubberband = new SQL.Rubberband(this); + this.tableManager = new SQL.TableManager(this); + this.rowManager = new SQL.RowManager(this); + this.keyManager = new SQL.KeyManager(this); + this.io = new SQL.IO(this); + this.options = new SQL.Options(this); + this.window = new SQL.Window(this); + + this.sync(); + + OZ.$("docs").text = _("docs"); + + var url = window.location.href; + var r = url.match(/keyword=([^&]+)/); + if (r) { + var keyword = r[1]; + this.io.serverload(false, keyword); + } + document.body.style.visibility = "visible"; } -SQL.Designer.prototype.addTable = function(name, x, y) { - var max = this.getMaxZ(); - var t = new SQL.Table(this, name, x, y, max+1); - this.tables.push(t); - this.dom.container.appendChild(t.dom.container); - return t; +SQL.Designer.prototype.getMaxZ = function () { /* find max zIndex */ + var max = 0; + for (var i = 0; i < this.tables.length; i++) { + var z = this.tables[i].getZ(); + if (z > max) { + max = z; + } + } + + OZ.$("controls").style.zIndex = max + 5; + return max; } -SQL.Designer.prototype.removeTable = function(t) { - this.tableManager.select(false); - this.rowManager.select(false); - var idx = this.tables.indexOf(t); - if (idx == -1) { return; } - t.destroy(); - this.tables.splice(idx,1); +SQL.Designer.prototype.addTable = function (name, x, y) { + var max = this.getMaxZ(); + var t = new SQL.Table(this, name, x, y, max + 1); + this.tables.push(t); + this.dom.container.appendChild(t.dom.container); + return t; } -SQL.Designer.prototype.addRelation = function(row1, row2) { - var r = new SQL.Relation(this, row1, row2); - this.relations.push(r); - return r; +SQL.Designer.prototype.removeTable = function (t) { + this.tableManager.select(false); + this.rowManager.select(false); + var idx = this.tables.indexOf(t); + if (idx == -1) { + return; + } + t.destroy(); + this.tables.splice(idx, 1); } -SQL.Designer.prototype.removeRelation = function(r) { - var idx = this.relations.indexOf(r); - if (idx == -1) { return; } - r.destroy(); - this.relations.splice(idx,1); +SQL.Designer.prototype.addRelation = function (row1, row2) { + var r = new SQL.Relation(this, row1, row2); + this.relations.push(r); + return r; } -SQL.Designer.prototype.getCookie = function() { - var c = document.cookie; - var obj = {}; - var parts = c.split(";"); - for (var i=0;i old) { t.setZ(t.getZ()-1); } - } - var m = table.dom.mini; - m.parentNode.appendChild(m); +SQL.Designer.prototype.setOption = function (name, value) { + var obj = this.getCookie(); + obj[name] = value; + this.setCookie(obj); } -SQL.Designer.prototype.clearTables = function() { - while (this.tables.length) { this.removeTable(this.tables[0]); } - this.setTitle(false); +SQL.Designer.prototype.raise = function (table) { /* raise a table */ + var old = table.getZ(); + var max = this.getMaxZ(); + table.setZ(max); + for (var i = 0; i < this.tables.length; i++) { + var t = this.tables[i]; + if (t == table) { + continue; + } + if (t.getZ() > old) { + t.setZ(t.getZ() - 1); + } + } + var m = table.dom.mini; + m.parentNode.appendChild(m); } -SQL.Designer.prototype.alignTables = function() { - var win = OZ.DOM.win(); - var avail = win[0] - OZ.$("bar").offsetWidth; - var x = 10; - var y = 10; - var max = 0; - - this.tables.sort(function(a,b){ - return b.getRelations().length - a.getRelations().length; - }); - - for (var i=0;i avail) { - x = 10; - y += 10 + max; - max = 0; - } - t.moveTo(x,y); - x += 10 + w; - if (h > max) { max = h; } - } - - this.sync(); +SQL.Designer.prototype.clearTables = function () { + while (this.tables.length) { + this.removeTable(this.tables[0]); + } + this.setTitle(false); } -SQL.Designer.prototype.findNamedTable = function(name) { /* find row specified as table(row) */ - for (var i=0;i avail) { + x = 10; + y += 10 + max; + max = 0; + } + t.moveTo(x, y); + x += 10 + w; + if (h > max) { + max = h; + } + } + + this.sync(); } -SQL.Designer.prototype.toXML = function() { - var xml = '\n'; - xml += '\n'; - xml += '\n'; - xml += '\n'; - - /* serialize datatypes */ - if (window.XMLSerializer) { - var s = new XMLSerializer(); - xml += s.serializeToString(window.DATATYPES); - } else if (window.DATATYPES.xml) { - xml += window.DATATYPES.xml; - } else { - alert(_("errorxml")+': '+e.message); - } - - for (var i=0;i\n'; + xml += '\n'; + + /* serialize datatypes */ + if (window.XMLSerializer) { + var s = new XMLSerializer(); + xml += s.serializeToString(window.DATATYPES); + } else if (window.DATATYPES.xml) { + xml += window.DATATYPES.xml; + } else { + alert(_("errorxml") + ': ' + e.message); + } + + for (var i = 0; i < this.tables.length; i++) { + xml += this.tables[i].toXML(); + } + xml += "\n"; + return xml; } -SQL.Designer.prototype.fromXML = function(node) { - this.clearTables(); - var types = node.getElementsByTagName("datatypes"); - if (types.length) { window.DATATYPES = types[0]; } - var tables = node.getElementsByTagName("table"); - for (var i=0;iDatabase for new designs Some options are applied only after full page reload. Cookies must be enabled for options to work. Table snap distance + Selection strategy + Precise (complete bodies inside rubberband) + Lazy (only parts inside rubberband) In pixels, 0 = disable snapping Pattern for foreign names %T = primary table, %R = primary key, %t = foreign table @@ -55,6 +58,7 @@ Draw smooth connectors (if supported by browser)? Show field size in table design? Show field datatype in table design? + Override type colors with Material's? Keys diff --git a/locale/es.xml b/locale/es.xml index 7a4591c..32536fe 100644 --- a/locale/es.xml +++ b/locale/es.xml @@ -48,13 +48,17 @@ Base de datos para nuevos diseños Algunas opciones se aplican solo despúes de recargar totalmente la pagina. Las cookies deben estar habilitadas para que funcione la personalización. Distancia de ajuste de tablas + Estrategia de selección + Precisa (cuerpos completos dentro del area) + Vaga (solo partes dentro del area) En píxeles, 0 = deshabilitar ajuste Patrón para nombres de clave foránea %T = tabla primaria, %R = clave primaria, %t = tabla foránea ¿Ocultar conectores de tablas al arrastrar? ¿Dibujar conectores suaves (si son soportados por el navegador)? ¿Mostrar tamaño del campo en el diseño de tabla? - ¿Mostrar tipo de dato del campo en el diseño de tabla? + ¿Mostrar tipo de dato del campo en el diseño de tabla? + ¿Usar colores de tipo dato de estilo Material? Claves diff --git a/styles/mui.min.css b/styles/mui.min.css new file mode 100644 index 0000000..acc3ff2 --- /dev/null +++ b/styles/mui.min.css @@ -0,0 +1 @@ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:border-box}:after,:before{box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:Arial,Verdana,Tahoma;font-size:14px;font-weight:400;line-height:1.429;color:rgba(0,0,0,.87);background-color:#FFF}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#2196F3;text-decoration:none}a:focus,a:hover{color:#1976D2;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}p{margin:0 0 10px}ol,ul{margin-top:0;margin-bottom:10px}figure{margin:0}img{vertical-align:middle}hr{margin-top:20px;margin-bottom:20px;border:0;height:1px;background-color:rgba(0,0,0,.12)}legend{display:block;width:100%;padding:0;margin-bottom:10px;font-size:21px;color:rgba(0,0,0,.87);line-height:inherit;border:0}input[type=search]{box-sizing:border-box;-webkit-appearance:none}input[type=checkbox]:focus,input[type=radio]:focus,input[type=file]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type=checkbox]:disabled,input[type=radio]:disabled{cursor:not-allowed}strong{font-weight:700}abbr[title]{cursor:help;border-bottom:1px dotted #2196F3}h1,h2,h3{margin-top:20px;margin-bottom:10px}h4,h5,h6{margin-top:10px;margin-bottom:10px}.mui--appbar-height{height:56px}.mui--appbar-min-height,.mui-appbar{min-height:56px}.mui--appbar-line-height{line-height:56px}.mui--appbar-top{top:56px}@media (orientation:landscape) and (max-height:480px){.mui--appbar-height{height:48px}.mui--appbar-min-height,.mui-appbar{min-height:48px}.mui--appbar-line-height{line-height:48px}.mui--appbar-top{top:48px}}@media (min-width:480px){.mui--appbar-height{height:64px}.mui--appbar-min-height,.mui-appbar{min-height:64px}.mui--appbar-line-height{line-height:64px}.mui--appbar-top{top:64px}}.mui-appbar{background-color:#2196F3;color:#FFF}.mui-btn{animation-duration:.1ms;animation-name:mui-node-inserted;font-weight:500;font-size:14px;line-height:18px;text-transform:uppercase;color:rgba(0,0,0,.87);background-color:#FFF;transition:all .2s ease-in-out;display:inline-block;height:36px;padding:0 26px;margin-top:6px;margin-bottom:6px;border:none;border-radius:2px;cursor:pointer;-ms-touch-action:manipulation;touch-action:manipulation;background-image:none;text-align:center;line-height:36px;vertical-align:middle;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-size:14px;letter-spacing:.03em;position:relative;overflow:hidden}.mui-btn:active,.mui-btn:focus,.mui-btn:hover{color:rgba(0,0,0,.87);background-color:#fff}.mui-btn[disabled]:active,.mui-btn[disabled]:focus,.mui-btn[disabled]:hover{color:rgba(0,0,0,.87);background-color:#FFF}.mui-btn.mui-btn--flat{color:rgba(0,0,0,.87);background-color:transparent}.mui-btn.mui-btn--flat:active,.mui-btn.mui-btn--flat:focus,.mui-btn.mui-btn--flat:hover{color:rgba(0,0,0,.87);background-color:#f2f2f2}.mui-btn.mui-btn--flat[disabled]:active,.mui-btn.mui-btn--flat[disabled]:focus,.mui-btn.mui-btn--flat[disabled]:hover{color:rgba(0,0,0,.87);background-color:transparent}.mui-btn:active,.mui-btn:focus,.mui-btn:hover{outline:0;text-decoration:none;color:rgba(0,0,0,.87)}.mui-btn:focus,.mui-btn:hover{box-shadow:0 0 2px rgba(0,0,0,.12),0 2px 2px rgba(0,0,0,.2)}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.mui-btn:focus,.mui-btn:hover{box-shadow:0 -1px 2px rgba(0,0,0,.12),-1px 0 2px rgba(0,0,0,.12),0 0 2px rgba(0,0,0,.12),0 2px 2px rgba(0,0,0,.2)}}.mui-btn:active:hover{box-shadow:0 10px 20px rgba(0,0,0,.19),0 6px 6px rgba(0,0,0,.23)}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.mui-btn:active:hover{box-shadow:0 -1px 2px rgba(0,0,0,.12),-1px 0 2px rgba(0,0,0,.12),0 10px 20px rgba(0,0,0,.19),0 6px 6px rgba(0,0,0,.23)}}.mui-btn.mui--is-disabled,.mui-btn:disabled{cursor:not-allowed;pointer-events:none;opacity:.6;box-shadow:none}.mui-btn+.mui-btn{margin-left:8px}.mui-btn--flat{background-color:transparent}.mui-btn--flat:active,.mui-btn--flat:active:hover,.mui-btn--flat:focus,.mui-btn--flat:hover{box-shadow:none;background-color:#f2f2f2}.mui-btn--fab,.mui-btn--raised{box-shadow:0 0 2px rgba(0,0,0,.12),0 2px 2px rgba(0,0,0,.2)}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.mui-btn--fab,.mui-btn--raised{box-shadow:0 -1px 2px rgba(0,0,0,.12),-1px 0 2px rgba(0,0,0,.12),0 0 2px rgba(0,0,0,.12),0 2px 2px rgba(0,0,0,.2)}}.mui-btn--fab:active,.mui-btn--raised:active{box-shadow:0 10px 20px rgba(0,0,0,.19),0 6px 6px rgba(0,0,0,.23)}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.mui-btn--fab:active,.mui-btn--raised:active{box-shadow:0 -1px 2px rgba(0,0,0,.12),-1px 0 2px rgba(0,0,0,.12),0 10px 20px rgba(0,0,0,.19),0 6px 6px rgba(0,0,0,.23)}}.mui-btn--fab{position:relative;padding:0;width:55px;height:55px;line-height:55px;border-radius:50%;z-index:1}.mui-btn--primary{color:#FFF;background-color:#2196F3}.mui-btn--primary:active,.mui-btn--primary:focus,.mui-btn--primary:hover{color:#FFF;background-color:#39a1f4}.mui-btn--primary[disabled]:active,.mui-btn--primary[disabled]:focus,.mui-btn--primary[disabled]:hover{color:#FFF;background-color:#2196F3}.mui-btn--primary.mui-btn--flat{color:#2196F3;background-color:transparent}.mui-btn--primary.mui-btn--flat:active,.mui-btn--primary.mui-btn--flat:focus,.mui-btn--primary.mui-btn--flat:hover{color:#2196F3;background-color:#f2f2f2}.mui-btn--primary.mui-btn--flat[disabled]:active,.mui-btn--primary.mui-btn--flat[disabled]:focus,.mui-btn--primary.mui-btn--flat[disabled]:hover{color:#2196F3;background-color:transparent}.mui-btn--dark{color:#FFF;background-color:#424242}.mui-btn--dark:active,.mui-btn--dark:focus,.mui-btn--dark:hover{color:#FFF;background-color:#4f4f4f}.mui-btn--dark[disabled]:active,.mui-btn--dark[disabled]:focus,.mui-btn--dark[disabled]:hover{color:#FFF;background-color:#424242}.mui-btn--dark.mui-btn--flat{color:#424242;background-color:transparent}.mui-btn--dark.mui-btn--flat:active,.mui-btn--dark.mui-btn--flat:focus,.mui-btn--dark.mui-btn--flat:hover{color:#424242;background-color:#f2f2f2}.mui-btn--dark.mui-btn--flat[disabled]:active,.mui-btn--dark.mui-btn--flat[disabled]:focus,.mui-btn--dark.mui-btn--flat[disabled]:hover{color:#424242;background-color:transparent}.mui-btn--danger{color:#FFF;background-color:#F44336}.mui-btn--danger:active,.mui-btn--danger:focus,.mui-btn--danger:hover{color:#FFF;background-color:#f55a4e}.mui-btn--danger[disabled]:active,.mui-btn--danger[disabled]:focus,.mui-btn--danger[disabled]:hover{color:#FFF;background-color:#F44336}.mui-btn--danger.mui-btn--flat{color:#F44336;background-color:transparent}.mui-btn--danger.mui-btn--flat:active,.mui-btn--danger.mui-btn--flat:focus,.mui-btn--danger.mui-btn--flat:hover{color:#F44336;background-color:#f2f2f2}.mui-btn--danger.mui-btn--flat[disabled]:active,.mui-btn--danger.mui-btn--flat[disabled]:focus,.mui-btn--danger.mui-btn--flat[disabled]:hover{color:#F44336;background-color:transparent}.mui-btn--accent{color:#FFF;background-color:#FF4081}.mui-btn--accent:active,.mui-btn--accent:focus,.mui-btn--accent:hover{color:#FFF;background-color:#ff5a92}.mui-btn--accent[disabled]:active,.mui-btn--accent[disabled]:focus,.mui-btn--accent[disabled]:hover{color:#FFF;background-color:#FF4081}.mui-btn--accent.mui-btn--flat{color:#FF4081;background-color:transparent}.mui-btn--accent.mui-btn--flat:active,.mui-btn--accent.mui-btn--flat:focus,.mui-btn--accent.mui-btn--flat:hover{color:#FF4081;background-color:#f2f2f2}.mui-btn--accent.mui-btn--flat[disabled]:active,.mui-btn--accent.mui-btn--flat[disabled]:focus,.mui-btn--accent.mui-btn--flat[disabled]:hover{color:#FF4081;background-color:transparent}.mui-btn--small{height:30.6px;line-height:30.6px;padding:0 16px;font-size:13px}.mui-btn--large{height:54px;line-height:54px;padding:0 26px;font-size:14px}.mui-btn--fab.mui-btn--small{width:44px;height:44px;line-height:44px}.mui-btn--fab.mui-btn--large{width:75px;height:75px;line-height:75px}.mui-checkbox,.mui-radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.mui-checkbox>label,.mui-radio>label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.mui-checkbox--inline>label>input[type=checkbox],.mui-checkbox>label>input[type=checkbox],.mui-radio--inline>label>input[type=radio],.mui-radio>label>input[type=radio]{position:absolute;margin-left:-20px;margin-top:4px}.mui-checkbox+.mui-checkbox,.mui-radio+.mui-radio{margin-top:-5px}.mui-checkbox--inline,.mui-radio--inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.mui-checkbox--inline>input[type=checkbox],.mui-checkbox--inline>input[type=radio],.mui-checkbox--inline>label>input[type=checkbox],.mui-checkbox--inline>label>input[type=radio],.mui-radio--inline>input[type=checkbox],.mui-radio--inline>input[type=radio],.mui-radio--inline>label>input[type=checkbox],.mui-radio--inline>label>input[type=radio]{margin:4px 0 0;line-height:normal}.mui-checkbox--inline+.mui-checkbox--inline,.mui-radio--inline+.mui-radio--inline{margin-top:0;margin-left:10px}.mui-container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.mui-container:after,.mui-container:before{content:" ";display:table}.mui-container:after{clear:both}@media (min-width:544px){.mui-container{max-width:570px}}@media (min-width:768px){.mui-container{max-width:740px}}@media (min-width:992px){.mui-container{max-width:960px}}@media (min-width:1200px){.mui-container{max-width:1170px}}.mui-container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.mui-container-fluid:after,.mui-container-fluid:before{content:" ";display:table}.mui-container-fluid:after{clear:both}.mui-divider{display:block;height:1px;background-color:rgba(0,0,0,.12)}.mui--divider-top{border-top:1px solid rgba(0,0,0,.12)}.mui--divider-bottom{border-bottom:1px solid rgba(0,0,0,.12)}.mui--divider-left{border-left:1px solid rgba(0,0,0,.12)}.mui--divider-right{border-right:1px solid rgba(0,0,0,.12)}.mui-dropdown{display:inline-block;position:relative}[data-mui-toggle=dropdown]{animation-duration:.1ms;animation-name:mui-node-inserted;outline:0}.mui-dropdown__menu{position:absolute;top:100%;left:0;display:none;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#FFF;border-radius:2px;z-index:1;background-clip:padding-box}.mui-dropdown__menu.mui--is-open{display:block}.mui-dropdown__menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.429;color:rgba(0,0,0,.87);white-space:nowrap}.mui-dropdown__menu>li>a:focus,.mui-dropdown__menu>li>a:hover{text-decoration:none;color:rgba(0,0,0,.87);background-color:#EEE}.mui-dropdown__menu>.mui--is-disabled>a,.mui-dropdown__menu>.mui--is-disabled>a:focus,.mui-dropdown__menu>.mui--is-disabled>a:hover{color:#EEE}.mui-dropdown__menu>.mui--is-disabled>a:focus,.mui-dropdown__menu>.mui--is-disabled>a:hover{text-decoration:none;background-color:transparent;background-image:none;cursor:not-allowed}.mui-dropdown__menu--right{left:auto;right:0}@media (min-width:544px){.mui-form--inline>.mui-textfield{display:inline-block;margin-bottom:0}.mui-form--inline>.mui-checkbox,.mui-form--inline>.mui-radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.mui-form--inline>.mui-checkbox>label,.mui-form--inline>.mui-radio>label{padding-left:0}.mui-form--inline>.mui-checkbox>label>input[type=checkbox],.mui-form--inline>.mui-radio>label>input[type=radio]{position:relative;margin-left:0}.mui-form--inline>.mui-select{display:inline-block}.mui-form--inline>.mui-btn{margin-bottom:0;margin-top:0;vertical-align:bottom}}.mui-row{margin-left:-15px;margin-right:-15px}.mui-row:after,.mui-row:before{content:" ";display:table}.mui-row:after{clear:both}.mui-col-lg-1,.mui-col-lg-10,.mui-col-lg-11,.mui-col-lg-12,.mui-col-lg-2,.mui-col-lg-3,.mui-col-lg-4,.mui-col-lg-5,.mui-col-lg-6,.mui-col-lg-7,.mui-col-lg-8,.mui-col-lg-9,.mui-col-md-1,.mui-col-md-10,.mui-col-md-11,.mui-col-md-12,.mui-col-md-2,.mui-col-md-3,.mui-col-md-4,.mui-col-md-5,.mui-col-md-6,.mui-col-md-7,.mui-col-md-8,.mui-col-md-9,.mui-col-sm-1,.mui-col-sm-10,.mui-col-sm-11,.mui-col-sm-12,.mui-col-sm-2,.mui-col-sm-3,.mui-col-sm-4,.mui-col-sm-5,.mui-col-sm-6,.mui-col-sm-7,.mui-col-sm-8,.mui-col-sm-9,.mui-col-xs-1,.mui-col-xs-10,.mui-col-xs-11,.mui-col-xs-12,.mui-col-xs-2,.mui-col-xs-3,.mui-col-xs-4,.mui-col-xs-5,.mui-col-xs-6,.mui-col-xs-7,.mui-col-xs-8,.mui-col-xs-9{min-height:1px;padding-left:15px;padding-right:15px}.mui-col-xs-1,.mui-col-xs-10,.mui-col-xs-11,.mui-col-xs-12,.mui-col-xs-2,.mui-col-xs-3,.mui-col-xs-4,.mui-col-xs-5,.mui-col-xs-6,.mui-col-xs-7,.mui-col-xs-8,.mui-col-xs-9{float:left}.mui-col-xs-1{width:8.33333%}.mui-col-xs-2{width:16.66667%}.mui-col-xs-3{width:25%}.mui-col-xs-4{width:33.33333%}.mui-col-xs-5{width:41.66667%}.mui-col-xs-6{width:50%}.mui-col-xs-7{width:58.33333%}.mui-col-xs-8{width:66.66667%}.mui-col-xs-9{width:75%}.mui-col-xs-10{width:83.33333%}.mui-col-xs-11{width:91.66667%}.mui-col-xs-12{width:100%}.mui-col-xs-offset-0{margin-left:0}.mui-col-xs-offset-1{margin-left:8.33333%}.mui-col-xs-offset-2{margin-left:16.66667%}.mui-col-xs-offset-3{margin-left:25%}.mui-col-xs-offset-4{margin-left:33.33333%}.mui-col-xs-offset-5{margin-left:41.66667%}.mui-col-xs-offset-6{margin-left:50%}.mui-col-xs-offset-7{margin-left:58.33333%}.mui-col-xs-offset-8{margin-left:66.66667%}.mui-col-xs-offset-9{margin-left:75%}.mui-col-xs-offset-10{margin-left:83.33333%}.mui-col-xs-offset-11{margin-left:91.66667%}.mui-col-xs-offset-12{margin-left:100%}@media (min-width:544px){.mui-col-sm-1,.mui-col-sm-10,.mui-col-sm-11,.mui-col-sm-12,.mui-col-sm-2,.mui-col-sm-3,.mui-col-sm-4,.mui-col-sm-5,.mui-col-sm-6,.mui-col-sm-7,.mui-col-sm-8,.mui-col-sm-9{float:left}.mui-col-sm-1{width:8.33333%}.mui-col-sm-2{width:16.66667%}.mui-col-sm-3{width:25%}.mui-col-sm-4{width:33.33333%}.mui-col-sm-5{width:41.66667%}.mui-col-sm-6{width:50%}.mui-col-sm-7{width:58.33333%}.mui-col-sm-8{width:66.66667%}.mui-col-sm-9{width:75%}.mui-col-sm-10{width:83.33333%}.mui-col-sm-11{width:91.66667%}.mui-col-sm-12{width:100%}.mui-col-sm-offset-0{margin-left:0}.mui-col-sm-offset-1{margin-left:8.33333%}.mui-col-sm-offset-2{margin-left:16.66667%}.mui-col-sm-offset-3{margin-left:25%}.mui-col-sm-offset-4{margin-left:33.33333%}.mui-col-sm-offset-5{margin-left:41.66667%}.mui-col-sm-offset-6{margin-left:50%}.mui-col-sm-offset-7{margin-left:58.33333%}.mui-col-sm-offset-8{margin-left:66.66667%}.mui-col-sm-offset-9{margin-left:75%}.mui-col-sm-offset-10{margin-left:83.33333%}.mui-col-sm-offset-11{margin-left:91.66667%}.mui-col-sm-offset-12{margin-left:100%}}@media (min-width:768px){.mui-col-md-1,.mui-col-md-10,.mui-col-md-11,.mui-col-md-12,.mui-col-md-2,.mui-col-md-3,.mui-col-md-4,.mui-col-md-5,.mui-col-md-6,.mui-col-md-7,.mui-col-md-8,.mui-col-md-9{float:left}.mui-col-md-1{width:8.33333%}.mui-col-md-2{width:16.66667%}.mui-col-md-3{width:25%}.mui-col-md-4{width:33.33333%}.mui-col-md-5{width:41.66667%}.mui-col-md-6{width:50%}.mui-col-md-7{width:58.33333%}.mui-col-md-8{width:66.66667%}.mui-col-md-9{width:75%}.mui-col-md-10{width:83.33333%}.mui-col-md-11{width:91.66667%}.mui-col-md-12{width:100%}.mui-col-md-offset-0{margin-left:0}.mui-col-md-offset-1{margin-left:8.33333%}.mui-col-md-offset-2{margin-left:16.66667%}.mui-col-md-offset-3{margin-left:25%}.mui-col-md-offset-4{margin-left:33.33333%}.mui-col-md-offset-5{margin-left:41.66667%}.mui-col-md-offset-6{margin-left:50%}.mui-col-md-offset-7{margin-left:58.33333%}.mui-col-md-offset-8{margin-left:66.66667%}.mui-col-md-offset-9{margin-left:75%}.mui-col-md-offset-10{margin-left:83.33333%}.mui-col-md-offset-11{margin-left:91.66667%}.mui-col-md-offset-12{margin-left:100%}}@media (min-width:992px){.mui-col-lg-1,.mui-col-lg-10,.mui-col-lg-11,.mui-col-lg-12,.mui-col-lg-2,.mui-col-lg-3,.mui-col-lg-4,.mui-col-lg-5,.mui-col-lg-6,.mui-col-lg-7,.mui-col-lg-8,.mui-col-lg-9{float:left}.mui-col-lg-1{width:8.33333%}.mui-col-lg-2{width:16.66667%}.mui-col-lg-3{width:25%}.mui-col-lg-4{width:33.33333%}.mui-col-lg-5{width:41.66667%}.mui-col-lg-6{width:50%}.mui-col-lg-7{width:58.33333%}.mui-col-lg-8{width:66.66667%}.mui-col-lg-9{width:75%}.mui-col-lg-10{width:83.33333%}.mui-col-lg-11{width:91.66667%}.mui-col-lg-12{width:100%}.mui-col-lg-offset-0{margin-left:0}.mui-col-lg-offset-1{margin-left:8.33333%}.mui-col-lg-offset-2{margin-left:16.66667%}.mui-col-lg-offset-3{margin-left:25%}.mui-col-lg-offset-4{margin-left:33.33333%}.mui-col-lg-offset-5{margin-left:41.66667%}.mui-col-lg-offset-6{margin-left:50%}.mui-col-lg-offset-7{margin-left:58.33333%}.mui-col-lg-offset-8{margin-left:66.66667%}.mui-col-lg-offset-9{margin-left:75%}.mui-col-lg-offset-10{margin-left:83.33333%}.mui-col-lg-offset-11{margin-left:91.66667%}.mui-col-lg-offset-12{margin-left:100%}}@media (min-width:1200px){.mui-col-xl-1,.mui-col-xl-10,.mui-col-xl-11,.mui-col-xl-12,.mui-col-xl-2,.mui-col-xl-3,.mui-col-xl-4,.mui-col-xl-5,.mui-col-xl-6,.mui-col-xl-7,.mui-col-xl-8,.mui-col-xl-9{float:left}.mui-col-xl-1{width:8.33333%}.mui-col-xl-2{width:16.66667%}.mui-col-xl-3{width:25%}.mui-col-xl-4{width:33.33333%}.mui-col-xl-5{width:41.66667%}.mui-col-xl-6{width:50%}.mui-col-xl-7{width:58.33333%}.mui-col-xl-8{width:66.66667%}.mui-col-xl-9{width:75%}.mui-col-xl-10{width:83.33333%}.mui-col-xl-11{width:91.66667%}.mui-col-xl-12{width:100%}.mui-col-xl-offset-0{margin-left:0}.mui-col-xl-offset-1{margin-left:8.33333%}.mui-col-xl-offset-2{margin-left:16.66667%}.mui-col-xl-offset-3{margin-left:25%}.mui-col-xl-offset-4{margin-left:33.33333%}.mui-col-xl-offset-5{margin-left:41.66667%}.mui-col-xl-offset-6{margin-left:50%}.mui-col-xl-offset-7{margin-left:58.33333%}.mui-col-xl-offset-8{margin-left:66.66667%}.mui-col-xl-offset-9{margin-left:75%}.mui-col-xl-offset-10{margin-left:83.33333%}.mui-col-xl-offset-11{margin-left:91.66667%}.mui-col-xl-offset-12{margin-left:100%}}.mui-panel{padding:15px;margin-bottom:20px;border-radius:0;background-color:#FFF;box-shadow:0 2px 2px 0 rgba(0,0,0,.16),0 0 2px 0 rgba(0,0,0,.12)}.mui-panel:after,.mui-panel:before{content:" ";display:table}.mui-panel:after{clear:both}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.mui-panel{box-shadow:0 -1px 2px 0 rgba(0,0,0,.12),-1px 0 2px 0 rgba(0,0,0,.12),0 2px 2px 0 rgba(0,0,0,.16),0 0 2px 0 rgba(0,0,0,.12)}}.mui-select{display:block;padding-top:15px;margin-bottom:20px;position:relative}.mui-select:focus{outline:0}.mui-select:focus>select{height:33px;margin-bottom:-1px;border-color:#2196F3;border-width:2px}.mui-select>select{animation-duration:.1ms;animation-name:mui-node-inserted;display:block;height:32px;width:100%;appearance:none;-webkit-appearance:none;-moz-appearance:none;outline:0;border:none;border-bottom:1px solid rgba(0,0,0,.26);border-radius:0;box-shadow:none;background-color:transparent;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iNiIgd2lkdGg9IjEwIj48cG9seWdvbiBwb2ludHM9IjAsMCAxMCwwIDUsNiIgc3R5bGU9ImZpbGw6cmdiYSgwLDAsMCwuMjQpOyIvPjwvc3ZnPg==);background-repeat:no-repeat;background-position:right center;cursor:pointer;color:rgba(0,0,0,.87);font-size:16px;padding:0 25px 0 0}.mui-select>select::-ms-expand{display:none}.mui-select>select:focus{outline:0;height:33px;margin-bottom:-1px;border-color:#2196F3;border-width:2px}.mui-select>select:disabled{color:rgba(0,0,0,.38);cursor:not-allowed;background-color:transparent;opacity:1}.mui-select>label{position:absolute;top:0;display:block;width:100%;color:rgba(0,0,0,.54);font-size:12px;font-weight:400;line-height:15px;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.mui-select:focus>label,.mui-select>select:focus~label{color:#2196F3}.mui-select__menu{position:absolute;z-index:2;min-width:100%;overflow-y:auto;padding:8px 0;background-color:#FFF;font-size:16px}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.mui-select__menu{border-left:1px solid rgba(0,0,0,.12);border-top:1px solid rgba(0,0,0,.12)}}.mui-select__menu>div{padding:0 22px;height:42px;line-height:42px;cursor:pointer;white-space:nowrap}.mui-select__menu>div.mui--is-selected{background-color:#EEE}.mui-select__menu>div:not(.mui-optgroup__label):hover{background-color:#E0E0E0}.mui-optgroup__option{text-indent:1em}.mui-optgroup__label{color:rgba(0,0,0,.54);font-size:.9em}th{text-align:left}.mui-table{width:100%;max-width:100%;margin-bottom:20px}.mui-table>tbody>tr>td,.mui-table>tbody>tr>th,.mui-table>tfoot>tr>td,.mui-table>tfoot>tr>th,.mui-table>thead>tr>td,.mui-table>thead>tr>th{padding:10px;line-height:1.429}.mui-table>thead>tr>th{border-bottom:2px solid rgba(0,0,0,.12);font-weight:700}.mui-table>tbody+tbody{border-top:2px solid rgba(0,0,0,.12)}.mui-table.mui-table--bordered>tbody>tr>td{border-bottom:1px solid rgba(0,0,0,.12)}.mui-tabs__bar{list-style:none;padding-left:0;margin-bottom:0;background-color:transparent;white-space:nowrap;overflow-x:auto}.mui-tabs__bar>li{display:inline-block}.mui-tabs__bar>li>a{display:block;white-space:nowrap;text-transform:uppercase;font-weight:500;font-size:14px;color:rgba(0,0,0,.87);cursor:default;height:48px;line-height:48px;padding-left:24px;padding-right:24px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mui-tabs__bar>li>a:hover{text-decoration:none}.mui-tabs__bar>li.mui--is-active{border-bottom:2px solid #2196F3}.mui-tabs__bar>li.mui--is-active>a{color:#2196F3}.mui-tabs__bar.mui-tabs__bar--justified{display:table;width:100%;table-layout:fixed}.mui-tabs__bar.mui-tabs__bar--justified>li{display:table-cell}.mui-tabs__bar.mui-tabs__bar--justified>li>a{text-align:center;padding-left:0;padding-right:0}.mui-tabs__pane{display:none}.mui-tabs__pane.mui--is-active{display:block}[data-mui-toggle=tab]{animation-duration:.1ms;animation-name:mui-node-inserted}.mui-textfield{display:block;padding-top:15px;margin-bottom:20px;position:relative}.mui-textfield>label{position:absolute;top:0;display:block;width:100%;color:rgba(0,0,0,.54);font-size:12px;font-weight:400;line-height:15px;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.mui-textfield>textarea{padding-top:5px}.mui-textfield>input,.mui-textfield>textarea{display:block}.mui-textfield>input:focus~label,.mui-textfield>textarea:focus~label{color:#2196F3}.mui-textfield--float-label>label{position:absolute;transform:translate(0,15px);font-size:16px;line-height:32px;color:rgba(0,0,0,.26);text-overflow:clip;cursor:text;pointer-events:none}.mui-textfield--float-label>input:focus~label,.mui-textfield--float-label>textarea:focus~label{transform:translate(0,0);font-size:12px;line-height:15px;text-overflow:ellipsis}.mui-textfield--float-label>input:not(:focus).mui--is-not-empty~label,.mui-textfield--float-label>input:not(:focus):not(:empty):not(.mui--is-empty):not(.mui--is-not-empty)~label,.mui-textfield--float-label>input:not(:focus)[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty)~label,.mui-textfield--float-label>textarea:not(:focus).mui--is-not-empty~label,.mui-textfield--float-label>textarea:not(:focus):not(:empty):not(.mui--is-empty):not(.mui--is-not-empty)~label,.mui-textfield--float-label>textarea:not(:focus)[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty)~label{color:rgba(0,0,0,.54);font-size:12px;line-height:15px;transform:translate(0,0);text-overflow:ellipsis}.mui-textfield--wrap-label{display:table;width:100%;padding-top:0}.mui-textfield--wrap-label:not(.mui-textfield--float-label)>label{display:table-header-group;position:static;white-space:normal;overflow-x:visible}.mui-textfield>input,.mui-textfield>textarea{animation-duration:.1ms;animation-name:mui-node-inserted;display:block;background-color:transparent;color:rgba(0,0,0,.87);border:none;border-bottom:1px solid rgba(0,0,0,.26);outline:0;width:100%;font-size:16px;padding:0;box-shadow:none;border-radius:0;background-image:none}.mui-textfield>input:focus,.mui-textfield>textarea:focus{border-color:#2196F3;border-width:2px}.mui-textfield>input:-moz-read-only,.mui-textfield>input:disabled,.mui-textfield>textarea:-moz-read-only,.mui-textfield>textarea:disabled{cursor:not-allowed;background-color:transparent;opacity:1}.mui-textfield>input:disabled,.mui-textfield>input:read-only,.mui-textfield>textarea:disabled,.mui-textfield>textarea:read-only{cursor:not-allowed;background-color:transparent;opacity:1}.mui-textfield>input::-webkit-input-placeholder,.mui-textfield>textarea::-webkit-input-placeholder{color:rgba(0,0,0,.26);opacity:1}.mui-textfield>input::-moz-placeholder,.mui-textfield>textarea::-moz-placeholder{color:rgba(0,0,0,.26);opacity:1}.mui-textfield>input:-ms-input-placeholder,.mui-textfield>textarea:-ms-input-placeholder{color:rgba(0,0,0,.26);opacity:1}.mui-textfield>input::placeholder,.mui-textfield>textarea::placeholder{color:rgba(0,0,0,.26);opacity:1}.mui-textfield>input{height:32px}.mui-textfield>input:focus{height:33px;margin-bottom:-1px}.mui-textfield>textarea{min-height:64px}.mui-textfield>textarea[rows]:not([rows="2"]):focus{margin-bottom:-1px}.mui-textfield>input:focus{height:33px;margin-bottom:-1px}.mui-textfield>input:invalid:not(:focus):not(:required),.mui-textfield>input:invalid:not(:focus):required.mui--is-empty.mui--is-dirty,.mui-textfield>input:invalid:not(:focus):required.mui--is-not-empty,.mui-textfield>input:invalid:not(:focus):required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield>input:invalid:not(:focus):required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield>input:not(:focus).mui--is-invalid:not(:required),.mui-textfield>input:not(:focus).mui--is-invalid:required.mui--is-empty.mui--is-dirty,.mui-textfield>input:not(:focus).mui--is-invalid:required.mui--is-not-empty,.mui-textfield>input:not(:focus).mui--is-invalid:required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield>input:not(:focus).mui--is-invalid:required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield>textarea:invalid:not(:focus):not(:required),.mui-textfield>textarea:invalid:not(:focus):required.mui--is-empty.mui--is-dirty,.mui-textfield>textarea:invalid:not(:focus):required.mui--is-not-empty,.mui-textfield>textarea:invalid:not(:focus):required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield>textarea:invalid:not(:focus):required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield>textarea:not(:focus).mui--is-invalid:not(:required),.mui-textfield>textarea:not(:focus).mui--is-invalid:required.mui--is-empty.mui--is-dirty,.mui-textfield>textarea:not(:focus).mui--is-invalid:required.mui--is-not-empty,.mui-textfield>textarea:not(:focus).mui--is-invalid:required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield>textarea:not(:focus).mui--is-invalid:required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty){border-color:#F44336;border-width:2px}.mui-textfield>input:invalid:not(:focus):not(:required),.mui-textfield>input:invalid:not(:focus):required.mui--is-empty.mui--is-dirty,.mui-textfield>input:invalid:not(:focus):required.mui--is-not-empty,.mui-textfield>input:invalid:not(:focus):required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield>input:invalid:not(:focus):required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield>input:not(:focus).mui--is-invalid:not(:required),.mui-textfield>input:not(:focus).mui--is-invalid:required.mui--is-empty.mui--is-dirty,.mui-textfield>input:not(:focus).mui--is-invalid:required.mui--is-not-empty,.mui-textfield>input:not(:focus).mui--is-invalid:required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty),.mui-textfield>input:not(:focus).mui--is-invalid:required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty){height:33px;margin-bottom:-1px}.mui-textfield>input:invalid:not(:focus):not(:required)~label,.mui-textfield>input:invalid:not(:focus):required.mui--is-not-empty~label,.mui-textfield>input:invalid:not(:focus):required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty)~label,.mui-textfield>input:invalid:not(:focus):required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty)~label,.mui-textfield>input:not(:focus).mui--is-invalid:not(:required)~label,.mui-textfield>input:not(:focus).mui--is-invalid:required.mui--is-not-empty~label,.mui-textfield>input:not(:focus).mui--is-invalid:required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty)~label,.mui-textfield>input:not(:focus).mui--is-invalid:required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty)~label,.mui-textfield>textarea:invalid:not(:focus):not(:required)~label,.mui-textfield>textarea:invalid:not(:focus):required.mui--is-not-empty~label,.mui-textfield>textarea:invalid:not(:focus):required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty)~label,.mui-textfield>textarea:invalid:not(:focus):required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty)~label,.mui-textfield>textarea:not(:focus).mui--is-invalid:not(:required)~label,.mui-textfield>textarea:not(:focus).mui--is-invalid:required.mui--is-not-empty~label,.mui-textfield>textarea:not(:focus).mui--is-invalid:required:not(:empty):not(.mui--is-empty):not(.mui--is-not-empty)~label,.mui-textfield>textarea:not(:focus).mui--is-invalid:required[value]:not([value=""]):not(.mui--is-empty):not(.mui--is-not-empty)~label{color:#F44336}.mui-textfield:not(.mui-textfield--float-label)>input:invalid:not(:focus):required.mui--is-empty.mui--is-dirty~label,.mui-textfield:not(.mui-textfield--float-label)>input:not(:focus).mui--is-invalid:required.mui--is-empty.mui--is-dirty~label,.mui-textfield:not(.mui-textfield--float-label)>textarea:invalid:not(:focus):required.mui--is-empty.mui--is-dirty~label,.mui-textfield:not(.mui-textfield--float-label)>textarea:not(:focus).mui--is-invalid:required.mui--is-empty.mui--is-dirty~label{color:#F44336}@keyframes mui-node-inserted{from{opacity:.99}to{opacity:1}}.mui--no-transition{transition:none!important}.mui--no-user-select{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mui-caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.mui--text-left{text-align:left!important}.mui--text-right{text-align:right!important}.mui--text-center{text-align:center!important}.mui--text-justify{text-align:justify!important}.mui--text-nowrap{white-space:nowrap!important}.mui--align-baseline{vertical-align:baseline!important}.mui--align-top{vertical-align:top!important}.mui--align-middle{vertical-align:middle!important}.mui--align-bottom{vertical-align:bottom!important}.mui--text-dark{color:rgba(0,0,0,.87)}.mui--text-dark-secondary{color:rgba(0,0,0,.54)}.mui--text-dark-hint{color:rgba(0,0,0,.38)}.mui--text-light{color:#FFF}.mui--text-light-secondary{color:rgba(255,255,255,.7)}.mui--text-light-hint{color:rgba(255,255,255,.3)}.mui--text-accent{color:rgba(255,64,129,.87)}.mui--text-accent-secondary{color:rgba(255,64,129,.54)}.mui--text-accent-hint{color:rgba(255,64,129,.38)}.mui--text-black{color:#000}.mui--text-white{color:#FFF}.mui--text-danger{color:#F44336}.mui--bg-primary{background-color:#2196F3}.mui--bg-primary-dark{background-color:#1976D2}.mui--bg-primary-light{background-color:#BBDEFB}.mui--bg-accent{background-color:#FF4081}.mui--bg-accent-dark{background-color:#F50057}.mui--bg-accent-light{background-color:#FF80AB}.mui--bg-danger{background-color:#F44336}.mui-list--unstyled{padding-left:0;list-style:none}.mui-list--inline{padding-left:0;list-style:none;margin-left:-5px}.mui-list--inline>li{display:inline-block;padding-left:5px;padding-right:5px}.mui--z1,.mui-dropdown__menu,.mui-select__menu{box-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24)}.mui--z2{box-shadow:0 3px 6px rgba(0,0,0,.16),0 3px 6px rgba(0,0,0,.23)}.mui--z3{box-shadow:0 10px 20px rgba(0,0,0,.19),0 6px 6px rgba(0,0,0,.23)}.mui--z4{box-shadow:0 14px 28px rgba(0,0,0,.25),0 10px 10px rgba(0,0,0,.22)}.mui--z5{box-shadow:0 19px 38px rgba(0,0,0,.3),0 15px 12px rgba(0,0,0,.22)}.mui--clearfix:after,.mui--clearfix:before{content:" ";display:table}.mui--clearfix:after{clear:both}.mui--pull-right{float:right!important}.mui--pull-left{float:left!important}.mui--hide{display:none!important}.mui--show{display:block!important}.mui--invisible{visibility:hidden}.mui--overflow-hidden{overflow:hidden!important}.mui--overflow-hidden-x{overflow-x:hidden!important}.mui--overflow-hidden-y{overflow-y:hidden!important}.mui--visible-lg-block,.mui--visible-lg-inline,.mui--visible-lg-inline-block,.mui--visible-md-block,.mui--visible-md-inline,.mui--visible-md-inline-block,.mui--visible-sm-block,.mui--visible-sm-inline,.mui--visible-sm-inline-block,.mui--visible-xl-block,.mui--visible-xl-inline,.mui--visible-xl-inline-block,.mui--visible-xs-block,.mui--visible-xs-inline,.mui--visible-xs-inline-block{display:none!important}@media (max-width:543px){.mui-visible-xs{display:block!important}table.mui-visible-xs{display:table}tr.mui-visible-xs{display:table-row!important}td.mui-visible-xs,th.mui-visible-xs{display:table-cell!important}.mui--visible-xs-block{display:block!important}.mui--visible-xs-inline{display:inline!important}.mui--visible-xs-inline-block{display:inline-block!important}}@media (min-width:544px) and (max-width:767px){.mui-visible-sm{display:block!important}table.mui-visible-sm{display:table}tr.mui-visible-sm{display:table-row!important}td.mui-visible-sm,th.mui-visible-sm{display:table-cell!important}.mui--visible-sm-block{display:block!important}.mui--visible-sm-inline{display:inline!important}.mui--visible-sm-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.mui-visible-md{display:block!important}table.mui-visible-md{display:table}tr.mui-visible-md{display:table-row!important}td.mui-visible-md,th.mui-visible-md{display:table-cell!important}.mui--visible-md-block{display:block!important}.mui--visible-md-inline{display:inline!important}.mui--visible-md-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.mui-visible-lg{display:block!important}table.mui-visible-lg{display:table}tr.mui-visible-lg{display:table-row!important}td.mui-visible-lg,th.mui-visible-lg{display:table-cell!important}.mui--visible-lg-block{display:block!important}.mui--visible-lg-inline{display:inline!important}.mui--visible-lg-inline-block{display:inline-block!important}}@media (min-width:1200px){.mui-visible-xl{display:block!important}table.mui-visible-xl{display:table}tr.mui-visible-xl{display:table-row!important}td.mui-visible-xl,th.mui-visible-xl{display:table-cell!important}.mui--visible-xl-block{display:block!important}.mui--visible-xl-inline{display:inline!important}.mui--visible-xl-inline-block{display:inline-block!important}}@media (max-width:543px){.mui--hidden-xs{display:none!important}}@media (min-width:544px) and (max-width:767px){.mui--hidden-sm{display:none!important}}@media (min-width:768px) and (max-width:991px){.mui--hidden-md{display:none!important}}@media (min-width:992px) and (max-width:1199px){.mui--hidden-lg{display:none!important}}@media (min-width:1200px){.mui--hidden-xl{display:none!important}}body.mui-body--scroll-lock{overflow:hidden!important}#mui-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:99999999;background-color:rgba(0,0,0,.2);overflow:auto}.mui-ripple-effect{position:absolute;border-radius:50%;pointer-events:none;opacity:.4;transform:scale(.0001)}.mui-ripple-effect.mui--animate-in{opacity:0;transform:scale(1);transition:transform .3s cubic-bezier(0,0,.2,1),opacity .6s cubic-bezier(0,0,.2,1)}.mui-ripple-effect.mui--active{opacity:.3}.mui-ripple-effect.mui--animate-out{opacity:0;transition:opacity .6s cubic-bezier(0,0,.2,1)}.mui-btn>.mui-ripple-effect{background-color:#a6a6a6}.mui-btn--primary>.mui-ripple-effect{background-color:#FFF}.mui-btn--dark>.mui-ripple-effect{background-color:#FFF}.mui-btn--danger>.mui-ripple-effect{background-color:#FFF}.mui-btn--accent>.mui-ripple-effect{background-color:#FFF}.mui-btn--flat>.mui-ripple-effect{background-color:#a6a6a6}.mui--text-display4{font-weight:300;font-size:112px;line-height:112px}.mui--text-display3{font-weight:400;font-size:56px;line-height:56px}.mui--text-display2{font-weight:400;font-size:45px;line-height:48px}.mui--text-display1,h1{font-weight:400;font-size:34px;line-height:40px}.mui--text-headline,h2{font-weight:400;font-size:24px;line-height:32px}.mui--text-title,h3{font-weight:400;font-size:20px;line-height:28px}.mui--text-subhead,h4{font-weight:400;font-size:16px;line-height:24px}.mui--text-body2,h5{font-weight:500;font-size:14px;line-height:24px}.mui--text-body1{font-weight:400;font-size:14px;line-height:20px}.mui--text-caption{font-weight:400;font-size:12px;line-height:16px}.mui--text-menu{font-weight:500;font-size:13px;line-height:17px}.mui--text-button{font-weight:500;font-size:14px;line-height:18px;text-transform:uppercase} diff --git a/styles/style.css b/styles/style.css index 6dd8f9f..402183f 100644 --- a/styles/style.css +++ b/styles/style.css @@ -1,247 +1,431 @@ body { - font-family: verdana, sans serif; - font-size: small; - padding: 0px; - margin: 0px; - background: #FFF; - visibility: hidden; - -moz-user-select: -moz-none; - -khtml-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; + font-family: verdana, sans serif; + font-size: 12px; + padding: 0px; + margin: 0px; + background: #FFF; + visibility: hidden; + -moz-user-select: -moz-none; + -khtml-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; } -#area { - position: relative; - background: transparent url(../images/back.png); - width: 3000px; - height: 3000px; +.mui-btn { + line-height: 0px; } -#controls { - position: absolute; - left: 0px; - top: 0px; +.mui-btn--tiny { + height: 26px; + line-height: 26px; + min-width: 26px; + padding: 0 8px; + font-size: 11px; } - -#bar { - text-align: center; - background-color: #ccc; - position: fixed; - top: 0px; - right: 0px; - width: 150px; - padding: 0px 5px 5px; - -moz-box-shadow: -4px 4px 8px #888; /* FF 3.5+ */ - -webkit-box-shadow: -4px 4px 8px #888; /* Safari 3.0+, Chrome */ - box-shadow: -4px 4px 8px #888; /* Opera 10.5, IE 9.0 */ - filter: progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=215, Color='#888888'); /* IE 6, IE 7 */ - -ms-filter: "progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=215, Color='#888888')"; /* IE 8 */ +.mui-btn+.mui-btn.mui-btn--tiny { + margin-left: 4px; } -#bar input { - display: block; - width: 90%; - margin: auto; +::-webkit-scrollbar { + width: 8px; + height: 8px; } -#bar input.small { - width: 45%; - display: inline; +/* Track */ +::-webkit-scrollbar-track { + border-radius: 0px; + background: rgba(125,125,125,0.3); +} +::-webkit-scrollbar-track:hover { + background: rgba(125,125,125,0.5); } -#toggle { - padding: 5px 0px; - margin-bottom: 5px; - cursor: pointer; - background-position: 50% 5px; - background-repeat: no-repeat; - height: 5px; +/* Handle */ +::-webkit-scrollbar-thumb { + border-radius: 0px; + background: rgba(0,0,0,0.4); +} +::-webkit-scrollbar-thumb:hover { + background: rgba(0,0,0,0.7); +} +::-webkit-scrollbar-thumb:active { + background: rgba(0,0,0,0.8); +} +::-webkit-scrollbar-thumb:window-inactive { + background: rgba(0,0,0,0.1); } -#toggle:hover { - background-color: #bbb; +#area { + position: relative; + background: transparent url(../images/back_dim.png); + opacity: 0.7; + width: 3000px; + height: 3000px; } -#toggle.on { - background-image: url(../images/up.gif); +#controls { + position: absolute; + left: 0px; + top: 0px; } -#toggle.off { - background-image: url(../images/down.gif); +#bar { + text-align: center; + position: fixed; + bottom: 0; + left: 0; + /*width: 100%;*/ + -webkit-transition: -webkit-transform 400ms cubic-bezier(0.23, 1, 0.32, 1); + transition: -webkit-transform 400ms cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 400ms cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 400ms cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 400ms cubic-bezier(0.23, 1, 0.32, 1); +} + +#sub_bar { + width: 782px; + margin: 0 auto; + /*padding-bottom: 6px;*/ + overflow: hidden; +} + +#bar div.holder { + overflow: hidden; + float: left; + padding-left: 4.5px; + padding-right: 4.5px; +} + +#bar button { + width: 45px; + height: 45px; + float: left; + line-height: normal; + padding: 0; +} + +#bar button.small { + height: 20px; + float: none; + margin: 6px; + display: block; +} + +#toogle_min { + position: fixed; + bottom: 0px; + z-index: 200; + -webkit-transition: -webkit-transform 400ms cubic-bezier(0.23, 1, 0.32, 1); + transition: -webkit-transform 400ms cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 400ms cubic-bezier(0.23, 1, 0.32, 1); + transition: transform 400ms cubic-bezier(0.23, 1, 0.32, 1), -webkit-transform 400ms cubic-bezier(0.23, 1, 0.32, 1); + -webkit-transform: translate(0px, -160px); + transform: translate(0px, -160px); +} + +#snackbar { + position: fixed; + top: 0; + left: 42%; + min-width: 288px; + max-width: 568px; + border-radius: 2px; + background-color: #323232; + padding: 0px 24px; + height: 48px; + -webkit-transition: -webkit-transform 400ms cubic-bezier(0.23, 1, 0.32, 1) 0ms; + transition: -webkit-transform 400ms cubic-bezier(0.23, 1, 0.32, 1) 0ms; + transition: transform 400ms cubic-bezier(0.23, 1, 0.32, 1) 0ms; + transition: transform 400ms cubic-bezier(0.23, 1, 0.32, 1) 0ms, -webkit-transform 400ms cubic-bezier(0.23, 1, 0.32, 1) 0ms; + -webkit-transform: translate(0px, -48px); + transform: translate(0px, -48px); +} +#snackbar>p { + font-size: 14px; + color: rgb(255, 255, 255); + opacity: 1; + height: 48px; + line-height: 48px; + margin: 0; + padding: 0; +} + +#minimapcontainer { + position: fixed; + width: 100px; + right: 5px; + top: 5px; } #minimap { - position: fixed; - width: 100px; - height: 100px; - right: 0px; - bottom: 0px; - background-color: #fff; - border: 1px solid #000; - opacity: 0.9; - overflow: hidden; + position: relative; + width: 100px; + height: 100px; + z-index: 1; + float: right; + background-color: #fff; + /*border: 1px solid #000;*/ + opacity: 0.9; + overflow: hidden; +} +#minimapbuttons { + -webkit-transform: translateY(-40px); + transform: translateY(-40px); + opacity: 0; + -webkit-transition: opacity .3s cubic-bezier(0.23, 1, 0.32, 1), + -webkit-transform .3s cubic-bezier(0.23, 1, 0.32, 1); + transition: opacity .3s cubic-bezier(0.23, 1, 0.32, 1), + -webkit-transform .3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform .3s cubic-bezier(0.23, 1, 0.32, 1), + opacity .3s cubic-bezier(0.23, 1, 0.32, 1); + transition: transform .3s cubic-bezier(0.23, 1, 0.32, 1), + opacity .3s cubic-bezier(0.23, 1, 0.32, 1), + -webkit-transform .3s cubic-bezier(0.23, 1, 0.32, 1); +} +#zoomlevel { + position: absolute; + font-size: 8px; + left: 2px; + bottom: 0; + margin: 0; } - .mini { - position: absolute; - border: 1px solid #000; - background-color: #eea; - font-size: 1px; - line-height: 1px; + position: absolute; + /*border: 1px solid #000;*/ + background-color: #ff8fb5; + font-size: 1px; + line-height: 1px; } .mini_selected { - background-color: #f85; + background-color: #de2665; } .port { - position: absolute; - border: 2px solid #f00; + position: absolute; + border: 2px solid rgba(0,0,0,.3); + -webkit-transition: background-color 300ms; + transition: background-color 300ms; } .table { - position: absolute; - border: 1px solid #000; - background-color: #ddd; - cursor: pointer; - -moz-box-shadow: 4px 4px 8px #888; /* FF 3.5+ */ - -webkit-box-shadow: 4px 4px 8px #888; /* Safari 3.0+, Chrome */ - box-shadow: 4px 4px 8px #888; /* Opera 10.5, IE 9.0 */ - filter: progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=135, Color='#888888'); /* IE 6, IE 7 */ - -ms-filter: progid:DXImageTransform.Microsoft.Shadow(Strength=5, Direction=135, Color='#888888'); /* IE 8 */ - border-radius: 3px; + position: absolute; + padding: 0 6px 6px 6px; + cursor: pointer; } .table table { - border-collapse: collapse; + border-collapse: collapse; } .table.selected { - border: 2px solid #000; + /*background-color: whitesmoke;*/ + border: 1px solid #FF4081; } .table thead .title { - text-align: center; - padding: 3px 30px; + text-align: center; + padding: 6px 30px; + /*font-weight: 700;*/ } .table tbody { - border-top: 1px dotted #888; + border-right: 4px solid rgba(0,0,0,.12); +} + +.table tbody.selected { + border-right: 6px solid rgba(0,0,0,.12); + background-color: whitesmoke; +} + +.table tbody td .mui-select__menu { + height: 400px !important; + top: -150px !important; } .table tbody td { - padding: 3px; + padding: 3px 10px !important; +} + +.table tbody td div.mui-textfield, .table tbody td div.mui-select, .table tbody td div.mui-checkbox { + padding-top: 2px !important; + margin-bottom: 0 !important; } .table tbody .selected { - font-weight: bold; - color: #f00; - display: inline-block; + font-weight: bold; + color: #f00; + display: inline-block; } .table tbody .title { - display: inline-block; + display: inline-block; } .primary { - font-weight: bold; + font-weight: bold; } .key { - font-style: italic; + font-style: italic; } .primary.key { - font-style: normal; + font-style: normal; } .typehint { - font-size: 80%; - color: gray; + font-size: 80%; + color: gray; } .comment { - font-size: 80%; - font-weight: normal; - margin-right: 0.5em; + font-size: 80%; + font-weight: normal; + margin-right: 0.5em; } .adding { - cursor: crosshair; + cursor: crosshair; } .relation { - overflow: hidden; + overflow: hidden; + cursor: pointer } #background { - position: absolute; - background-color: #000; - opacity: 0.5; - visibility: hidden; + position: absolute; + background-color: #000; + opacity: 0.5; + -webkit-transition: opacity 200ms; + transition: opacity 200ms; + visibility: hidden; } #window { - position: absolute; - visibility: hidden; - background-color: #fff; - border: 6px double #333; + position: fixed; + visibility: hidden; + border-radius: 2px; + max-width: 960px; + -webkit-transition: opacity 200ms; + transition: opacity 200ms; } -#windowtitle { - border-bottom: 2px solid #333; - padding: 2px; - padding-left: 1em; - font-weight: bold; - background-color: rgb(238, 238, 170); +#keys button.small { + width: 30px; + padding: 0; + height: 24px; + line-height: 0; } -#windowcontent { - padding: 1em; +#windowtitle { + margin-top: 15px; + margin-bottom: 24px; } -#windowok, #windowcancel { - margin: 0em 1em 1em; +#windowcontrol { + padding-top: 15px; } - -.small { - font-size: 85%; +#windowcontrol button { + float: right; } - #textarea { - width: 650px; - height: 200px; -} - -#opts { - width: 700px; -} - -#keys { - white-space: nowrap; - text-align: center; -} - -legend { - font-weight: bold; -} - -label, input, select { - vertical-align: middle; + width: 100%; + height: 200px; } #throbber { - position: absolute; - top: 2px; - right: 3px; + position: absolute; + top: 2px; + right: 3px; } #rubberband { - position: absolute; - border: 1px solid #000; - background: #888; - opacity: 0.5; - visibility: hidden; -} + position: absolute; + border: .2px solid #FF4081; + background: rgba(255, 64, 129, 0.5); + opacity: 0.5; + visibility: hidden; +} + +#menu { + position: fixed; + top: 12px; + left: 12px; +} + +#menu>button { + margin: 0; + padding: 0 6px; +} + +#menu input { + margin: 0 auto; + display: block; +} +#menu li button { + width: 100%; +} + +.tooltip { + -webkit-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: top center; + transform-origin: top center; + z-index: 999; + background: rgba(97,97,97,.9); + border-radius: 2px; + color: #fff; + display: inline-block; + font-size: 10px; + font-weight: 500; + line-height: 14px; + max-width: 170px; + position: fixed; + top: -500px; + left: -500px; + padding: 8px; + text-align: center; +} +.tooltip.is-active { + -webkit-animation: pulse 200ms cubic-bezier(0,0,.2,1); + animation: pulse 200ms cubic-bezier(0,0,.2,1); + -webkit-animation-fill-mode: forwards; + animation-fill-mode: forwards; +} +@-webkit-keyframes pulse { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + opacity: 0; + } + + 50% { + -webkit-transform: scale(.99); + transform: scale(.99); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + visibility: visible; + } +} +@keyframes pulse { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + opacity: 0; + } + + 50% { + -webkit-transform: scale(.99); + transform: scale(.99); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + visibility: visible; + } +} \ No newline at end of file