From 1d4dcbd2b0890113ed0083dc6b554afb514b7c5a Mon Sep 17 00:00:00 2001 From: abijah Date: Fri, 28 Aug 2009 01:42:29 +0000 Subject: [PATCH 01/11] Made changes to the database and added models to support options. Next is permissions git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@797 97e9348a-65ac-dc4b-aefc-98561f571b83 --- db/schema.sql | 326 +++++++++++++++++-------- db/scratch.sql | 419 +++++++++++++++++++++++++++++++++ site/.htaccess | 4 +- site/app_model.php | 55 +++-- site/models/default_option.php | 21 ++ site/models/group.php | 38 +++ site/models/group_option.php | 25 ++ site/models/membership.php | 37 +++ site/models/option.php | 62 +++++ site/models/option_value.php | 35 +++ site/models/site.php | 39 ++- site/models/site_option.php | 24 ++ site/models/user.php | 37 +++ site/models/user_option.php | 24 ++ 14 files changed, 1027 insertions(+), 119 deletions(-) create mode 100644 site/models/default_option.php create mode 100644 site/models/group.php create mode 100644 site/models/group_option.php create mode 100644 site/models/membership.php create mode 100644 site/models/option.php create mode 100644 site/models/option_value.php create mode 100644 site/models/site_option.php create mode 100644 site/models/user.php create mode 100644 site/models/user_option.php diff --git a/db/schema.sql b/db/schema.sql index fbe02a9..8c6814a 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -25,9 +25,9 @@ -- REVISIT : 20090511 -- By not specifying the database, the script can -- make the determination of which one to use. --- DROP DATABASE IF EXISTS `property_manager`; --- CREATE DATABASE `property_manager`; --- USE `property_manager`; +DROP DATABASE IF EXISTS `property_manager`; +CREATE DATABASE `property_manager`; +USE `property_manager`; -- ###################################################################### @@ -241,7 +241,7 @@ CREATE TABLE `pmgr_contacts_methods` ( -- ###################################################################### -- ###################################################################### -- ## --- ## GROUPS +-- ## GROUPS / USERS -- ## @@ -256,59 +256,15 @@ CREATE TABLE `pmgr_groups` ( -- code may not be userful `code` VARCHAR(12) NOT NULL, -- User style "id" `name` VARCHAR(80) NOT NULL, + + -- Lower ranks are given higher priority + `rank` SMALLINT UNSIGNED NOT NULL DEFAULT 100, `comment` VARCHAR(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_group_options - -DROP TABLE IF EXISTS `pmgr_group_options`; -CREATE TABLE `pmgr_group_options` ( - `group_id` INT(10) UNSIGNED NOT NULL, - `name` VARCHAR(50) NOT NULL, - `value` VARCHAR(255) NOT NULL, - `comment` VARCHAR(255) DEFAULT NULL, - - PRIMARY KEY (`group_id`, `name`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_group_permissions - -DROP TABLE IF EXISTS `pmgr_group_permissions`; -CREATE TABLE `pmgr_group_permissions` ( - `group_id` INT(10) UNSIGNED NOT NULL, - `name` CHAR(30) NOT NULL, - `access` ENUM('ALLOWED', - 'DENIED', - 'FORCED') - NOT NULL DEFAULT 'ALLOWED', - `comment` VARCHAR(255) DEFAULT NULL, - - PRIMARY KEY (`group_id`, `name`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - - --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ## --- ## USERS --- ## - -- ---------------------------------------------------------------------- -- ---------------------------------------------------------------------- @@ -334,18 +290,208 @@ CREATE TABLE `pmgr_users` ( ) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ## +-- ## OPTIONS +-- ## + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_options + +DROP TABLE IF EXISTS `pmgr_options`; +CREATE TABLE `pmgr_options` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `name` VARCHAR(50) NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + UNIQUE KEY `name_key` (`name`), + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_option_values + +DROP TABLE IF EXISTS `pmgr_option_values`; +CREATE TABLE `pmgr_option_values` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `option_id` INT(10) UNSIGNED NOT NULL, + `value` VARCHAR(255) NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_default_options + +DROP TABLE IF EXISTS `pmgr_default_options`; +CREATE TABLE `pmgr_default_options` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `option_value_id` INT(10) UNSIGNED NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_group_options + +DROP TABLE IF EXISTS `pmgr_group_options`; +CREATE TABLE `pmgr_group_options` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `group_id` INT(10) UNSIGNED NOT NULL, + `option_value_id` INT(10) UNSIGNED NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + KEY `group_key` (`group_id`), + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + -- ---------------------------------------------------------------------- -- ---------------------------------------------------------------------- -- TABLE pmgr_user_options DROP TABLE IF EXISTS `pmgr_user_options`; CREATE TABLE `pmgr_user_options` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` INT(10) UNSIGNED NOT NULL, - `name` VARCHAR(50) NOT NULL, - `value` VARCHAR(255) NOT NULL, + `option_value_id` INT(10) UNSIGNED NOT NULL, `comment` VARCHAR(255) DEFAULT NULL, + KEY `user_key` (`user_id`), + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; - PRIMARY KEY (`user_id`, `name`) + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_site_options + +DROP TABLE IF EXISTS `pmgr_site_options`; +CREATE TABLE `pmgr_site_options` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `site_id` INT(10) UNSIGNED NOT NULL, + `option_value_id` INT(10) UNSIGNED NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + KEY `site_key` (`site_id`), + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + + + +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ## +-- ## PERMISSIONS +-- ## + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_permissions + +DROP TABLE IF EXISTS `pmgr_permissions`; +CREATE TABLE `pmgr_permissions` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `name` VARCHAR(50) NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + UNIQUE KEY `name_key` (`name`), + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_permission_values + +DROP TABLE IF EXISTS `pmgr_permission_values`; +CREATE TABLE `pmgr_permission_values` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `permission_id` INT(10) UNSIGNED NOT NULL, + `access` ENUM('ALLOW', + 'DENY') + NOT NULL DEFAULT 'DENY', + `level` SMALLINT UNSIGNED DEFAULT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_default_permissions + +DROP TABLE IF EXISTS `pmgr_default_permissions`; +CREATE TABLE `pmgr_default_permissions` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `permission_value_id` INT(10) UNSIGNED NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_group_permissions + +DROP TABLE IF EXISTS `pmgr_group_permissions`; +CREATE TABLE `pmgr_group_permissions` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `group_id` INT(10) UNSIGNED NOT NULL, + `permission_value_id` INT(10) UNSIGNED NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + KEY `group_key` (`group_id`), + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_user_permissions + +DROP TABLE IF EXISTS `pmgr_user_permissions`; +CREATE TABLE `pmgr_user_permissions` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `user_id` INT(10) UNSIGNED NOT NULL, + `permission_value_id` INT(10) UNSIGNED NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + KEY `user_key` (`user_id`), + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_site_permissions + +DROP TABLE IF EXISTS `pmgr_site_permissions`; +CREATE TABLE `pmgr_site_permissions` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `site_id` INT(10) UNSIGNED NOT NULL, + `permission_value_id` INT(10) UNSIGNED NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + KEY `site_key` (`site_id`), + PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; @@ -380,46 +526,6 @@ CREATE TABLE `pmgr_sites` ( ) ENGINE=MyISAM DEFAULT CHARSET=utf8; --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_site_options - -DROP TABLE IF EXISTS `pmgr_site_options`; -CREATE TABLE `pmgr_site_options` ( - `site_id` INT(10) UNSIGNED NOT NULL, - `name` VARCHAR(50) NOT NULL, - `value` VARCHAR(255) NOT NULL, - `comment` VARCHAR(255) DEFAULT NULL, - - PRIMARY KEY (`site_id`, `name`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_site_memberships --- --- Which users are allowed to access which sites, --- and under which set of group permissions (possibly multiple) - --- SELECT U.id, P.name, MAX(P.access) --- FROM pmgr_users U --- LEFT JOIN pmgr_site_membership M ON M.user_id = U.id --- LEFT JOIN pmgr_groups G ON G.id = M.group_id --- LEFT JOIN pmgr_group_permissions P ON P.group_id = G.id --- GROUP BY U.id, P.name - -DROP TABLE IF EXISTS `pmgr_site_memberships`; -CREATE TABLE `pmgr_site_memberships` ( - `site_id` INT(10) UNSIGNED NOT NULL, - `user_id` INT(10) UNSIGNED NOT NULL, - `group_id` INT(10) UNSIGNED NOT NULL, - `comment` VARCHAR(255) DEFAULT NULL, - - PRIMARY KEY (`site_id`, `user_id`, `group_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - -- ---------------------------------------------------------------------- -- ---------------------------------------------------------------------- -- TABLE pmgr_site_areas @@ -437,6 +543,38 @@ CREATE TABLE `pmgr_site_areas` ( +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ## +-- ## MEMBERSHIPS +-- ## + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_memberships +-- +-- Which users are allowed to access which sites, +-- and under which set of group permissions (possibly multiple) + +DROP TABLE IF EXISTS `pmgr_memberships`; +CREATE TABLE `pmgr_memberships` ( + `site_id` INT(10) UNSIGNED NOT NULL, + `user_id` INT(10) UNSIGNED NOT NULL, + `group_id` INT(10) UNSIGNED NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + + PRIMARY KEY (`site_id`, `user_id`, `group_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + -- ###################################################################### -- ###################################################################### -- ###################################################################### diff --git a/db/scratch.sql b/db/scratch.sql index 2279ce7..27191ee 100644 --- a/db/scratch.sql +++ b/db/scratch.sql @@ -157,3 +157,422 @@ WHERE -- catch other types not considered in this query OR T.type NOT IN ('RECEIPT', 'CREDIT_NOTE', 'INVOICE', 'PAYMENT') + + + +-- ################################################################# +-- ################################################################# +-- ################################################################# +-- ################################################################# +-- ################################################################# +-- ################################################################# +-- ################################################################# +-- ################################################################# +-- ################################################################# +-- ## USER / GROUP + +INSERT INTO pmgr_groups (`code`, `name`, `rank`) + VALUES('Owner', 'Owner Group', 25); +SET @o_gid = LAST_INSERT_ID(); + +INSERT INTO pmgr_groups (`code`, `name`, `rank`) + VALUES('Admin', 'Admin Group', 50); +SET @a_gid = LAST_INSERT_ID(); + +INSERT INTO pmgr_groups (`code`, `name`, `rank`) + VALUES('Manager', 'Manager Group', 75); +SET @m_gid = LAST_INSERT_ID(); + +INSERT INTO pmgr_groups (`code`, `name`) + VALUES('Temp', 'Temporary Help'); +SET @t_gid = LAST_INSERT_ID(); + +INSERT INTO pmgr_users (`code`, `login`, `contact_id`) + VALUES('AP', 'abijah', 0); +SET @a_uid = LAST_INSERT_ID(); + +INSERT INTO pmgr_users (`code`, `login`, `contact_id`) + VALUES('SK', 'shirley', 0); +SET @s_uid = LAST_INSERT_ID(); + +INSERT INTO pmgr_users (`code`, `login`, `contact_id`) + VALUES('DE', 'dan', 0); +SET @d_uid = LAST_INSERT_ID(); + +INSERT INTO pmgr_users (`code`, `login`, `contact_id`) + VALUES('KD', 'kevin', 0); +SET @k_uid = LAST_INSERT_ID(); + +INSERT INTO pmgr_sites (`code`, `name`) + VALUES('VSS', 'Valley Storage'); +SET @v_sid = LAST_INSERT_ID(); + +INSERT INTO pmgr_sites (`code`, `name`) + VALUES('FAKE', 'Fake Site'); +SET @f_sid = LAST_INSERT_ID(); + +-- Site Membership + +INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`) + VALUES(@v_sid, @a_uid, @o_gid); +INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`) + VALUES(@v_sid, @a_uid, @a_gid); +INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`) + VALUES(@v_sid, @a_uid, @m_gid); +INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`) + VALUES(@v_sid, @s_uid, @m_gid); +INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`) + VALUES(@v_sid, @d_uid, @t_gid); +INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`) + VALUES(@f_sid, @s_uid, @a_gid); +INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`) + VALUES(@f_sid, @s_uid, @m_gid); +INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`) + VALUES(@f_sid, @k_uid, @o_gid); +INSERT INTO pmgr_site_memberships (`site_id`, `user_id`, `group_id`) + VALUES(@f_sid, @d_uid, @t_gid); + + +-- Options + +INSERT INTO pmgr_options (`name`) VALUES ('theme'); +SET @t_oid = LAST_INSERT_ID(); +INSERT INTO pmgr_options (`name`) VALUES ('menu'); +SET @m_oid = LAST_INSERT_ID(); + +-- Default Option Values + +INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@t_oid, 'blue'); +INSERT INTO pmgr_default_options (`option_value_id`) VALUES(LAST_INSERT_ID()); +INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@m_oid, 'basic'); +INSERT INTO pmgr_default_options (`option_value_id`) VALUES(LAST_INSERT_ID()); + +-- Group options + +INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@t_oid, 'gold'); +INSERT INTO pmgr_group_options (`group_id`, `option_value_id`) + VALUES(@o_gid, LAST_INSERT_ID()); +INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@t_oid, 'silver'); +INSERT INTO pmgr_group_options (`group_id`, `option_value_id`) + VALUES(@a_gid, LAST_INSERT_ID()); +INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@t_oid, 'red'); +INSERT INTO pmgr_group_options (`group_id`, `option_value_id`) + VALUES(@m_gid, LAST_INSERT_ID()); + +INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@m_oid, 'advanced'); +INSERT INTO pmgr_group_options (`group_id`, `option_value_id`) + VALUES(@o_gid, LAST_INSERT_ID()); +INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@m_oid, 'advanced'); +INSERT INTO pmgr_group_options (`group_id`, `option_value_id`) + VALUES(@a_gid, LAST_INSERT_ID()); +INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@m_oid, 'restricted'); +INSERT INTO pmgr_group_options (`group_id`, `option_value_id`) + VALUES(@t_gid, LAST_INSERT_ID()); + +-- User Options +INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@m_oid, 'special'); +INSERT INTO pmgr_user_options (`user_id`, `option_value_id`) + VALUES(@s_uid, LAST_INSERT_ID()); + +-- Site Options +INSERT INTO pmgr_option_values (`option_id`, `value`) VALUES (@t_oid, 'site-theme'); +INSERT INTO pmgr_site_options (`site_id`, `option_value_id`) + VALUES(@f_sid, LAST_INSERT_ID()); + + +-- SELECT U.id, P.name, MAX(P.access) +-- FROM pmgr_users U +-- LEFT JOIN pmgr_site_membership M ON M.user_id = U.id +-- LEFT JOIN pmgr_groups G ON G.id = M.group_id +-- LEFT JOIN pmgr_group_permissions P ON P.group_id = G.id +-- GROUP BY U.id, P.name + + +-- User access to site +SELECT U.id, U.login, COUNT(G.id) AS 'groups', MIN(G.rank) AS highest_rank + FROM pmgr_users U + JOIN pmgr_site_memberships M ON M.user_id = U.id + JOIN pmgr_sites S ON S.id = M.site_id + JOIN pmgr_groups G ON G.id = M.group_id +WHERE S.code = 'VSS' +GROUP BY U.id + + +-- User Options +SELECT O.id, O.name, O.default, + GROUP_CONCAT(Uopt.value) AS 'value', COUNT(U.id) AS 'count' + FROM pmgr_options O + LEFT JOIN pmgr_user_options Uopt ON Uopt.option_id = O.id + LEFT JOIN pmgr_users U ON U.id = Uopt.user_id +WHERE U.id = 1 +GROUP BY O.id + +-- Group Options +SELECT O.id, O.name, O.default, + GROUP_CONCAT(Gopt.value) AS 'value', COUNT(G.id) AS 'count' + FROM pmgr_options O + LEFT JOIN pmgr_group_options Gopt ON Gopt.option_id = O.id + LEFT JOIN pmgr_groups G ON G.id = Gopt.group_id +WHERE G.id = 1 +GROUP BY O.id + + +-- Site Options +SELECT O.id, O.name, O.default, + GROUP_CONCAT(Sopt.value) AS 'value', COUNT(S.id) AS 'count' + FROM pmgr_options O + LEFT JOIN pmgr_site_options Sopt ON Sopt.option_id = O.id + LEFT JOIN pmgr_sites S ON S.id = Sopt.site_id +WHERE S.id = 1 +GROUP BY O.id + + +-- Option value for member & site +SELECT O.id, O.name, O.default, + S.id AS site_id, Sopt.value, + G.id AS group_id, Gopt.value, + U.id AS user_id, Uopt.value + FROM pmgr_options O + LEFT JOIN pmgr_site_options Sopt ON Sopt.option_id = O.id + LEFT JOIN pmgr_sites S ON S.id = Sopt.site_id + LEFT JOIN pmgr_group_options Gopt ON Gopt.option_id = O.id + LEFT JOIN pmgr_groups G ON G.id = Gopt.group_id + LEFT JOIN pmgr_user_options Uopt ON Uopt.option_id = O.id + LEFT JOIN pmgr_users U ON U.id = Uopt.user_id +WHERE O.name = 'theme' +--GROUP BY O.id + + + +-- Option value for member & site +-- 1) User +SET @sid = 1; +SET @uid = 1; +SET @oid = 1; +SELECT O.name, U.id, Uopt.value + FROM pmgr_options O + JOIN pmgr_user_options Uopt ON Uopt.option_id = O.id + JOIN pmgr_users U ON U.id = Uopt.user_id +-- JOIN pmgr_site_memberships M ON M.user_id = U.id +-- JOIN pmgr_groups G ON G.id = M.group_id +-- JOIN pmgr_sites S ON S.id = M.site_id +WHERE -- S.id = @sid AND + U.id = @uid AND O.id = @oid +; + +-- 2) Group +SELECT O.name, G.rank, G.id, Gopt.value + FROM pmgr_options O + JOIN pmgr_group_options Gopt ON Gopt.option_id = O.id + JOIN pmgr_groups G ON G.id = Gopt.group_id + JOIN pmgr_site_memberships M ON M.group_id = G.id + JOIN pmgr_users U ON U.id = M.user_id + JOIN pmgr_sites S ON S.id = M.site_id +WHERE S.id = @sid AND U.id = @uid AND O.id = @oid +ORDER BY G.rank +; + +-- 3) Site +SELECT O.name, S.id, Sopt.value + FROM pmgr_options O + JOIN pmgr_site_options Sopt ON Sopt.option_id = O.id + JOIN pmgr_sites S ON S.id = Sopt.site_id +-- JOIN pmgr_site_memberships M ON M.site_id = S.id +-- JOIN pmgr_groups G ON G.id = M.group_id +-- JOIN pmgr_users U ON U.id = M.user_id +WHERE S.id = @sid +-- AND U.id = @uid + AND O.id = @oid +; + +-- 3) Default +SELECT O.name, O.default AS 'value' + FROM pmgr_options O +WHERE O.id = @oid +; + + +-- User Permissions + + +-- Group Permissions + +-- All option values, in order +SELECT O.name, V.value, + U.id AS uid, G.id AS gid, S.id as sid, + Dopt.id AS did, G.rank + FROM pmgr_option_values V + JOIN pmgr_options O ON O.id = V.option_id + LEFT JOIN pmgr_user_options Uopt ON Uopt.option_value_id = V.id + LEFT JOIN pmgr_group_options Gopt ON Gopt.option_value_id = V.id + LEFT JOIN pmgr_site_options Sopt ON Sopt.option_value_id = V.id + LEFT JOIN pmgr_default_options Dopt ON Dopt.option_value_id = V.id + LEFT JOIN pmgr_groups G ON G.id = Gopt.group_id + LEFT JOIN pmgr_users U ON U.id = Uopt.user_id + LEFT JOIN pmgr_sites S ON S.id = Sopt.site_id +WHERE O.id = @oid +ORDER BY IF(U.id IS NOT NULL, 1, + IF (G.id IS NOT NULL, 2, + IF (S.id IS NOT NULL, 3, 4))) ASC, + IF (G.id IS NOT NULL, G.rank, 0) ASC + + +-- Option values relevant to the user and site, in order +SELECT O.name, V.value, + U.id AS uid, G.id AS gid, S.id as sid, + Dopt.id AS did, G.rank + FROM pmgr_option_values V + JOIN pmgr_options O ON O.id = V.option_id + LEFT JOIN pmgr_user_options Uopt ON Uopt.option_value_id = V.id + LEFT JOIN pmgr_group_options Gopt ON Gopt.option_value_id = V.id + LEFT JOIN pmgr_site_options Sopt ON Sopt.option_value_id = V.id + LEFT JOIN pmgr_default_options Dopt ON Dopt.option_value_id = V.id + LEFT JOIN pmgr_groups G ON G.id = Gopt.group_id + LEFT JOIN pmgr_users U ON U.id = Uopt.user_id + LEFT JOIN pmgr_sites S ON S.id = Sopt.site_id + JOIN pmgr_site_memberships M ON M.user_id = U.id AND M.site_id = S.id +WHERE S.id = @sid AND U.id = @uid AND O.id = @oid +ORDER BY IF(U.id IS NOT NULL, 1, + IF (G.id IS NOT NULL, 2, + IF (S.id IS NOT NULL, 3, 4))) ASC, + IF (G.id IS NOT NULL, G.rank, 0) ASC + + + + + +SET @sid = 1; +SET @uid = 1; +SET @oid = 1; +SELECT O.name, V.value, + U.id AS uid, + -- G.id AS gid, + S.id as sid, + Dopt.id AS did + -- G.rank + FROM pmgr_option_values V + JOIN pmgr_options O ON O.id = V.option_id + LEFT JOIN pmgr_user_options Uopt ON Uopt.option_value_id = V.id + LEFT JOIN pmgr_site_options Sopt ON Sopt.option_value_id = V.id +-- LEFT JOIN pmgr_users U ON U.id = Uopt.user_id +-- LEFT JOIN pmgr_group_options Gopt ON Gopt.option_value_id = V.id + LEFT JOIN pmgr_default_options Dopt ON Dopt.option_value_id = V.id +-- LEFT JOIN pmgr_groups G ON G.id = Gopt.group_id + LEFT JOIN pmgr_users U ON U.id = Uopt.user_id + LEFT JOIN pmgr_sites S ON S.id = Sopt.site_id + JOIN pmgr_site_memberships M ON M.user_id = U.id -- AND M.site_id = S.id +WHERE -- S.id = @sid AND U.id = @uid AND + O.id = @oid +ORDER BY IF(U.id IS NOT NULL, 1, +-- IF (G.id IS NOT NULL, 2, + IF (S.id IS NOT NULL, 3, 4)) -- ) ASC, +-- IF (G.id IS NOT NULL, G.rank, 0) ASC + + + + + +-- ------------------------------------------------------------ +-- ------------------------------------------------------------ +-- ------------------------------------------------------------ +-- Working version (without defaults) +SET @sid = 1; +SET @uid = 1; +SET @oid = 1; +SELECT O.name, O.id AS oid, V.value, V.id AS vid, + U.id AS uid, + G.id AS gid, + S.id AS sid, +-- Dopt.id AS did + G.rank + FROM pmgr_users U + JOIN pmgr_site_memberships M ON M.user_id = U.id + JOIN pmgr_sites S ON S.id = M.site_id + LEFT JOIN pmgr_groups G ON G.id = M.group_id + LEFT JOIN pmgr_user_options Uopt ON Uopt.user_id = U.id + LEFT JOIN pmgr_group_options Gopt ON Gopt.group_id = G.id + LEFT JOIN pmgr_site_options Sopt ON Sopt.site_id = S.id + LEFT JOIN pmgr_option_values V ON (V.id = Uopt.option_value_id OR + V.id = Gopt.option_value_id OR + V.id = Sopt.option_value_id) + JOIN pmgr_options O ON O.id = V.option_id +WHERE S.id = @sid AND U.id = @uid AND O.id = @oid +ORDER BY IF(U.id IS NOT NULL, 1, + IF (G.id IS NOT NULL, 2, + IF (S.id IS NOT NULL, 3, 4))) ASC, + IF (G.id IS NOT NULL, G.rank, 0) ASC +; + + + + +SET @sid = 1; +SET @uid = 1; +SET @oid = 1; +SELECT O.name, O.id AS oid, V.value, V.id AS vid, + U.id AS uid, + G.id AS gid, + S.id AS sid, +-- Dopt.id AS did + G.rank + FROM pmgr_options O + LEFT JOIN pmgr_option_values V ON V.option_id = O.id + -- Now have the option and all possible values + LEFT JOIN pmgr_user_options Uopt ON Uopt.option_value_id = V.id + LEFT JOIN pmgr_group_options Gopt ON Gopt.option_value_id = V.id + LEFT JOIN pmgr_site_options Sopt ON Sopt.option_value_id = V.id + -- Now have the user/group/site that each value applies to + LEFT JOIN pmgr_users U U ON Uopt.user_id = U.id OR Uopt.user_id IS NULL + -- Now restricted to our user + JOIN pmgr_site_memberships M ON M.user_id = U.id + JOIN pmgr_sites S ON S.id = M.site_id + + + + ON O.id = V.option_id + LEFT JOIN pmgr_groups G ON G.id = M.group_id + LEFT JOIN pmgr_option_values V ON (V.id = Uopt.option_value_id OR + V.id = Gopt.option_value_id OR + V.id = Sopt.option_value_id) + JOIN +WHERE S.id = @sid AND U.id = @uid AND O.id = @oid +ORDER BY IF(U.id IS NOT NULL, 1, + IF (G.id IS NOT NULL, 2, + IF (S.id IS NOT NULL, 3, 4))) ASC, + IF (G.id IS NOT NULL, G.rank, 0) ASC +; + + + + + + + + + +SET @sid = 1; +SET @uid = 1; +SET @oid = 1; +SELECT O.name, O.id AS oid, V.value, V.id AS vid, + U.id AS uid, + G.id AS gid, + S.id AS sid, +-- Dopt.id AS did + G.rank + FROM pmgr_options O LEFT JOIN pmgr_option_values V ON V.option_id = O.id, + pmgr_users U + JOIN pmgr_site_memberships M ON M.user_id = U.id + JOIN pmgr_sites S ON S.id = M.site_id + LEFT JOIN pmgr_groups G ON G.id = M.group_id + LEFT JOIN pmgr_user_options Uopt ON Uopt.user_id = U.id + LEFT JOIN pmgr_group_options Gopt ON Gopt.group_id = G.id + LEFT JOIN pmgr_site_options Sopt ON Sopt.site_id = S.id, +WHERE S.id = @sid AND U.id = @uid AND O.id = @oid + AND (V.id = Uopt.option_value_id OR + V.id = Gopt.option_value_id OR + V.id = Sopt.option_value_id) +ORDER BY IF(U.id IS NOT NULL, 1, + IF (G.id IS NOT NULL, 2, + IF (S.id IS NOT NULL, 3, 4))) ASC, + IF (G.id IS NOT NULL, G.rank, 0) ASC +; diff --git a/site/.htaccess b/site/.htaccess index f922a22..861117a 100644 --- a/site/.htaccess +++ b/site/.htaccess @@ -10,9 +10,9 @@ deny from all # Now allow local access # Localhost -allow from 127.0.0 +# allow from 127.0.0 # Local subnet -allow from 192.168.7 +# allow from 192.168.7 # Provide a mechanism for user authentication AuthType Digest diff --git a/site/app_model.php b/site/app_model.php index 7eb7f10..b133f58 100644 --- a/site/app_model.php +++ b/site/app_model.php @@ -42,6 +42,10 @@ class AppModel extends Model { var $useNullForEmpty = true; var $formatDateFields = true; + // Loaded related models with no association + var $knows = array(); + var $app_knows = array('Option'); + // Default Log Level, if not specified at the function level var $default_log_level = 5; @@ -58,16 +62,35 @@ class AppModel extends Model { var $max_log_level; - // REVISIT : 20090730 - // Why is this constructor crashing? - // Clearly it's in some sort of infinite - // loop, but it seems the correct way - // to have a constructor call the parent... + /************************************************************************** + ************************************************************************** + ************************************************************************** + * function: __construct + */ + + function __construct($id = false, $table = null, $ds = null) { + parent::__construct($id, $table, $ds); + + $this->knows = array_merge($this->app_knows, $this->knows); + //$this->pr(1, array('knows' => $this->knows)); + foreach ($this->knows as $alias => $modelName) { + if (is_numeric($alias)) { + $alias = $modelName; + } + + // Don't overwrite any existing alias + if (!empty($this->{$alias}) || get_class($this) == $alias) + continue; + + $model = array('class' => $modelName, 'alias' => $alias); + if (PHP5) { + $this->{$alias} = ClassRegistry::init($model); + } else { + $this->{$alias} =& ClassRegistry::init($model); + } + } + } -/* function __construct() { */ -/* parent::__construct(); */ -/* $this->prClassLevel(5, 'Model'); */ -/* } */ /************************************************************************** ************************************************************************** @@ -81,7 +104,8 @@ class AppModel extends Model { $caller = array_shift($trace); $caller = array_shift($trace); if (empty($class)) - $class = $caller['class']; + $class = get_class($this); + $this->pr(50, compact('class', 'level')); $this->class_log_level[$class] = $level; } @@ -90,9 +114,10 @@ class AppModel extends Model { $caller = array_shift($trace); $caller = array_shift($trace); if (empty($class)) - $class = $caller['class']; + $class = get_class($this); if (empty($function)) $function = $caller['function']; + $this->pr(50, compact('class', 'function', 'level')); $this->function_log_level["{$class}-{$function}"] = $level; } @@ -280,7 +305,9 @@ class AppModel extends Model { if (preg_match("/^_/", $name) && !$all) unset($vars[$name]); } - pr($vars); + //$vars['class'] = get_class_vars(get_class($this)); + + $this->pr(1, $vars); } @@ -480,8 +507,8 @@ class AppModel extends Model { return date('Y-m-d', strtotime($dateString)); } - function INTERNAL_ERROR($msg, $depth = 0) { - INTERNAL_ERROR($msg, false, $depth+1); + function INTERNAL_ERROR($msg, $depth = 0, $force_stop = false) { + INTERNAL_ERROR($msg, $force_stop, $depth+1); echo $this->requestAction(array('controller' => 'accounts', 'action' => 'render_empty'), array('return', 'bare' => false) diff --git a/site/models/default_option.php b/site/models/default_option.php new file mode 100644 index 0000000..e472e40 --- /dev/null +++ b/site/models/default_option.php @@ -0,0 +1,21 @@ +prEnter(compact('name')); + + $query = array(); + $this->queryInit($query); + + $query['link']['DefaultOption'] = array(); + $query['link']['DefaultOption']['type'] = 'INNER'; + $query['link']['DefaultOption']['fields'] = array(); + return $this->prReturn($this->OptionValue->values($name, $query)); + } + +} diff --git a/site/models/group.php b/site/models/group.php new file mode 100644 index 0000000..114ec73 --- /dev/null +++ b/site/models/group.php @@ -0,0 +1,38 @@ +groupIds(); + + if (empty(self::$current_group_ids)) + // We must force a stop here, since this is typically + // called very early on, and so will cause a recursive + // crash as we try to render the internal error and + // again stumble on this problem. + $this->INTERNAL_ERROR('INVALID MEMBERSHIP', 0, true); + + return self::$current_group_ids; + } + + function groupIds($user_id = null, $site_id = null) { + if (empty($user_id)) + $user_id = $this->User->currentUserId(); + if (empty($site_id)) + $site_id = $this->Site->currentSiteId(); + + return $this->Membership->memberGroups($user_id, $site_id); + } + +} diff --git a/site/models/group_option.php b/site/models/group_option.php new file mode 100644 index 0000000..ccd7266 --- /dev/null +++ b/site/models/group_option.php @@ -0,0 +1,25 @@ +prEnter(compact('id', 'name')); + + $query = array(); + $this->queryInit($query); + + $query['link']['GroupOption'] = array(); + $query['link']['GroupOption']['fields'] = array(); + $query['link']['GroupOption']['Group'] = array(); + $query['link']['GroupOption']['Group']['fields'] = array(); + $query['conditions'][] = array('Group.id' => $ids); + $query['order'][] = 'Group.rank'; + return $this->prReturn($this->OptionValue->values($name, $query)); + } + +} diff --git a/site/models/membership.php b/site/models/membership.php new file mode 100644 index 0000000..f444b3c --- /dev/null +++ b/site/models/membership.php @@ -0,0 +1,37 @@ +prEnter(compact('user_id', 'site_id')); + + $this->cacheQueries = true; + $groups = $this->find('all', array + ('recursive' => -1, + 'fields' => array('group_id'), + 'conditions' => array(array('user_id' => $user_id), + array('site_id' => $site_id)), + )); + $this->cacheQueries = false; + + if (empty($groups)) + return $this->prReturn(null); + + $group_ids = array(); + foreach ($groups AS $group) + $group_ids[] = $group['Membership']['group_id']; + + return $this->prReturn($group_ids); + } + + function memberOf($user_id, $site_id) { + $groups = $this->memberGroups($user_id, $site_id); + return (!empty($groups)); + } + +} diff --git a/site/models/option.php b/site/models/option.php new file mode 100644 index 0000000..e66d5c3 --- /dev/null +++ b/site/models/option.php @@ -0,0 +1,62 @@ +prClassLevel(30); +/* //$this->OptionValue->prClassLevel(30); */ +/* $this->Group->Membership->prClassLevel(30); */ +/* $this->OptionValue->SiteOption->prClassLevel(30); */ +/* $this->OptionValue->UserOption->prClassLevel(30); */ +/* $this->OptionValue->GroupOption->prClassLevel(30); */ +/* $this->OptionValue->DefaultOption->prClassLevel(30); */ + $this->prEnter(compact('name')); + + $site_id = $this->Site->currentSiteId(); + $user_id = $this->User->currentUserId(); + $group_ids = $this->Group->currentGroupIds(); + +/* $site_id = 2; */ +/* $user_id = 4; */ +/* $group_ids = $this->Group->groupIds($user_id, $site_id); */ + + $values = array(); + + if (!empty($site_id)) + $values = + array_merge($values, + $this->OptionValue->SiteOption->values($site_id, $name)); + + if (!empty($user_id)) + $values = + array_merge($values, + $this->OptionValue->UserOption->values($user_id, $name)); + + if (!empty($group_ids)) + $values = + array_merge($values, + $this->OptionValue->GroupOption->values($group_ids, $name)); + + $values = + array_merge($values, + $this->OptionValue->DefaultOption->values($name)); + + return $this->prReturn($values); + } + + function get($name) { + $this->prEnter(compact('name')); + $values = $this->getAll($name); + if (empty($values)) + return null; + return $this->prReturn($values[0]); + } + +} diff --git a/site/models/option_value.php b/site/models/option_value.php new file mode 100644 index 0000000..0c1fa3c --- /dev/null +++ b/site/models/option_value.php @@ -0,0 +1,35 @@ +prEnter(compact('name', 'query')); + $this->queryInit($query); + + $query['link']['Option'] = array(); + + if (!empty($name)) { + $query['conditions'][] = array('Option.name' => $name); + $query['link']['Option']['fields'] = array(); + } + + $this->cacheQueries = true; + $values = array(); + foreach ($this->find('all', $query) AS $result) + $values[] = $result['OptionValue']['value']; + $this->cacheQueries = false; + + return $this->prReturn($values); + } + +} diff --git a/site/models/site.php b/site/models/site.php index 4825faa..5473031 100644 --- a/site/models/site.php +++ b/site/models/site.php @@ -1,16 +1,37 @@ array('numeric'), - 'name' => array('notempty') - ); + var $hasMany = + array('SiteArea', + 'SiteOption', + 'Membership', + ); - var $hasMany = array( - 'SiteArea', - 'SiteOption', - ); + static $current_site_id; + function currentSiteId() { + if (!empty(self::$current_site_id)) + return self::$current_site_id; + + // REVISIT : 20090827 + // Must get the actual site + $code = 'VSS'; + + $site = $this->find + ('first', + array('recursive' => -1, + 'conditions' => compact('code'))); + + if (!empty($site['Site']['id'])) + self::$current_site_id = $site['Site']['id']; + else + // We must force a stop here, since this is typically + // called very early on, and so will cause a recursive + // crash as we try to render the internal error and + // again stumble on this problem. + $this->INTERNAL_ERROR('UNKNOWN SITE', 0, true); + + return self::$current_site_id; + } } ?> \ No newline at end of file diff --git a/site/models/site_option.php b/site/models/site_option.php new file mode 100644 index 0000000..1ef89a3 --- /dev/null +++ b/site/models/site_option.php @@ -0,0 +1,24 @@ +prEnter(compact('id', 'name')); + + $query = array(); + $this->queryInit($query); + + $query['link']['SiteOption'] = array(); + $query['link']['SiteOption']['fields'] = array(); + $query['link']['SiteOption']['Site'] = array(); + $query['link']['SiteOption']['Site']['fields'] = array(); + $query['conditions'][] = array('Site.id' => $id); + return $this->prReturn($this->OptionValue->values($name, $query)); + } + +} diff --git a/site/models/user.php b/site/models/user.php new file mode 100644 index 0000000..ed94057 --- /dev/null +++ b/site/models/user.php @@ -0,0 +1,37 @@ +find + ('first', + array('recursive' => -1, + 'conditions' => compact('login'))); + + if (!empty($user['User']['id'])) + self::$current_user_id = $user['User']['id']; + else + // We must force a stop here, since this is typically + // called very early on, and so will cause a recursive + // crash as we try to render the internal error and + // again stumble on this problem. + $this->INTERNAL_ERROR('UNKNOWN USER', 0, true); + + return self::$current_user_id; + } + +} diff --git a/site/models/user_option.php b/site/models/user_option.php new file mode 100644 index 0000000..88fa1f8 --- /dev/null +++ b/site/models/user_option.php @@ -0,0 +1,24 @@ +prEnter(compact('id', 'name')); + + $query = array(); + $this->queryInit($query); + + $query['link']['UserOption'] = array(); + $query['link']['UserOption']['fields'] = array(); + $query['link']['UserOption']['User'] = array(); + $query['link']['UserOption']['User']['fields'] = array(); + $query['conditions'][] = array('User.id' => $id); + return $this->prReturn($this->OptionValue->values($name, $query)); + } + +} From 7904372dff6738315fc5825c0402decbd43972d7 Mon Sep 17 00:00:00 2001 From: abijah Date: Fri, 28 Aug 2009 03:32:07 +0000 Subject: [PATCH 02/11] Added support for permissions. Next is to implement some. git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@798 97e9348a-65ac-dc4b-aefc-98561f571b83 --- build.cmd | 3 +- site/app_controller.php | 22 ++++- site/controllers/accounts_controller.php | 2 - site/models/default_permission.php | 21 +++++ site/models/group_permission.php | 25 ++++++ site/models/option.php | 27 +++--- site/models/permission.php | 102 +++++++++++++++++++++++ site/models/permission_value.php | 36 ++++++++ site/models/site_permission.php | 24 ++++++ site/models/user_permission.php | 24 ++++++ site/views/empty.ctp | 2 - 11 files changed, 270 insertions(+), 18 deletions(-) create mode 100644 site/models/default_permission.php create mode 100644 site/models/group_permission.php create mode 100644 site/models/permission.php create mode 100644 site/models/permission_value.php create mode 100644 site/models/site_permission.php create mode 100644 site/models/user_permission.php diff --git a/build.cmd b/build.cmd index 5e84573..e038d85 100644 --- a/build.cmd +++ b/build.cmd @@ -1,3 +1,4 @@ @echo off -mysql --user=pmgr --password=pmgruser < %~dp0\db\property_manager.sql +mysql --user=pmgr --password=pmgruser --database=property_manager < %~dp0\db\schema.sql +mysql --user=pmgr --password=pmgruser --database=property_manager < %~dp0\db\extra.sql echo Done! diff --git a/site/app_controller.php b/site/app_controller.php index 517d6e2..5de4601 100644 --- a/site/app_controller.php +++ b/site/app_controller.php @@ -35,6 +35,7 @@ * @subpackage cake.app */ class AppController extends Controller { + var $uses = array('Option', 'Permission'); var $helpers = array('Html', 'Form', 'Javascript', 'Format', 'Time', 'Grid'); var $components = array('DebugKit.Toolbar'); @@ -295,6 +296,11 @@ class AppController extends Controller { if (empty($this->params['admin'])) $this->sideMenuEnable($area_name, $this->admin_area, false); } + + $this->authorize("controller.{$this->params['controller']}"); + $this->authorize("controller.{$this->params['controller']}"); + $this->authorize("action.{$this->params['controller']}.{$this->params['action']}"); + $this->authorize("action.{$this->params['controller']}.{$this->params['action']}"); } @@ -1147,14 +1153,26 @@ class AppController extends Controller { echo " \n"; } + function authorize($name) { + if ($this->Permission->deny($name)) + $this->UNAUTHORIZED("Unauthorized: $name"); + } + + function UNAUTHORIZED($msg) { + //$this->redirect('controller' => '???', 'action' => 'login'); + //$this->render('/unauthorized'); + $this->set('message', '

' . $msg . '

'); + $this->render_empty(); + } + function INTERNAL_ERROR($msg, $depth = 0) { INTERNAL_ERROR($msg, false, $depth+1); $this->render_empty(); - $this->_stop(); } function render_empty() { - $this->render('/empty'); + echo $this->render('/empty'); + $this->_stop(); } } diff --git a/site/controllers/accounts_controller.php b/site/controllers/accounts_controller.php index b8b7eff..2fcd4c1 100644 --- a/site/controllers/accounts_controller.php +++ b/site/controllers/accounts_controller.php @@ -2,8 +2,6 @@ class AccountsController extends AppController { - var $uses = array('Account', 'LedgerEntry'); - /************************************************************************** ************************************************************************** diff --git a/site/models/default_permission.php b/site/models/default_permission.php new file mode 100644 index 0000000..920bd8f --- /dev/null +++ b/site/models/default_permission.php @@ -0,0 +1,21 @@ +prEnter(compact('name')); + + $query = array(); + $this->queryInit($query); + + $query['link']['DefaultPermission'] = array(); + $query['link']['DefaultPermission']['type'] = 'INNER'; + $query['link']['DefaultPermission']['fields'] = array(); + return $this->prReturn($this->PermissionValue->values($name, $query)); + } + +} diff --git a/site/models/group_permission.php b/site/models/group_permission.php new file mode 100644 index 0000000..2d798d4 --- /dev/null +++ b/site/models/group_permission.php @@ -0,0 +1,25 @@ +prEnter(compact('id', 'name')); + + $query = array(); + $this->queryInit($query); + + $query['link']['GroupPermission'] = array(); + $query['link']['GroupPermission']['fields'] = array(); + $query['link']['GroupPermission']['Group'] = array(); + $query['link']['GroupPermission']['Group']['fields'] = array(); + $query['conditions'][] = array('Group.id' => $ids); + $query['order'][] = 'Group.rank'; + return $this->prReturn($this->PermissionValue->values($name, $query)); + } + +} diff --git a/site/models/option.php b/site/models/option.php index e66d5c3..bc2830c 100644 --- a/site/models/option.php +++ b/site/models/option.php @@ -9,6 +9,8 @@ class Option extends AppModel { array('User', 'Site', 'Group'); + static $option_set = array(); + function getAll($name) { $this->prClassLevel(30); /* //$this->OptionValue->prClassLevel(30); */ @@ -19,6 +21,11 @@ class Option extends AppModel { /* $this->OptionValue->DefaultOption->prClassLevel(30); */ $this->prEnter(compact('name')); + if (!empty(self::$option_set[$name]) && !$force) + return $this->prReturn(self::$option_set[$name]); + + self::$option_set[$name] = array(); + $site_id = $this->Site->currentSiteId(); $user_id = $this->User->currentUserId(); $group_ids = $this->Group->currentGroupIds(); @@ -27,28 +34,26 @@ class Option extends AppModel { /* $user_id = 4; */ /* $group_ids = $this->Group->groupIds($user_id, $site_id); */ - $values = array(); - if (!empty($site_id)) - $values = - array_merge($values, + self::$option_set[$name] = + array_merge(self::$option_set[$name], $this->OptionValue->SiteOption->values($site_id, $name)); if (!empty($user_id)) - $values = - array_merge($values, + self::$option_set[$name] = + array_merge(self::$option_set[$name], $this->OptionValue->UserOption->values($user_id, $name)); if (!empty($group_ids)) - $values = - array_merge($values, + self::$option_set[$name] = + array_merge(self::$option_set[$name], $this->OptionValue->GroupOption->values($group_ids, $name)); - $values = - array_merge($values, + self::$option_set[$name] = + array_merge(self::$option_set[$name], $this->OptionValue->DefaultOption->values($name)); - return $this->prReturn($values); + return $this->prReturn(self::$option_set[$name]); } function get($name) { diff --git a/site/models/permission.php b/site/models/permission.php new file mode 100644 index 0000000..38a9660 --- /dev/null +++ b/site/models/permission.php @@ -0,0 +1,102 @@ +prClassLevel(30); +/* $this->PermissionValue->prClassLevel(30); */ +/* $this->Group->Membership->prClassLevel(30); */ +/* $this->PermissionValue->SitePermission->prClassLevel(30); */ +/* $this->PermissionValue->UserPermission->prClassLevel(30); */ +/* $this->PermissionValue->GroupPermission->prClassLevel(30); */ +/* $this->PermissionValue->DefaultPermission->prClassLevel(30); */ + $this->prEnter(compact('name')); + + if (!empty(self::$permission_set[$name]) && !$force) + return $this->prReturn(self::$permission_set[$name]); + + self::$permission_set[$name] = array(); + + $site_id = $this->Site->currentSiteId(); + $user_id = $this->User->currentUserId(); + $group_ids = $this->Group->currentGroupIds(); + +/* $site_id = 1; */ +/* $user_id = 2; */ +/* $group_ids = $this->Group->groupIds($user_id, $site_id); */ + + if (empty($group_ids)) { + self::$permission_set[$name][$name][] = array('access' => 'DENY', 'level' => null); + $site_id = null; + $user_id = null; + } + + if (!empty($site_id)) + self::$permission_set[$name] = + array_merge(self::$permission_set[$name], + $this->PermissionValue->SitePermission->values($site_id, $name)); + + if (!empty($user_id)) + self::$permission_set[$name] = + array_merge(self::$permission_set[$name], + $this->PermissionValue->UserPermission->values($user_id, $name)); + + if (!empty($group_ids)) { + self::$permission_set[$name] = + array_merge(self::$permission_set[$name], + $this->PermissionValue->GroupPermission->values($group_ids, $name)); + + self::$permission_set[$name] = + array_merge(self::$permission_set[$name], + $this->PermissionValue->DefaultPermission->values($name)); + + self::$permission_set[$name][] = array('access' => 'ALLOW', 'level' => null); + } + + return $this->prReturn(self::$permission_set[$name]); + } + + function get($name) { + $this->prEnter(compact('name')); + + // REVISIT : 20090827 + // This is a pretty crappy algorithm. How do we decide whether DENY really + // means DENY, or whether an ALLOW has priority. + // Oh well, it works for now... + + $values = $this->getAll($name); + $result = array_shift($values); + + foreach ($values AS $value) + if (empty($result['level']) || (!empty($value['level']) && $value['level'] < $result['level'])) + $result['level'] = $value['level']; + + return $this->prReturn($result); + } + + function allow($name) { + $this->prEnter(compact('name')); + $result = $this->get($name); + return $this->prReturn($result['access'] === 'ALLOW'); + } + + function deny($name) { + $this->prEnter(compact('name')); + return $this->prReturn(!$this->allow($name)); + } + + function level($name) { + $this->prEnter(compact('name')); + $result = $this->get($name); + return $this->prReturn($result['level']); + } + +} diff --git a/site/models/permission_value.php b/site/models/permission_value.php new file mode 100644 index 0000000..ce7ec39 --- /dev/null +++ b/site/models/permission_value.php @@ -0,0 +1,36 @@ +prEnter(compact('name', 'query')); + $this->queryInit($query); + + $query['link']['Permission'] = array(); + + if (!empty($name)) { + $query['conditions'][] = array('Permission.name' => $name); + $query['link']['Permission']['fields'] = array(); + } + + $this->cacheQueries = true; + $values = array(); + foreach ($this->find('all', $query) AS $result) + $values[] = array('access' => $result['PermissionValue']['access'], + 'level' => $result['PermissionValue']['level']); + $this->cacheQueries = false; + + return $this->prReturn($values); + } + +} diff --git a/site/models/site_permission.php b/site/models/site_permission.php new file mode 100644 index 0000000..6fad60e --- /dev/null +++ b/site/models/site_permission.php @@ -0,0 +1,24 @@ +prEnter(compact('id', 'name')); + + $query = array(); + $this->queryInit($query); + + $query['link']['SitePermission'] = array(); + $query['link']['SitePermission']['fields'] = array(); + $query['link']['SitePermission']['Site'] = array(); + $query['link']['SitePermission']['Site']['fields'] = array(); + $query['conditions'][] = array('Site.id' => $id); + return $this->prReturn($this->PermissionValue->values($name, $query)); + } + +} diff --git a/site/models/user_permission.php b/site/models/user_permission.php new file mode 100644 index 0000000..8cdc5b3 --- /dev/null +++ b/site/models/user_permission.php @@ -0,0 +1,24 @@ +prEnter(compact('id', 'name')); + + $query = array(); + $this->queryInit($query); + + $query['link']['UserPermission'] = array(); + $query['link']['UserPermission']['fields'] = array(); + $query['link']['UserPermission']['User'] = array(); + $query['link']['UserPermission']['User']['fields'] = array(); + $query['conditions'][] = array('User.id' => $id); + return $this->prReturn($this->PermissionValue->values($name, $query)); + } + +} diff --git a/site/views/empty.ctp b/site/views/empty.ctp index 3888feb..75b91f4 100644 --- a/site/views/empty.ctp +++ b/site/views/empty.ctp @@ -1,5 +1,3 @@ Date: Fri, 28 Aug 2009 04:03:19 +0000 Subject: [PATCH 03/11] Added rollup sql code to bring the current database up to speed with the option / permission changes. git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@799 97e9348a-65ac-dc4b-aefc-98561f571b83 --- build.cmd | 4 +- db/property_manager.sql | 290 +++++++++++++++++++++++++++++++++------ db/rollup.sql | 297 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 545 insertions(+), 46 deletions(-) create mode 100644 db/rollup.sql diff --git a/build.cmd b/build.cmd index e038d85..6be0c4c 100644 --- a/build.cmd +++ b/build.cmd @@ -1,4 +1,4 @@ @echo off -mysql --user=pmgr --password=pmgruser --database=property_manager < %~dp0\db\schema.sql -mysql --user=pmgr --password=pmgruser --database=property_manager < %~dp0\db\extra.sql +mysql --user=pmgr --password=pmgruser < %~dp0\db\property_manager.sql +mysql --user=pmgr --password=pmgruser --database=property_manager < %~dp0\db\rollup.sql echo Done! diff --git a/db/property_manager.sql b/db/property_manager.sql index ac53c80..9c43e65 100644 --- a/db/property_manager.sql +++ b/db/property_manager.sql @@ -830,6 +830,54 @@ INSERT INTO `pmgr_customers` VALUES (61,'Selle-Jackson, Angela',77,1,1,0,NULL); /*!40000 ALTER TABLE `pmgr_customers` ENABLE KEYS */; UNLOCK TABLES; +-- +-- Table structure for table `pmgr_default_options` +-- + +DROP TABLE IF EXISTS `pmgr_default_options`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `pmgr_default_options` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `option_value_id` int(10) unsigned NOT NULL, + `comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Dumping data for table `pmgr_default_options` +-- + +LOCK TABLES `pmgr_default_options` WRITE; +/*!40000 ALTER TABLE `pmgr_default_options` DISABLE KEYS */; +/*!40000 ALTER TABLE `pmgr_default_options` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `pmgr_default_permissions` +-- + +DROP TABLE IF EXISTS `pmgr_default_permissions`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `pmgr_default_permissions` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `permission_value_id` int(10) unsigned NOT NULL, + `comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Dumping data for table `pmgr_default_permissions` +-- + +LOCK TABLES `pmgr_default_permissions` WRITE; +/*!40000 ALTER TABLE `pmgr_default_permissions` DISABLE KEYS */; +/*!40000 ALTER TABLE `pmgr_default_permissions` ENABLE KEYS */; +UNLOCK TABLES; + -- -- Table structure for table `pmgr_deposits` -- @@ -1619,11 +1667,12 @@ DROP TABLE IF EXISTS `pmgr_group_options`; SET @saved_cs_client = @@character_set_client; SET character_set_client = utf8; CREATE TABLE `pmgr_group_options` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `group_id` int(10) unsigned NOT NULL, - `name` varchar(50) NOT NULL, - `value` varchar(255) NOT NULL, + `option_value_id` int(10) unsigned NOT NULL, `comment` varchar(255) DEFAULT NULL, - PRIMARY KEY (`group_id`,`name`) + PRIMARY KEY (`id`), + KEY `group_key` (`group_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; SET character_set_client = @saved_cs_client; @@ -1644,11 +1693,12 @@ DROP TABLE IF EXISTS `pmgr_group_permissions`; SET @saved_cs_client = @@character_set_client; SET character_set_client = utf8; CREATE TABLE `pmgr_group_permissions` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `group_id` int(10) unsigned NOT NULL, - `name` char(30) NOT NULL, - `access` enum('ALLOWED','DENIED','FORCED') NOT NULL DEFAULT 'ALLOWED', + `permission_value_id` int(10) unsigned NOT NULL, `comment` varchar(255) DEFAULT NULL, - PRIMARY KEY (`group_id`,`name`) + PRIMARY KEY (`id`), + KEY `group_key` (`group_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; SET character_set_client = @saved_cs_client; @@ -1658,7 +1708,6 @@ SET character_set_client = @saved_cs_client; LOCK TABLES `pmgr_group_permissions` WRITE; /*!40000 ALTER TABLE `pmgr_group_permissions` DISABLE KEYS */; -INSERT INTO `pmgr_group_permissions` VALUES (1,'EVERYTHING','FORCED',NULL); /*!40000 ALTER TABLE `pmgr_group_permissions` ENABLE KEYS */; UNLOCK TABLES; @@ -1673,9 +1722,10 @@ CREATE TABLE `pmgr_groups` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `code` varchar(12) NOT NULL, `name` varchar(80) NOT NULL, + `rank` smallint(5) unsigned NOT NULL DEFAULT '100', `comment` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +) ENGINE=MyISAM DEFAULT CHARSET=utf8; SET character_set_client = @saved_cs_client; -- @@ -1684,7 +1734,6 @@ SET character_set_client = @saved_cs_client; LOCK TABLES `pmgr_groups` WRITE; /*!40000 ALTER TABLE `pmgr_groups` DISABLE KEYS */; -INSERT INTO `pmgr_groups` VALUES (1,'Owner','Owner Group',NULL); /*!40000 ALTER TABLE `pmgr_groups` ENABLE KEYS */; UNLOCK TABLES; @@ -3558,6 +3607,31 @@ INSERT INTO `pmgr_maps_units` VALUES (78,1,78,372,2214,1); /*!40000 ALTER TABLE `pmgr_maps_units` ENABLE KEYS */; UNLOCK TABLES; +-- +-- Table structure for table `pmgr_memberships` +-- + +DROP TABLE IF EXISTS `pmgr_memberships`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `pmgr_memberships` ( + `site_id` int(10) unsigned NOT NULL, + `user_id` int(10) unsigned NOT NULL, + `group_id` int(10) unsigned NOT NULL, + `comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`site_id`,`user_id`,`group_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Dumping data for table `pmgr_memberships` +-- + +LOCK TABLES `pmgr_memberships` WRITE; +/*!40000 ALTER TABLE `pmgr_memberships` DISABLE KEYS */; +/*!40000 ALTER TABLE `pmgr_memberships` ENABLE KEYS */; +UNLOCK TABLES; + -- -- Table structure for table `pmgr_notes` -- @@ -3586,6 +3660,107 @@ LOCK TABLES `pmgr_notes` WRITE; /*!40000 ALTER TABLE `pmgr_notes` ENABLE KEYS */; UNLOCK TABLES; +-- +-- Table structure for table `pmgr_option_values` +-- + +DROP TABLE IF EXISTS `pmgr_option_values`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `pmgr_option_values` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `option_id` int(10) unsigned NOT NULL, + `value` varchar(255) NOT NULL, + `comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Dumping data for table `pmgr_option_values` +-- + +LOCK TABLES `pmgr_option_values` WRITE; +/*!40000 ALTER TABLE `pmgr_option_values` DISABLE KEYS */; +/*!40000 ALTER TABLE `pmgr_option_values` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `pmgr_options` +-- + +DROP TABLE IF EXISTS `pmgr_options`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `pmgr_options` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name_key` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Dumping data for table `pmgr_options` +-- + +LOCK TABLES `pmgr_options` WRITE; +/*!40000 ALTER TABLE `pmgr_options` DISABLE KEYS */; +/*!40000 ALTER TABLE `pmgr_options` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `pmgr_permission_values` +-- + +DROP TABLE IF EXISTS `pmgr_permission_values`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `pmgr_permission_values` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `permission_id` int(10) unsigned NOT NULL, + `access` enum('ALLOW','DENY') NOT NULL DEFAULT 'DENY', + `level` smallint(5) unsigned DEFAULT NULL, + `comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Dumping data for table `pmgr_permission_values` +-- + +LOCK TABLES `pmgr_permission_values` WRITE; +/*!40000 ALTER TABLE `pmgr_permission_values` DISABLE KEYS */; +/*!40000 ALTER TABLE `pmgr_permission_values` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `pmgr_permissions` +-- + +DROP TABLE IF EXISTS `pmgr_permissions`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `pmgr_permissions` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(50) NOT NULL, + `comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name_key` (`name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Dumping data for table `pmgr_permissions` +-- + +LOCK TABLES `pmgr_permissions` WRITE; +/*!40000 ALTER TABLE `pmgr_permissions` DISABLE KEYS */; +/*!40000 ALTER TABLE `pmgr_permissions` ENABLE KEYS */; +UNLOCK TABLES; + -- -- Table structure for table `pmgr_reservations` -- @@ -3668,32 +3843,6 @@ INSERT INTO `pmgr_site_areas` VALUES (1,1,'Main','Main Facility Area',NULL); /*!40000 ALTER TABLE `pmgr_site_areas` ENABLE KEYS */; UNLOCK TABLES; --- --- Table structure for table `pmgr_site_memberships` --- - -DROP TABLE IF EXISTS `pmgr_site_memberships`; -SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; -CREATE TABLE `pmgr_site_memberships` ( - `site_id` int(10) unsigned NOT NULL, - `user_id` int(10) unsigned NOT NULL, - `group_id` int(10) unsigned NOT NULL, - `comment` varchar(255) DEFAULT NULL, - PRIMARY KEY (`site_id`,`user_id`,`group_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; -SET character_set_client = @saved_cs_client; - --- --- Dumping data for table `pmgr_site_memberships` --- - -LOCK TABLES `pmgr_site_memberships` WRITE; -/*!40000 ALTER TABLE `pmgr_site_memberships` DISABLE KEYS */; -INSERT INTO `pmgr_site_memberships` VALUES (1,1,1,NULL); -/*!40000 ALTER TABLE `pmgr_site_memberships` ENABLE KEYS */; -UNLOCK TABLES; - -- -- Table structure for table `pmgr_site_options` -- @@ -3702,11 +3851,12 @@ DROP TABLE IF EXISTS `pmgr_site_options`; SET @saved_cs_client = @@character_set_client; SET character_set_client = utf8; CREATE TABLE `pmgr_site_options` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `site_id` int(10) unsigned NOT NULL, - `name` varchar(50) NOT NULL, - `value` varchar(255) NOT NULL, + `option_value_id` int(10) unsigned NOT NULL, `comment` varchar(255) DEFAULT NULL, - PRIMARY KEY (`site_id`,`name`) + PRIMARY KEY (`id`), + KEY `site_key` (`site_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; SET character_set_client = @saved_cs_client; @@ -3719,6 +3869,32 @@ LOCK TABLES `pmgr_site_options` WRITE; /*!40000 ALTER TABLE `pmgr_site_options` ENABLE KEYS */; UNLOCK TABLES; +-- +-- Table structure for table `pmgr_site_permissions` +-- + +DROP TABLE IF EXISTS `pmgr_site_permissions`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `pmgr_site_permissions` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `site_id` int(10) unsigned NOT NULL, + `permission_value_id` int(10) unsigned NOT NULL, + `comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `site_key` (`site_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Dumping data for table `pmgr_site_permissions` +-- + +LOCK TABLES `pmgr_site_permissions` WRITE; +/*!40000 ALTER TABLE `pmgr_site_permissions` DISABLE KEYS */; +/*!40000 ALTER TABLE `pmgr_site_permissions` ENABLE KEYS */; +UNLOCK TABLES; + -- -- Table structure for table `pmgr_sites` -- @@ -5804,11 +5980,12 @@ DROP TABLE IF EXISTS `pmgr_user_options`; SET @saved_cs_client = @@character_set_client; SET character_set_client = utf8; CREATE TABLE `pmgr_user_options` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(10) unsigned NOT NULL, - `name` varchar(50) NOT NULL, - `value` varchar(255) NOT NULL, + `option_value_id` int(10) unsigned NOT NULL, `comment` varchar(255) DEFAULT NULL, - PRIMARY KEY (`user_id`,`name`) + PRIMARY KEY (`id`), + KEY `user_key` (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; SET character_set_client = @saved_cs_client; @@ -5821,6 +5998,32 @@ LOCK TABLES `pmgr_user_options` WRITE; /*!40000 ALTER TABLE `pmgr_user_options` ENABLE KEYS */; UNLOCK TABLES; +-- +-- Table structure for table `pmgr_user_permissions` +-- + +DROP TABLE IF EXISTS `pmgr_user_permissions`; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +CREATE TABLE `pmgr_user_permissions` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `user_id` int(10) unsigned NOT NULL, + `permission_value_id` int(10) unsigned NOT NULL, + `comment` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `user_key` (`user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; +SET character_set_client = @saved_cs_client; + +-- +-- Dumping data for table `pmgr_user_permissions` +-- + +LOCK TABLES `pmgr_user_permissions` WRITE; +/*!40000 ALTER TABLE `pmgr_user_permissions` DISABLE KEYS */; +/*!40000 ALTER TABLE `pmgr_user_permissions` ENABLE KEYS */; +UNLOCK TABLES; + -- -- Table structure for table `pmgr_users` -- @@ -5837,7 +6040,7 @@ CREATE TABLE `pmgr_users` ( `contact_id` int(10) unsigned NOT NULL, `comment` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +) ENGINE=MyISAM DEFAULT CHARSET=utf8; SET character_set_client = @saved_cs_client; -- @@ -5846,7 +6049,6 @@ SET character_set_client = @saved_cs_client; LOCK TABLES `pmgr_users` WRITE; /*!40000 ALTER TABLE `pmgr_users` DISABLE KEYS */; -INSERT INTO `pmgr_users` VALUES (1,'AP','abijah',NULL,NULL,1,NULL); /*!40000 ALTER TABLE `pmgr_users` ENABLE KEYS */; UNLOCK TABLES; @@ -5863,4 +6065,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2009-08-26 20:06:39 +-- Dump completed on 2009-08-28 4:00:19 diff --git a/db/rollup.sql b/db/rollup.sql new file mode 100644 index 0000000..deee940 --- /dev/null +++ b/db/rollup.sql @@ -0,0 +1,297 @@ +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ## +-- ## GROUPS / USERS +-- ## + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_groups + +DROP TABLE IF EXISTS `pmgr_groups`; +CREATE TABLE `pmgr_groups` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + -- REVISIT : 20090511 + -- code may not be userful + `code` VARCHAR(12) NOT NULL, -- User style "id" + `name` VARCHAR(80) NOT NULL, + + -- Lower ranks are given higher priority + `rank` SMALLINT UNSIGNED NOT NULL DEFAULT 100, + `comment` VARCHAR(255) DEFAULT NULL, + + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_users + +DROP TABLE IF EXISTS `pmgr_users`; +CREATE TABLE `pmgr_users` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `code` VARCHAR(12) NOT NULL, -- User style "id" + + -- Login details. Passwords are not yet used (and so NULL). + `login` VARCHAR(30) NOT NULL, + `salt` CHAR(12) DEFAULT NULL, + `passhash` VARCHAR(255) DEFAULT NULL, + + -- Contact information for this user + `contact_id` INT(10) UNSIGNED NOT NULL, + + -- Specific comments + `comment` VARCHAR(255) DEFAULT NULL, + + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + + +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ## +-- ## OPTIONS +-- ## + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_options + +DROP TABLE IF EXISTS `pmgr_options`; +CREATE TABLE `pmgr_options` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `name` VARCHAR(50) NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + UNIQUE KEY `name_key` (`name`), + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_option_values + +DROP TABLE IF EXISTS `pmgr_option_values`; +CREATE TABLE `pmgr_option_values` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `option_id` INT(10) UNSIGNED NOT NULL, + `value` VARCHAR(255) NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_default_options + +DROP TABLE IF EXISTS `pmgr_default_options`; +CREATE TABLE `pmgr_default_options` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `option_value_id` INT(10) UNSIGNED NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_group_options + +DROP TABLE IF EXISTS `pmgr_group_options`; +CREATE TABLE `pmgr_group_options` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `group_id` INT(10) UNSIGNED NOT NULL, + `option_value_id` INT(10) UNSIGNED NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + KEY `group_key` (`group_id`), + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_user_options + +DROP TABLE IF EXISTS `pmgr_user_options`; +CREATE TABLE `pmgr_user_options` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `user_id` INT(10) UNSIGNED NOT NULL, + `option_value_id` INT(10) UNSIGNED NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + KEY `user_key` (`user_id`), + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_site_options + +DROP TABLE IF EXISTS `pmgr_site_options`; +CREATE TABLE `pmgr_site_options` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `site_id` INT(10) UNSIGNED NOT NULL, + `option_value_id` INT(10) UNSIGNED NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + KEY `site_key` (`site_id`), + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + + + +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ## +-- ## PERMISSIONS +-- ## + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_permissions + +DROP TABLE IF EXISTS `pmgr_permissions`; +CREATE TABLE `pmgr_permissions` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `name` VARCHAR(50) NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + UNIQUE KEY `name_key` (`name`), + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_permission_values + +DROP TABLE IF EXISTS `pmgr_permission_values`; +CREATE TABLE `pmgr_permission_values` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `permission_id` INT(10) UNSIGNED NOT NULL, + `access` ENUM('ALLOW', + 'DENY') + NOT NULL DEFAULT 'DENY', + `level` SMALLINT UNSIGNED DEFAULT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_default_permissions + +DROP TABLE IF EXISTS `pmgr_default_permissions`; +CREATE TABLE `pmgr_default_permissions` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `permission_value_id` INT(10) UNSIGNED NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_group_permissions + +DROP TABLE IF EXISTS `pmgr_group_permissions`; +CREATE TABLE `pmgr_group_permissions` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `group_id` INT(10) UNSIGNED NOT NULL, + `permission_value_id` INT(10) UNSIGNED NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + KEY `group_key` (`group_id`), + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_user_permissions + +DROP TABLE IF EXISTS `pmgr_user_permissions`; +CREATE TABLE `pmgr_user_permissions` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `user_id` INT(10) UNSIGNED NOT NULL, + `permission_value_id` INT(10) UNSIGNED NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + KEY `user_key` (`user_id`), + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_site_permissions + +DROP TABLE IF EXISTS `pmgr_site_permissions`; +CREATE TABLE `pmgr_site_permissions` ( + `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `site_id` INT(10) UNSIGNED NOT NULL, + `permission_value_id` INT(10) UNSIGNED NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + KEY `site_key` (`site_id`), + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + + +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ###################################################################### +-- ## +-- ## MEMBERSHIPS +-- ## + +DROP TABLE IF EXISTS `pmgr_site_memberships`; + +-- ---------------------------------------------------------------------- +-- ---------------------------------------------------------------------- +-- TABLE pmgr_memberships +-- +-- Which users are allowed to access which sites, +-- and under which set of group permissions (possibly multiple) + +DROP TABLE IF EXISTS `pmgr_memberships`; +CREATE TABLE `pmgr_memberships` ( + `site_id` INT(10) UNSIGNED NOT NULL, + `user_id` INT(10) UNSIGNED NOT NULL, + `group_id` INT(10) UNSIGNED NOT NULL, + `comment` VARCHAR(255) DEFAULT NULL, + + PRIMARY KEY (`site_id`, `user_id`, `group_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + From a66024c88952f1b5c8040d9ddaa39d446329e261 Mon Sep 17 00:00:00 2001 From: abijah Date: Fri, 28 Aug 2009 04:25:53 +0000 Subject: [PATCH 04/11] Fixed the build script; updated users schema to no longer hold password information and to not require contact information; added a set of users and groups for VSS git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@800 97e9348a-65ac-dc4b-aefc-98561f571b83 --- build.cmd | 1 - db/property_manager.sql | 28 +++++++++++++++++++++++++--- db/schema.sql | 8 ++------ 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/build.cmd b/build.cmd index 6be0c4c..5e84573 100644 --- a/build.cmd +++ b/build.cmd @@ -1,4 +1,3 @@ @echo off mysql --user=pmgr --password=pmgruser < %~dp0\db\property_manager.sql -mysql --user=pmgr --password=pmgruser --database=property_manager < %~dp0\db\rollup.sql echo Done! diff --git a/db/property_manager.sql b/db/property_manager.sql index 9c43e65..2c84572 100644 --- a/db/property_manager.sql +++ b/db/property_manager.sql @@ -1734,6 +1734,11 @@ SET character_set_client = @saved_cs_client; LOCK TABLES `pmgr_groups` WRITE; /*!40000 ALTER TABLE `pmgr_groups` DISABLE KEYS */; +INSERT INTO `pmgr_groups` VALUES (1,'Developer','Software Development Group',1,NULL); +INSERT INTO `pmgr_groups` VALUES (2,'Owner','Owner Group',25,NULL); +INSERT INTO `pmgr_groups` VALUES (3,'Admin','Administrator Group',50,NULL); +INSERT INTO `pmgr_groups` VALUES (4,'Manager','Manager Group',75,NULL); +INSERT INTO `pmgr_groups` VALUES (5,'Temp','Temporary Manager',100,NULL); /*!40000 ALTER TABLE `pmgr_groups` ENABLE KEYS */; UNLOCK TABLES; @@ -3629,6 +3634,19 @@ SET character_set_client = @saved_cs_client; LOCK TABLES `pmgr_memberships` WRITE; /*!40000 ALTER TABLE `pmgr_memberships` DISABLE KEYS */; +INSERT INTO `pmgr_memberships` VALUES (1,1,1,NULL); +INSERT INTO `pmgr_memberships` VALUES (1,1,2,NULL); +INSERT INTO `pmgr_memberships` VALUES (1,1,3,NULL); +INSERT INTO `pmgr_memberships` VALUES (1,1,4,NULL); +INSERT INTO `pmgr_memberships` VALUES (1,2,2,NULL); +INSERT INTO `pmgr_memberships` VALUES (1,2,3,NULL); +INSERT INTO `pmgr_memberships` VALUES (1,2,4,NULL); +INSERT INTO `pmgr_memberships` VALUES (1,3,2,NULL); +INSERT INTO `pmgr_memberships` VALUES (1,3,3,NULL); +INSERT INTO `pmgr_memberships` VALUES (1,3,4,NULL); +INSERT INTO `pmgr_memberships` VALUES (1,4,4,NULL); +INSERT INTO `pmgr_memberships` VALUES (1,5,4,NULL); +INSERT INTO `pmgr_memberships` VALUES (1,6,5,NULL); /*!40000 ALTER TABLE `pmgr_memberships` ENABLE KEYS */; UNLOCK TABLES; @@ -6035,9 +6053,7 @@ CREATE TABLE `pmgr_users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `code` varchar(12) NOT NULL, `login` varchar(30) NOT NULL, - `salt` char(12) DEFAULT NULL, - `passhash` varchar(255) DEFAULT NULL, - `contact_id` int(10) unsigned NOT NULL, + `contact_id` int(10) unsigned DEFAULT NULL, `comment` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; @@ -6049,6 +6065,12 @@ SET character_set_client = @saved_cs_client; LOCK TABLES `pmgr_users` WRITE; /*!40000 ALTER TABLE `pmgr_users` DISABLE KEYS */; +INSERT INTO `pmgr_users` VALUES (1,'AP','abijah',NULL,NULL); +INSERT INTO `pmgr_users` VALUES (2,'KD','kevin',NULL,NULL); +INSERT INTO `pmgr_users` VALUES (3,'AB','adam',NULL,NULL); +INSERT INTO `pmgr_users` VALUES (4,'SK','shirley',NULL,NULL); +INSERT INTO `pmgr_users` VALUES (5,'MK','mike',NULL,NULL); +INSERT INTO `pmgr_users` VALUES (6,'DE','dan',NULL,NULL); /*!40000 ALTER TABLE `pmgr_users` ENABLE KEYS */; UNLOCK TABLES; diff --git a/db/schema.sql b/db/schema.sql index 8c6814a..be99fc1 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -274,14 +274,10 @@ DROP TABLE IF EXISTS `pmgr_users`; CREATE TABLE `pmgr_users` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `code` VARCHAR(12) NOT NULL, -- User style "id" - - -- Login details. Passwords are not yet used (and so NULL). - `login` VARCHAR(30) NOT NULL, - `salt` CHAR(12) DEFAULT NULL, - `passhash` VARCHAR(255) DEFAULT NULL, + `login` VARCHAR(30) NOT NULL, -- Contact information for this user - `contact_id` INT(10) UNSIGNED NOT NULL, + `contact_id` INT(10) UNSIGNED DEFAULT NULL, -- Specific comments `comment` VARCHAR(255) DEFAULT NULL, From 43c957baa22727a925a23f1086d793d28bce8ed9 Mon Sep 17 00:00:00 2001 From: abijah Date: Fri, 28 Aug 2009 04:47:33 +0000 Subject: [PATCH 05/11] Added users and groups and a couple basic options (dev & admin) for testing. Since dev/admin is now a database option, the special routing mechanism has been removed. git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@801 97e9348a-65ac-dc4b-aefc-98561f571b83 --- db/property_manager.sql | 10 ++ db/rollup.sql | 297 ------------------------------------- site/app_controller.php | 6 +- site/app_helper.php | 8 - site/config/routes.php | 16 -- site/models/option.php | 11 +- site/models/permission.php | 2 +- 7 files changed, 23 insertions(+), 327 deletions(-) delete mode 100644 db/rollup.sql diff --git a/db/property_manager.sql b/db/property_manager.sql index 2c84572..3566cd4 100644 --- a/db/property_manager.sql +++ b/db/property_manager.sql @@ -851,6 +851,8 @@ SET character_set_client = @saved_cs_client; LOCK TABLES `pmgr_default_options` WRITE; /*!40000 ALTER TABLE `pmgr_default_options` DISABLE KEYS */; +INSERT INTO `pmgr_default_options` VALUES (1,1,NULL); +INSERT INTO `pmgr_default_options` VALUES (2,3,NULL); /*!40000 ALTER TABLE `pmgr_default_options` ENABLE KEYS */; UNLOCK TABLES; @@ -1682,6 +1684,8 @@ SET character_set_client = @saved_cs_client; LOCK TABLES `pmgr_group_options` WRITE; /*!40000 ALTER TABLE `pmgr_group_options` DISABLE KEYS */; +INSERT INTO `pmgr_group_options` VALUES (1,1,2,NULL); +INSERT INTO `pmgr_group_options` VALUES (2,2,4,NULL); /*!40000 ALTER TABLE `pmgr_group_options` ENABLE KEYS */; UNLOCK TABLES; @@ -3700,6 +3704,10 @@ SET character_set_client = @saved_cs_client; LOCK TABLES `pmgr_option_values` WRITE; /*!40000 ALTER TABLE `pmgr_option_values` DISABLE KEYS */; +INSERT INTO `pmgr_option_values` VALUES (1,1,'0',NULL); +INSERT INTO `pmgr_option_values` VALUES (2,1,'1',NULL); +INSERT INTO `pmgr_option_values` VALUES (3,2,'0',NULL); +INSERT INTO `pmgr_option_values` VALUES (4,2,'1',NULL); /*!40000 ALTER TABLE `pmgr_option_values` ENABLE KEYS */; UNLOCK TABLES; @@ -3725,6 +3733,8 @@ SET character_set_client = @saved_cs_client; LOCK TABLES `pmgr_options` WRITE; /*!40000 ALTER TABLE `pmgr_options` DISABLE KEYS */; +INSERT INTO `pmgr_options` VALUES (1,'dev','Developer Flag'); +INSERT INTO `pmgr_options` VALUES (2,'admin','Administrator Flag'); /*!40000 ALTER TABLE `pmgr_options` ENABLE KEYS */; UNLOCK TABLES; diff --git a/db/rollup.sql b/db/rollup.sql deleted file mode 100644 index deee940..0000000 --- a/db/rollup.sql +++ /dev/null @@ -1,297 +0,0 @@ --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ## --- ## GROUPS / USERS --- ## - - --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_groups - -DROP TABLE IF EXISTS `pmgr_groups`; -CREATE TABLE `pmgr_groups` ( - `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, - -- REVISIT : 20090511 - -- code may not be userful - `code` VARCHAR(12) NOT NULL, -- User style "id" - `name` VARCHAR(80) NOT NULL, - - -- Lower ranks are given higher priority - `rank` SMALLINT UNSIGNED NOT NULL DEFAULT 100, - `comment` VARCHAR(255) DEFAULT NULL, - - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - - --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_users - -DROP TABLE IF EXISTS `pmgr_users`; -CREATE TABLE `pmgr_users` ( - `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, - `code` VARCHAR(12) NOT NULL, -- User style "id" - - -- Login details. Passwords are not yet used (and so NULL). - `login` VARCHAR(30) NOT NULL, - `salt` CHAR(12) DEFAULT NULL, - `passhash` VARCHAR(255) DEFAULT NULL, - - -- Contact information for this user - `contact_id` INT(10) UNSIGNED NOT NULL, - - -- Specific comments - `comment` VARCHAR(255) DEFAULT NULL, - - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - - --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ## --- ## OPTIONS --- ## - - --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_options - -DROP TABLE IF EXISTS `pmgr_options`; -CREATE TABLE `pmgr_options` ( - `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, - `name` VARCHAR(50) NOT NULL, - `comment` VARCHAR(255) DEFAULT NULL, - UNIQUE KEY `name_key` (`name`), - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_option_values - -DROP TABLE IF EXISTS `pmgr_option_values`; -CREATE TABLE `pmgr_option_values` ( - `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, - `option_id` INT(10) UNSIGNED NOT NULL, - `value` VARCHAR(255) NOT NULL, - `comment` VARCHAR(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_default_options - -DROP TABLE IF EXISTS `pmgr_default_options`; -CREATE TABLE `pmgr_default_options` ( - `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, - `option_value_id` INT(10) UNSIGNED NOT NULL, - `comment` VARCHAR(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_group_options - -DROP TABLE IF EXISTS `pmgr_group_options`; -CREATE TABLE `pmgr_group_options` ( - `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, - `group_id` INT(10) UNSIGNED NOT NULL, - `option_value_id` INT(10) UNSIGNED NOT NULL, - `comment` VARCHAR(255) DEFAULT NULL, - KEY `group_key` (`group_id`), - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_user_options - -DROP TABLE IF EXISTS `pmgr_user_options`; -CREATE TABLE `pmgr_user_options` ( - `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, - `user_id` INT(10) UNSIGNED NOT NULL, - `option_value_id` INT(10) UNSIGNED NOT NULL, - `comment` VARCHAR(255) DEFAULT NULL, - KEY `user_key` (`user_id`), - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_site_options - -DROP TABLE IF EXISTS `pmgr_site_options`; -CREATE TABLE `pmgr_site_options` ( - `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, - `site_id` INT(10) UNSIGNED NOT NULL, - `option_value_id` INT(10) UNSIGNED NOT NULL, - `comment` VARCHAR(255) DEFAULT NULL, - KEY `site_key` (`site_id`), - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - - - --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ## --- ## PERMISSIONS --- ## - --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_permissions - -DROP TABLE IF EXISTS `pmgr_permissions`; -CREATE TABLE `pmgr_permissions` ( - `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, - `name` VARCHAR(50) NOT NULL, - `comment` VARCHAR(255) DEFAULT NULL, - UNIQUE KEY `name_key` (`name`), - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_permission_values - -DROP TABLE IF EXISTS `pmgr_permission_values`; -CREATE TABLE `pmgr_permission_values` ( - `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, - `permission_id` INT(10) UNSIGNED NOT NULL, - `access` ENUM('ALLOW', - 'DENY') - NOT NULL DEFAULT 'DENY', - `level` SMALLINT UNSIGNED DEFAULT NULL, - `comment` VARCHAR(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_default_permissions - -DROP TABLE IF EXISTS `pmgr_default_permissions`; -CREATE TABLE `pmgr_default_permissions` ( - `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, - `permission_value_id` INT(10) UNSIGNED NOT NULL, - `comment` VARCHAR(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_group_permissions - -DROP TABLE IF EXISTS `pmgr_group_permissions`; -CREATE TABLE `pmgr_group_permissions` ( - `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, - `group_id` INT(10) UNSIGNED NOT NULL, - `permission_value_id` INT(10) UNSIGNED NOT NULL, - `comment` VARCHAR(255) DEFAULT NULL, - KEY `group_key` (`group_id`), - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_user_permissions - -DROP TABLE IF EXISTS `pmgr_user_permissions`; -CREATE TABLE `pmgr_user_permissions` ( - `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, - `user_id` INT(10) UNSIGNED NOT NULL, - `permission_value_id` INT(10) UNSIGNED NOT NULL, - `comment` VARCHAR(255) DEFAULT NULL, - KEY `user_key` (`user_id`), - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_site_permissions - -DROP TABLE IF EXISTS `pmgr_site_permissions`; -CREATE TABLE `pmgr_site_permissions` ( - `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, - `site_id` INT(10) UNSIGNED NOT NULL, - `permission_value_id` INT(10) UNSIGNED NOT NULL, - `comment` VARCHAR(255) DEFAULT NULL, - KEY `site_key` (`site_id`), - PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - - - --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ###################################################################### --- ## --- ## MEMBERSHIPS --- ## - -DROP TABLE IF EXISTS `pmgr_site_memberships`; - --- ---------------------------------------------------------------------- --- ---------------------------------------------------------------------- --- TABLE pmgr_memberships --- --- Which users are allowed to access which sites, --- and under which set of group permissions (possibly multiple) - -DROP TABLE IF EXISTS `pmgr_memberships`; -CREATE TABLE `pmgr_memberships` ( - `site_id` INT(10) UNSIGNED NOT NULL, - `user_id` INT(10) UNSIGNED NOT NULL, - `group_id` INT(10) UNSIGNED NOT NULL, - `comment` VARCHAR(255) DEFAULT NULL, - - PRIMARY KEY (`site_id`, `user_id`, `group_id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8; - diff --git a/site/app_controller.php b/site/app_controller.php index 5de4601..13fd507 100644 --- a/site/app_controller.php +++ b/site/app_controller.php @@ -279,10 +279,8 @@ class AppController extends Controller { */ function beforeFilter() { - $this->params['dev'] = - (!empty($this->params['dev_route'])); - $this->params['admin'] = - (!empty($this->params['admin_route']) || !empty($this->params['dev_route'])); + $this->params['dev'] = $this->Option->enabled('dev'); + $this->params['admin'] = $this->Option->enabled('admin'); if (!$this->params['dev']) Configure::write('debug', '0'); diff --git a/site/app_helper.php b/site/app_helper.php index 1b5e0b1..1c797e3 100644 --- a/site/app_helper.php +++ b/site/app_helper.php @@ -38,13 +38,5 @@ App::import('Core', 'Helper'); */ class AppHelper extends Helper { - function url($url = null, $full = false) { - foreach(array('admin_route', 'dev_route') AS $mod) { - if (isset($this->params[$mod]) && is_array($url) && !isset($url[$mod])) - $url[$mod] = $this->params[$mod]; - } - return parent::url($url, $full); - } - } ?> \ No newline at end of file diff --git a/site/config/routes.php b/site/config/routes.php index 01d09ac..7a9ad16 100644 --- a/site/config/routes.php +++ b/site/config/routes.php @@ -36,20 +36,4 @@ $default_path = array('controller' => 'maps', 'action' => 'view', '1'); */ Router::connect('/', $default_path); -/* - * Route for admin functionality - */ -Router::connect('/admin', - array('admin_route' => true) + $default_path); -Router::connect('/admin/:controller/:action/*', - array('admin_route' => true, 'action' => null)); - -/* - * Route for development functionality - */ -Router::connect('/dev', - array('dev_route' => true) + $default_path); -Router::connect('/dev/:controller/:action/*', - array('dev_route' => true, 'action' => null)); - ?> \ No newline at end of file diff --git a/site/models/option.php b/site/models/option.php index bc2830c..c1373ca 100644 --- a/site/models/option.php +++ b/site/models/option.php @@ -12,7 +12,7 @@ class Option extends AppModel { static $option_set = array(); function getAll($name) { - $this->prClassLevel(30); +/* $this->prClassLevel(30); */ /* //$this->OptionValue->prClassLevel(30); */ /* $this->Group->Membership->prClassLevel(30); */ /* $this->OptionValue->SiteOption->prClassLevel(30); */ @@ -64,4 +64,13 @@ class Option extends AppModel { return $this->prReturn($values[0]); } + function enabled($name) { + $val = $this->get($name); + return (!empty($val)); + } + + function disabled($name) { + return (!$this->enabled($name)); + } + } diff --git a/site/models/permission.php b/site/models/permission.php index 38a9660..a5ba85d 100644 --- a/site/models/permission.php +++ b/site/models/permission.php @@ -11,7 +11,7 @@ class Permission extends AppModel { static $permission_set = array(); function getAll($name, $force = false) { - $this->prClassLevel(30); +/* $this->prClassLevel(30); */ /* $this->PermissionValue->prClassLevel(30); */ /* $this->Group->Membership->prClassLevel(30); */ /* $this->PermissionValue->SitePermission->prClassLevel(30); */ From a3b376544c6ed7f62f7dadced6c9212b8f577fc2 Mon Sep 17 00:00:00 2001 From: abijah Date: Fri, 28 Aug 2009 07:11:14 +0000 Subject: [PATCH 06/11] Replaced the hardcoded 'level' checks, and incorporated (as a first pass) the new permission mechanism git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@802 97e9348a-65ac-dc4b-aefc-98561f571b83 --- db/property_manager.sql | 9 ++++++++ site/controllers/accounts_controller.php | 10 ++++----- .../controllers/double_entries_controller.php | 6 ++++++ .../controllers/ledger_entries_controller.php | 16 +++++++------- site/controllers/ledgers_controller.php | 18 +++++++++------- .../statement_entries_controller.php | 17 ++++++++------- site/controllers/tenders_controller.php | 2 +- site/controllers/transactions_controller.php | 21 ++++++------------- site/models/permission.php | 3 +++ site/views/double_entries/view.ctp | 20 +++++++++++------- site/views/elements/ledgers.ctp | 8 +++---- site/views/statement_entries/view.ctp | 10 +++++---- site/views/transactions/view.ctp | 21 ++++++++++++------- 13 files changed, 92 insertions(+), 69 deletions(-) diff --git a/db/property_manager.sql b/db/property_manager.sql index 3566cd4..4a3e1f1 100644 --- a/db/property_manager.sql +++ b/db/property_manager.sql @@ -877,6 +877,7 @@ SET character_set_client = @saved_cs_client; LOCK TABLES `pmgr_default_permissions` WRITE; /*!40000 ALTER TABLE `pmgr_default_permissions` DISABLE KEYS */; +INSERT INTO `pmgr_default_permissions` VALUES (1,1,NULL); /*!40000 ALTER TABLE `pmgr_default_permissions` ENABLE KEYS */; UNLOCK TABLES; @@ -1712,6 +1713,9 @@ SET character_set_client = @saved_cs_client; LOCK TABLES `pmgr_group_permissions` WRITE; /*!40000 ALTER TABLE `pmgr_group_permissions` DISABLE KEYS */; +INSERT INTO `pmgr_group_permissions` VALUES (1,1,4,NULL); +INSERT INTO `pmgr_group_permissions` VALUES (2,2,4,NULL); +INSERT INTO `pmgr_group_permissions` VALUES (3,3,3,NULL); /*!40000 ALTER TABLE `pmgr_group_permissions` ENABLE KEYS */; UNLOCK TABLES; @@ -3761,6 +3765,10 @@ SET character_set_client = @saved_cs_client; LOCK TABLES `pmgr_permission_values` WRITE; /*!40000 ALTER TABLE `pmgr_permission_values` DISABLE KEYS */; +INSERT INTO `pmgr_permission_values` VALUES (1,1,'DENY',NULL,NULL); +INSERT INTO `pmgr_permission_values` VALUES (2,1,'ALLOW',10,NULL); +INSERT INTO `pmgr_permission_values` VALUES (3,1,'ALLOW',5,NULL); +INSERT INTO `pmgr_permission_values` VALUES (4,1,'ALLOW',1,NULL); /*!40000 ALTER TABLE `pmgr_permission_values` ENABLE KEYS */; UNLOCK TABLES; @@ -3786,6 +3794,7 @@ SET character_set_client = @saved_cs_client; LOCK TABLES `pmgr_permissions` WRITE; /*!40000 ALTER TABLE `pmgr_permissions` DISABLE KEYS */; +INSERT INTO `pmgr_permissions` VALUES (1,'controller.accounts',NULL); /*!40000 ALTER TABLE `pmgr_permissions` ENABLE KEYS */; UNLOCK TABLES; diff --git a/site/controllers/accounts_controller.php b/site/controllers/accounts_controller.php index 2fcd4c1..c7d1a77 100644 --- a/site/controllers/accounts_controller.php +++ b/site/controllers/accounts_controller.php @@ -98,9 +98,8 @@ class AccountsController extends AppController { $conditions[] = array('Account.type' => strtoupper($params['action'])); } - // REVISIT : 20090811 - // No security issues have been worked out yet - $conditions[] = array('Account.level >=' => 10); + $conditions[] = array('Account.level >=' => + $this->Permission->level('controller.accounts')); return $conditions; } @@ -181,9 +180,8 @@ class AccountsController extends AppController { ('order' => array('CloseTransaction.stamp' => 'DESC'))), ), 'conditions' => array(array('Account.id' => $id), - // REVISIT : 20090811 - // No security issues have been worked out yet - array('Account.level >=' => 10), + array('Account.level >=' => + $this->Permission->level('controller.accounts')), ), ) ); diff --git a/site/controllers/double_entries_controller.php b/site/controllers/double_entries_controller.php index 1d4f494..479fb2c 100644 --- a/site/controllers/double_entries_controller.php +++ b/site/controllers/double_entries_controller.php @@ -34,6 +34,9 @@ class DoubleEntriesController extends AppController { array('contain' => array('Ledger' => array('Account')), 'conditions' => array('DebitEntry.id' => $entry['DebitEntry']['id']), )); + $entry['Ledger']['link'] = + $entry['Ledger']['Account']['level'] >= + $this->Permission->level('controller.accounts'); $entry['DebitLedger'] = $entry['Ledger']; unset($entry['Ledger']); @@ -42,6 +45,9 @@ class DoubleEntriesController extends AppController { array('contain' => array('Ledger' => array('Account')), 'conditions' => array('CreditEntry.id' => $entry['CreditEntry']['id']), )); + $entry['Ledger']['link'] = + $entry['Ledger']['Account']['level'] >= + $this->Permission->level('controller.accounts'); $entry['CreditLedger'] = $entry['Ledger']; unset($entry['Ledger']); diff --git a/site/controllers/ledger_entries_controller.php b/site/controllers/ledger_entries_controller.php index cd7d855..be78cc7 100644 --- a/site/controllers/ledger_entries_controller.php +++ b/site/controllers/ledger_entries_controller.php @@ -117,8 +117,12 @@ class LedgerEntriesController extends AppController { function gridDataPostProcessLinks(&$params, &$model, &$records, $links) { $links['LedgerEntry'] = array('id'); $links['Transaction'] = array('id'); - $links['Ledger'] = array('id'); - $links['Account'] = array('controller' => 'accounts', 'name'); + // REVISIT : 20090827 + // Need to take 'level' into account + if ($this->Permission->allow('controller.accounts')) { + $links['Ledger'] = array('id'); + $links['Account'] = array('name'); + } $links['Tender'] = array('name'); return parent::gridDataPostProcessLinks($params, $model, $records, $links); } @@ -144,12 +148,8 @@ class LedgerEntriesController extends AppController { array('fields' => array('id', 'sequence', 'name'), 'Account' => array('fields' => array('id', 'name', 'type'), - 'conditions' => - // REVISIT : 20090811 - // No security issues have been worked out yet - array('Account.level >=' => 5), - ), - ), + ), + ), 'Tender' => array('fields' => array('id', 'name'), diff --git a/site/controllers/ledgers_controller.php b/site/controllers/ledgers_controller.php index 60211a3..3cfb46a 100644 --- a/site/controllers/ledgers_controller.php +++ b/site/controllers/ledgers_controller.php @@ -86,9 +86,8 @@ class LedgersController extends AppController { $conditions[] = array('Ledger.close_transaction_id !=' => null); } - // REVISIT : 20090811 - // No security issues have been worked out yet - $conditions[] = array('Account.level >=' => 10); + $conditions[] = array('Account.level >=' => + $this->Permission->level('controller.accounts')); return $conditions; } @@ -107,8 +106,12 @@ class LedgersController extends AppController { } function gridDataPostProcessLinks(&$params, &$model, &$records, $links) { - $links['Ledger'] = array('name'); - $links['Account'] = array('name'); + // REVISIT : 20090827 + // Need to take 'level' into account + if ($this->Permission->allow('controller.accounts')) { + $links['Ledger'] = array('sequence'); + $links['Account'] = array('name'); + } return parent::gridDataPostProcessLinks($params, $model, $records, $links); } @@ -128,9 +131,8 @@ class LedgersController extends AppController { 'Account', ), 'conditions' => array(array('Ledger.id' => $id), - // REVISIT : 20090811 - // No security issues have been worked out yet - array('Account.level >=' => 10), + array('Account.level >=' => + $this->Permission->level('controller.accounts')), ), ) ); diff --git a/site/controllers/statement_entries_controller.php b/site/controllers/statement_entries_controller.php index 2682bea..c14333f 100644 --- a/site/controllers/statement_entries_controller.php +++ b/site/controllers/statement_entries_controller.php @@ -108,11 +108,10 @@ class StatementEntriesController extends AppController { if (isset($customer_id)) $conditions[] = array('StatementEntry.customer_id' => $customer_id); - if (isset($statement_entry_id)) { + if (isset($statement_entry_id)) $conditions[] = array('OR' => array(array('ChargeEntry.id' => $statement_entry_id), array('DisbursementEntry.id' => $statement_entry_id))); - } if ($params['action'] === 'unreconciled') { $query = array('conditions' => $conditions); @@ -132,7 +131,10 @@ class StatementEntriesController extends AppController { function gridDataPostProcessLinks(&$params, &$model, &$records, $links) { $links['StatementEntry'] = array('id'); $links['Transaction'] = array('id'); - $links['Account'] = array('name'); + // REVISIT : 20090827 + // Need to take 'level' into account + if ($this->Permission->allow('controller.accounts')) + $links['Account'] = array('name'); $links['Customer'] = array('name'); $links['Lease'] = array('number'); $links['Unit'] = array('name'); @@ -253,15 +255,12 @@ class StatementEntriesController extends AppController { ('first', array('contain' => array ('Transaction' => array('fields' => array('id', 'type', 'stamp')), - 'Account' => array('id', 'name', 'type'), + 'Account' => array('id', 'name', 'type', 'level'), 'Customer' => array('fields' => array('id', 'name')), 'Lease' => array('fields' => array('id', 'number')), ), 'conditions' => array(array('StatementEntry.id' => $id), - // REVISIT : 20090811 - // No security issues have been worked out yet - array('Account.level >=' => 5) ), )); @@ -270,6 +269,10 @@ class StatementEntriesController extends AppController { $this->redirect(array('controller' => 'accounts', 'action'=>'index')); } + $entry['Account']['link'] = + $entry['Account']['level'] >= + $this->Permission->level('controller.accounts'); + $stats = $this->StatementEntry->stats($id); if (in_array(strtoupper($entry['StatementEntry']['type']), $this->StatementEntry->debitTypes())) diff --git a/site/controllers/tenders_controller.php b/site/controllers/tenders_controller.php index de3b909..53619d2 100644 --- a/site/controllers/tenders_controller.php +++ b/site/controllers/tenders_controller.php @@ -62,7 +62,7 @@ class TendersController extends AppController { function gridDataPostProcessLinks(&$params, &$model, &$records, $links) { $links['Tender'] = array('name', 'id'); $links['Customer'] = array('name'); - $links['TenderType'] = array('name'); + //$links['TenderType'] = array('name'); return parent::gridDataPostProcessLinks($params, $model, $records, $links); } diff --git a/site/controllers/transactions_controller.php b/site/controllers/transactions_controller.php index 4b666da..05bdc48 100644 --- a/site/controllers/transactions_controller.php +++ b/site/controllers/transactions_controller.php @@ -95,10 +95,6 @@ class TransactionsController extends AppController { if (in_array($params['action'], array('invoice', 'receipt', 'deposit'))) $conditions[] = array('Transaction.type' => strtoupper($params['action'])); - // REVISIT : 20090811 - // No security issues have been worked out yet - $conditions[] = array('Account.level >=' => 5); - return $conditions; } @@ -399,28 +395,23 @@ class TransactionsController extends AppController { ('first', array('contain' => array(// Models - 'Account(id,name)', + 'Account(id,name,level)', 'Ledger(id,sequence)', 'NsfTender(id,name)', ), 'conditions' => array(array('Transaction.id' => $id), - // REVISIT : 20090811 - // No security issues have been worked out yet - array('OR' => - array(array('Account.level >=' => 5), - array('Account.id' => null))), ), )); - // REVISIT : 20090815 - // for debug purposes only (pr output) - $this->Transaction->stats($id); - if (empty($transaction)) { $this->Session->setFlash(__('Invalid Item.', true)); $this->redirect(array('action'=>'index')); } + $transaction['Account']['link'] = + $transaction['Account']['level'] >= + $this->Permission->level('controller.accounts'); + if ($transaction['Transaction']['type'] === 'DEPOSIT') $this->addSideMenuLink('View Slip', array('action' => 'deposit_slip', $id), null, @@ -452,7 +443,7 @@ class TransactionsController extends AppController { // Build a container for the deposit slip data $deposit = array('types' => array()); - $this->id = $id; + $this->Transaction->id = $id; $deposit += $this->Transaction->find('first', array('contain' => false)); diff --git a/site/models/permission.php b/site/models/permission.php index a5ba85d..f4b5ac2 100644 --- a/site/models/permission.php +++ b/site/models/permission.php @@ -79,6 +79,9 @@ class Permission extends AppModel { if (empty($result['level']) || (!empty($value['level']) && $value['level'] < $result['level'])) $result['level'] = $value['level']; + if ($result['access'] !== 'ALLOW') + $result['level'] = 9999999; + return $this->prReturn($result); } diff --git a/site/views/double_entries/view.ctp b/site/views/double_entries/view.ctp index 112a513..5c2a53b 100644 --- a/site/views/double_entries/view.ctp +++ b/site/views/double_entries/view.ctp @@ -56,14 +56,18 @@ foreach ($ledgers AS $type => $ledger) { /* array('controller' => 'entries', */ /* 'action' => 'view', */ /* $entries[$type]['id']))); */ - $rows[] = array('Account', $html->link($ledger['Account']['name'], - array('controller' => 'accounts', - 'action' => 'view', - $ledger['Account']['id']))); - $rows[] = array('Ledger', $html->link('#' . $ledger['sequence'], - array('controller' => 'ledgers', - 'action' => 'view', - $ledger['id']))); + $rows[] = array('Account', ($ledger['link'] + ? $html->link($ledger['Account']['name'], + array('controller' => 'accounts', + 'action' => 'view', + $ledger['Account']['id'])) + : $ledger['Account']['name'])); + $rows[] = array('Ledger', ($ledger['link'] + ? $html->link('#' . $ledger['sequence'], + array('controller' => 'ledgers', + 'action' => 'view', + $ledger['id'])) + : '#' . $ledger['sequence'])); $rows[] = array('Amount', FormatHelper::currency($entries[$type]['amount'])); //$rows[] = array('Effect', $ledger['Account']['ftype'] == $type ? 'INCREASE' : 'DECREASE'); diff --git a/site/views/elements/ledgers.ctp b/site/views/elements/ledgers.ctp index e83695c..d7ee285 100644 --- a/site/views/elements/ledgers.ctp +++ b/site/views/elements/ledgers.ctp @@ -15,8 +15,8 @@ $cols['Balance'] = array('index' => 'balance', 'formatter' => 'c // Render the grid $grid ->columns($cols) -->sortField('Account') -->defaultFields(array('Account', 'Sequence')) -->searchFields(array('Account', 'Comment')) +->sortField('Sequence') +->defaultFields(array('Sequence')) +->searchFields(array('Comment')) ->render($this, isset($config) ? $config : null, - array_diff(array_keys($cols), array('Open Date', 'Comment'))); + array_diff(array_keys($cols), array('Account', 'Open Date', 'Comment'))); diff --git a/site/views/statement_entries/view.ctp b/site/views/statement_entries/view.ctp index 1e030a3..f1208e0 100644 --- a/site/views/statement_entries/view.ctp +++ b/site/views/statement_entries/view.ctp @@ -29,10 +29,12 @@ if (in_array($entry['type'], array('CHARGE', 'PAYMENT'))) $rows[] = array('Through', FormatHelper::date($entry['through_date'])); $rows[] = array('Type', $entry['type']); $rows[] = array('Amount', FormatHelper::currency($entry['amount'])); -$rows[] = array('Account', $html->link($account['name'], - array('controller' => 'accounts', - 'action' => 'view', - $account['id']))); +$rows[] = array('Account', ($account['link'] + ? $html->link($account['name'], + array('controller' => 'accounts', + 'action' => 'view', + $account['id'])) + : $account['name'])); $rows[] = array('Customer', (isset($customer['name']) ? $html->link($customer['name'], array('controller' => 'customers', diff --git a/site/views/transactions/view.ctp b/site/views/transactions/view.ctp index f2fc83b..4daffa6 100644 --- a/site/views/transactions/view.ctp +++ b/site/views/transactions/view.ctp @@ -21,14 +21,19 @@ $rows[] = array('ID', $transaction['id']); $rows[] = array('Type', str_replace('_', ' ', $transaction['type'])); $rows[] = array('Timestamp', FormatHelper::datetime($transaction['stamp'])); $rows[] = array('Amount', FormatHelper::currency($transaction['amount'])); -$rows[] = array('Account', $html->link($account['name'], - array('controller' => 'accounts', - 'action' => 'view', - $account['id']))); -$rows[] = array('Ledger', $html->link('#' . $ledger['sequence'], - array('controller' => 'ledgers', - 'action' => 'view', - $ledger['id']))); +$rows[] = array('Account', ($account['link'] + ? $html->link($account['name'], + array('controller' => 'accounts', + 'action' => 'view', + $account['id'])) + : $account['name'])); +$rows[] = array('Ledger', ($account['link'] + ? $html->link('#' . $ledger['sequence'], + array('controller' => 'ledgers', + 'action' => 'view', + $ledger['id'])) + : '#' . $ledger['sequence'])); + if (!empty($nsf_tender['id'])) $rows[] = array('NSF Tender', $html->link($nsf_tender['name'], array('controller' => 'tenders', From a79adbce2d217a7c7ffc24f3865a77fd0d587453 Mon Sep 17 00:00:00 2001 From: abijah Date: Fri, 28 Aug 2009 16:32:21 +0000 Subject: [PATCH 07/11] Moved the creation actions into the CONTROLLER menu. Minor cleanup of deposit_slip. Minor tweaking to views. git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@803 97e9348a-65ac-dc4b-aefc-98561f571b83 --- site/controllers/customers_controller.php | 2 +- site/controllers/transactions_controller.php | 24 +++++++++----------- site/views/tenders/view.ctp | 2 +- site/views/transactions/view.ctp | 9 ++------ 4 files changed, 15 insertions(+), 22 deletions(-) diff --git a/site/controllers/customers_controller.php b/site/controllers/customers_controller.php index be4ec30..2106c16 100644 --- a/site/controllers/customers_controller.php +++ b/site/controllers/customers_controller.php @@ -25,7 +25,7 @@ class CustomersController extends AppController { $this->addSideMenuLink('New Customer', array('controller' => 'customers', 'action' => 'add'), null, - 'ACTION', $this->new_area); + 'CONTROLLER', $this->new_area); } diff --git a/site/controllers/transactions_controller.php b/site/controllers/transactions_controller.php index 05bdc48..6330080 100644 --- a/site/controllers/transactions_controller.php +++ b/site/controllers/transactions_controller.php @@ -50,7 +50,7 @@ class TransactionsController extends AppController { function deposit() { $this->addSideMenuLink('New Deposit', array('controller' => 'tenders', 'action' => 'deposit'), null, - 'ACTION', $this->new_area); + 'CONTROLLER', $this->new_area); $this->gridView('Deposits'); } @@ -276,7 +276,7 @@ class TransactionsController extends AppController { $this->Session->setFlash(__('Unable to Create Deposit', true)); $this->redirect(array('controller' => 'tenders', 'action'=>'deposit')); } - + // Present the deposit slip to the user $this->redirect(array('controller' => 'transactions', 'action' => 'deposit_slip', @@ -440,15 +440,12 @@ class TransactionsController extends AppController { */ function deposit_slip($id) { - // Build a container for the deposit slip data - $deposit = array('types' => array()); - + // Find the deposit transaction $this->Transaction->id = $id; - $deposit += - $this->Transaction->find('first', array('contain' => false)); + $deposit = $this->Transaction->find('first', array('contain' => false)); // Get a summary of all forms of tender in the deposit - $result = $this->Transaction->find + $tenders = $this->Transaction->find ('all', array('link' => array('DepositTender' => array('fields' => array(), @@ -463,16 +460,17 @@ class TransactionsController extends AppController { 'group' => 'TenderType.id', )); - if (empty($result)) { - die(); + // Verify the deposit exists, and that something was actually deposited + if (empty($deposit) || empty($tenders)) { $this->Session->setFlash(__('Invalid Deposit.', true)); $this->redirect(array('action'=>'deposit')); } // Add the summary to our deposit slip data container - foreach ($result AS $type) { - $deposit['types'][$type['TenderType']['id']] = - $type['TenderType'] + $type[0]; + $deposit['types'] = array(); + foreach ($tenders AS $tender) { + $deposit['types'][$tender['TenderType']['id']] = + $tender['TenderType'] + $tender[0]; } $deposit_total = 0; diff --git a/site/views/tenders/view.ctp b/site/views/tenders/view.ctp index 2b7e7c1..5691ca6 100644 --- a/site/views/tenders/view.ctp +++ b/site/views/tenders/view.ctp @@ -36,7 +36,7 @@ for ($i=1; $i<=4; ++$i) if (!empty($tender['deposit_transaction_id'])) $rows[] = array('Deposit', $html->link('#'.$tender['deposit_transaction_id'], array('controller' => 'transactions', - 'action' => 'view', + 'action' => 'deposit_slip', $tender['deposit_transaction_id']))); if (!empty($tender['nsf_transaction_id'])) diff --git a/site/views/transactions/view.ctp b/site/views/transactions/view.ctp index 4daffa6..6bbb9ab 100644 --- a/site/views/transactions/view.ctp +++ b/site/views/transactions/view.ctp @@ -27,18 +27,13 @@ $rows[] = array('Account', ($account['link'] 'action' => 'view', $account['id'])) : $account['name'])); -$rows[] = array('Ledger', ($account['link'] - ? $html->link('#' . $ledger['sequence'], - array('controller' => 'ledgers', - 'action' => 'view', - $ledger['id'])) - : '#' . $ledger['sequence'])); - + if (!empty($nsf_tender['id'])) $rows[] = array('NSF Tender', $html->link($nsf_tender['name'], array('controller' => 'tenders', 'action' => 'view', $nsf_tender['id']))); + $rows[] = array('Comment', $transaction['comment']); echo $this->element('table', From c21cdcd9a2b36a7a1ec40f5ae71040c62920297d Mon Sep 17 00:00:00 2001 From: abijah Date: Fri, 28 Aug 2009 16:34:01 +0000 Subject: [PATCH 08/11] Added server request vars, mostly to include the referer. Added timestamps and tweaked formatting slightly. git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@804 97e9348a-65ac-dc4b-aefc-98561f571b83 --- site/config/bootstrap.php | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/site/config/bootstrap.php b/site/config/bootstrap.php index 06af98a..25d4a63 100644 --- a/site/config/bootstrap.php +++ b/site/config/bootstrap.php @@ -32,6 +32,10 @@ * */ +function server_request_var($var) { + return (preg_match("/^HTTP/", $var)); +} + function INTERNAL_ERROR($message, $exit = true, $drop = 0) { echo '
' . "\n"; echo '

INTERNAL ERROR:

' . "\n"; @@ -62,9 +66,18 @@ function INTERNAL_ERROR($message, $exit = true, $drop = 0) { echo "\n"; echo '
' . "\nHTTP Request:\n"; - echo '

' . "\n";
+  echo '

' . "\n";
   print_r($_REQUEST);
-  echo "\n
\n"; + echo "
\n"; + + echo '
' . "\nServer:\n"; + echo '

' . "\n";
+  print_r(array_intersect_key($_SERVER, array_flip(array_filter(array_keys($_SERVER), 'server_request_var'))));
+  echo "
\n"; + + echo '
' . "\n"; + echo 'Started: ' . date('c', $_SERVER['REQUEST_TIME']) . "
\n"; + echo 'Current: ' . date('c') . "
\n"; echo '
'; if ($exit) From 5b5707df5ebd2795c3a202abedd009f466938623 Mon Sep 17 00:00:00 2001 From: abijah Date: Fri, 28 Aug 2009 16:41:17 +0000 Subject: [PATCH 09/11] Fixed a bug with deposit, which prevented update to the deposited tenders. Added INTERNAL_ERROR when an error occurs. Since the module and callers make no effort to roll back changes when an error occurs, it's probably best to just halt. We may need to remove some of these checks, especially in the verifyTransaction function, which is intended to catch errors before they create a problem in the database. git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@805 97e9348a-65ac-dc4b-aefc-98561f571b83 --- site/models/transaction.php | 41 +++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/site/models/transaction.php b/site/models/transaction.php index de8923a..bdce007 100644 --- a/site/models/transaction.php +++ b/site/models/transaction.php @@ -350,10 +350,14 @@ class Transaction extends AppModel { if (isset($ids['transaction_id'])) $ids['deposit_id'] = $ids['transaction_id']; - if (!empty($ids['deposit_id']) && !empty($control['update_tender'])) { + $this->pr(21, array_intersect_key($ids, array('deposit_id'=>1)) + + array_intersect_key($data['control'], array('update_tender'=>1))); + + if (!empty($ids['deposit_id']) && !empty($data['control']['update_tender'])) { + $this->pr(21, compact('tender_groups')); foreach ($tender_groups AS $group => $tender_ids) { $entry_id = $ids['entries'][$group]['DoubleEntry']['Entry2']['ledger_entry_id']; - $this->pr(10, compact('group', 'tender_ids', 'entry_id')); + $this->pr(19, compact('group', 'tender_ids', 'entry_id')); $this->LedgerEntry->Tender->updateAll (array('Tender.deposit_transaction_id' => $ids['deposit_id'], 'Tender.deposit_ledger_entry_id' => $entry_id), @@ -530,6 +534,8 @@ class Transaction extends AppModel { (in_array($transaction['type'], array('INVOICE', 'RECEIPT')) && empty($transaction['customer_id'])) ) { + // REVISIT : 20090828; Callers are not yet able to handle errors + $this->INTERNAL_ERROR('Transaction verification failed'); return $this->prReturn(false); } @@ -545,6 +551,8 @@ class Transaction extends AppModel { } if (!empty($se) && !$this->StatementEntry->verifyStatementEntry($se)) { + // REVISIT : 20090828; Callers are not yet able to handle errors + $this->INTERNAL_ERROR('Transaction entry verification failed'); return $this->prReturn(false); } } @@ -584,8 +592,11 @@ class Transaction extends AppModel { // Save transaction to the database $this->create(); - if (!$this->save($transaction)) + if (!$this->save($transaction)) { + // REVISIT : 20090828; Callers are not yet able to handle errors + $this->INTERNAL_ERROR('Failed to save Transaction'); return $this->prReturn(array('error' => true) + $ret); + } $ret['transaction_id'] = $transaction['id'] = $this->id; // Add the entries @@ -661,6 +672,11 @@ class Transaction extends AppModel { if (!empty($transaction['customer_id'])) { $this->Customer->update($transaction['customer_id']); } + + if (!empty($ret['error'])) + // REVISIT : 20090828; Callers are not yet able to handle errors + $this->INTERNAL_ERROR('Failed to save Transaction'); + return $this->prReturn($ret); } @@ -681,8 +697,11 @@ class Transaction extends AppModel { $this->prEnter(compact('control', 'transaction', 'entries', 'split')); // Verify that we have a transaction - if (empty($transaction['id'])) + if (empty($transaction['id'])) { + // REVISIT : 20090828; Callers are not yet able to handle errors + $this->INTERNAL_ERROR('Invalid Transaction ID for adding entries'); return $this->prReturn(array('error' => true)); + } // If the entries are not already split, do so now. if ($split) { @@ -742,6 +761,10 @@ class Transaction extends AppModel { } } + if (!empty($ret['error'])) + // REVISIT : 20090828; Callers are not yet able to handle errors + $this->INTERNAL_ERROR('Failed to save Transaction Entries'); + return $this->prReturn($ret); } @@ -762,8 +785,11 @@ class Transaction extends AppModel { // Verify that we have a transaction and entries if (empty($transaction) || - (empty($entries) && empty($control['allow_no_entries']))) + (empty($entries) && empty($control['allow_no_entries']))) { + // REVISIT : 20090828; Callers are not yet able to handle errors + $this->INTERNAL_ERROR('Split Entries failed to validate'); return $this->prReturn(array('error' => true)); + } // set ledger ID as the current ledger of the specified account if (empty($transaction['ledger_id'])) @@ -972,8 +998,11 @@ class Transaction extends AppModel { )); $this->pr(20, compact('nsf_ledger_entry')); - if (!$nsf_ledger_entry) + if (!$nsf_ledger_entry) { + // REVISIT : 20090828; Callers are not yet able to handle errors + $this->INTERNAL_ERROR('Failed to locate NSF ledger entry'); return $this->prReturn(array('error' => true) + $ret); + } // Build a transaction to adjust all of the statement entries $rollback = From 0c9b945f7bf8c39b71a0849480afd64234eb6556 Mon Sep 17 00:00:00 2001 From: abijah Date: Fri, 28 Aug 2009 18:22:13 +0000 Subject: [PATCH 10/11] Added pre-submit data verification for invoice and receipt. The checking is pretty thin, but it's a start. I don't want to do more, as I'm sure there are lots of data validation tools out there and would prefer to go that route. git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@806 97e9348a-65ac-dc4b-aefc-98561f571b83 --- site/views/customers/receipt.ctp | 37 +++++++++++++++++++++++++++++--- site/views/leases/invoice.ctp | 34 +++++++++++++++++++++++++++-- 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/site/views/customers/receipt.ctp b/site/views/customers/receipt.ctp index ff121cd..fe79d8b 100644 --- a/site/views/customers/receipt.ctp +++ b/site/views/customers/receipt.ctp @@ -35,10 +35,40 @@ Configure::write('debug', '0'); }); // pre-submit callback -function verifyRequest(formData, jqForm, options) { +function verifyRequest(formData, jqForm, options) { + //$("#debug").html(''); + for (var i = 0; i < formData.length; ++i) { + //$("#debug").append(i + ') ' + dump(formData[i]) + '
'); + if (formData[i]['name'] == "data[Customer][id]" && + !(formData[i]['value'] > 0)) { + //$("#debug").append('

Missing Customer ID'); + alert("Must select a customer first"); + return false; + } + + if (formData[i]['name'] == "data[Transaction][stamp]" && + formData[i]['value'] == '') { + //$("#debug").append('

Bad Stamp'); + alert("Must enter a valid date stamp"); + return false; + } + + // Terrible way to accomplish this... + for (var j = 0; j < 20; ++j) { + if (formData[i]['name'] == "data[Entry]["+j+"][amount]" && + !(formData[i]['value'] > 0)) { + //$("#debug").append('

Bad Amount'); + alert("Must enter a valid amount"); + return false; + } + } + + } + + //$("#debug").append('OK'); + //return false; + $('#results').html('Working ...'); - // here we could return false to prevent the form from being submitted; - // returning anything other than false will allow the form submit to continue return true; } @@ -370,6 +400,7 @@ Configure::write('debug', '0'); showCurrentAtPos: 0, dateFormat: 'mm/dd/yy' }); + $("#customer-id").val(0); $("#receipt-customer-name").html("INTERNAL ERROR"); $("#receipt-balance").html("INTERNAL ERROR"); $("#receipt-charges-caption").html("Outstanding Charges"); diff --git a/site/views/leases/invoice.ctp b/site/views/leases/invoice.ctp index da0e3af..48974e8 100644 --- a/site/views/leases/invoice.ctp +++ b/site/views/leases/invoice.ctp @@ -43,9 +43,38 @@ Configure::write('debug', '0'); // pre-submit callback function verifyRequest(formData, jqForm, options) { + //$("#debug").html(''); + for (var i = 0; i < formData.length; ++i) { + //$("#debug").append(i + ') ' + dump(formData[i]) + '
'); + if (formData[i]['name'] == "data[Lease][id]" && + !(formData[i]['value'] > 0)) { + //$("#debug").append('

Missing Lease ID'); + alert("Must select a lease first"); + return false; + } + + if (formData[i]['name'] == "data[Transaction][stamp]" && + formData[i]['value'] == '') { + //$("#debug").append('

Bad Stamp'); + alert("Must enter a valid date stamp"); + return false; + } + + // Terrible way to accomplish this... + for (var j = 0; j < 20; ++j) { + if (formData[i]['name'] == "data[Entry]["+j+"][amount]" && + !(formData[i]['value'] > 0)) { + //$("#debug").append('

Bad Amount'); + alert("Must enter a valid amount"); + return false; + } + } + } + + //$("#debug").append('OK'); + //return false; + $('#results').html('Working ...'); - // here we could return false to prevent the form from being submitted; - // returning anything other than false will allow the form submit to continue return true; } @@ -308,6 +337,7 @@ Configure::write('debug', '0'); showCurrentAtPos: 0, dateFormat: 'mm/dd/yy' }); + $("#lease-id").val(0); $("#invoice-lease").html("INTERNAL ERROR"); $("#invoice-unit").html("INTERNAL ERROR"); $("#invoice-customer").html("INTERNAL ERROR"); From 7bcee943a53cce4ea724c2a5a5e55a7526dec9f7 Mon Sep 17 00:00:00 2001 From: abijah Date: Fri, 28 Aug 2009 19:57:30 +0000 Subject: [PATCH 11/11] Theme work, and a sandbox function for a consistent point to check whether we're sandboxed or not. git-svn-id: file:///svn-source/pmgr/branches/pre_0.1_work_20090819@807 97e9348a-65ac-dc4b-aefc-98561f571b83 --- site/config/bootstrap.php | 4 + site/config/database.php | 2 +- site/views/layouts/default.ctp | 14 +- site/webroot/css/layout.css | 73 +--- site/webroot/css/sidemenu.css | 1 + .../images/ui-bg_flat_30_cccccc_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_50_5c5c5c_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_glass_40_ffc73d_1x400.png | Bin 0 -> 131 bytes .../ui-bg_highlight-hard_20_0972a5_1x100.png | Bin 0 -> 114 bytes .../ui-bg_highlight-soft_33_003147_1x100.png | Bin 0 -> 171 bytes .../ui-bg_highlight-soft_35_222222_1x100.png | Bin 0 -> 113 bytes .../ui-bg_highlight-soft_44_444444_1x100.png | Bin 0 -> 117 bytes .../ui-bg_highlight-soft_80_eeeeee_1x100.png | Bin 0 -> 95 bytes .../images/ui-bg_loop_25_000000_21x21.png | Bin 0 -> 235 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_4b8e0b_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_a83300_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_cccccc_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_ffffff_256x240.png | Bin 0 -> 4369 bytes site/webroot/css/themes/dark-hive/ui.all.css | 406 ++++++++++++++++++ .../images/ui-bg_flat_30_cccccc_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_50_5c5c5c_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_glass_20_555555_1x400.png | Bin 0 -> 115 bytes .../images/ui-bg_glass_40_0078a3_1x400.png | Bin 0 -> 179 bytes .../images/ui-bg_glass_40_ffc73d_1x400.png | Bin 0 -> 167 bytes .../ui-bg_gloss-wave_25_333333_500x100.png | Bin 0 -> 1874 bytes .../ui-bg_highlight-soft_80_eeeeee_1x100.png | Bin 0 -> 95 bytes .../ui-bg_inset-soft_25_000000_1x100.png | Bin 0 -> 98 bytes .../ui-bg_inset-soft_30_f58400_1x100.png | Bin 0 -> 117 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_4b8e0b_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_a83300_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_cccccc_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_ffffff_256x240.png | Bin 0 -> 4369 bytes site/webroot/css/themes/darkness/ui.all.css | 406 ++++++++++++++++++ 35 files changed, 833 insertions(+), 73 deletions(-) create mode 100644 site/webroot/css/themes/dark-hive/images/ui-bg_flat_30_cccccc_40x100.png create mode 100644 site/webroot/css/themes/dark-hive/images/ui-bg_flat_50_5c5c5c_40x100.png create mode 100644 site/webroot/css/themes/dark-hive/images/ui-bg_glass_40_ffc73d_1x400.png create mode 100644 site/webroot/css/themes/dark-hive/images/ui-bg_highlight-hard_20_0972a5_1x100.png create mode 100644 site/webroot/css/themes/dark-hive/images/ui-bg_highlight-soft_33_003147_1x100.png create mode 100644 site/webroot/css/themes/dark-hive/images/ui-bg_highlight-soft_35_222222_1x100.png create mode 100644 site/webroot/css/themes/dark-hive/images/ui-bg_highlight-soft_44_444444_1x100.png create mode 100644 site/webroot/css/themes/dark-hive/images/ui-bg_highlight-soft_80_eeeeee_1x100.png create mode 100644 site/webroot/css/themes/dark-hive/images/ui-bg_loop_25_000000_21x21.png create mode 100644 site/webroot/css/themes/dark-hive/images/ui-icons_222222_256x240.png create mode 100644 site/webroot/css/themes/dark-hive/images/ui-icons_4b8e0b_256x240.png create mode 100644 site/webroot/css/themes/dark-hive/images/ui-icons_a83300_256x240.png create mode 100644 site/webroot/css/themes/dark-hive/images/ui-icons_cccccc_256x240.png create mode 100644 site/webroot/css/themes/dark-hive/images/ui-icons_ffffff_256x240.png create mode 100644 site/webroot/css/themes/dark-hive/ui.all.css create mode 100644 site/webroot/css/themes/darkness/images/ui-bg_flat_30_cccccc_40x100.png create mode 100644 site/webroot/css/themes/darkness/images/ui-bg_flat_50_5c5c5c_40x100.png create mode 100644 site/webroot/css/themes/darkness/images/ui-bg_glass_20_555555_1x400.png create mode 100644 site/webroot/css/themes/darkness/images/ui-bg_glass_40_0078a3_1x400.png create mode 100644 site/webroot/css/themes/darkness/images/ui-bg_glass_40_ffc73d_1x400.png create mode 100644 site/webroot/css/themes/darkness/images/ui-bg_gloss-wave_25_333333_500x100.png create mode 100644 site/webroot/css/themes/darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png create mode 100644 site/webroot/css/themes/darkness/images/ui-bg_inset-soft_25_000000_1x100.png create mode 100644 site/webroot/css/themes/darkness/images/ui-bg_inset-soft_30_f58400_1x100.png create mode 100644 site/webroot/css/themes/darkness/images/ui-icons_222222_256x240.png create mode 100644 site/webroot/css/themes/darkness/images/ui-icons_4b8e0b_256x240.png create mode 100644 site/webroot/css/themes/darkness/images/ui-icons_a83300_256x240.png create mode 100644 site/webroot/css/themes/darkness/images/ui-icons_cccccc_256x240.png create mode 100644 site/webroot/css/themes/darkness/images/ui-icons_ffffff_256x240.png create mode 100644 site/webroot/css/themes/darkness/ui.all.css diff --git a/site/config/bootstrap.php b/site/config/bootstrap.php index 25d4a63..335adbc 100644 --- a/site/config/bootstrap.php +++ b/site/config/bootstrap.php @@ -32,6 +32,10 @@ * */ +function sandbox() { + return preg_match("%^/[^/]*sand/%", $_SERVER['REQUEST_URI']); +} + function server_request_var($var) { return (preg_match("/^HTTP/", $var)); } diff --git a/site/config/database.php b/site/config/database.php index 40df34a..c7fa35e 100644 --- a/site/config/database.php +++ b/site/config/database.php @@ -12,7 +12,7 @@ class DATABASE_CONFIG { ); function __construct() { - if (preg_match("%^/[^/]*sand/%", $_SERVER['REQUEST_URI'])) + if (sandbox()) $this->default['database'] = 'pmgr_sand'; } } diff --git a/site/views/layouts/default.ctp b/site/views/layouts/default.ctp index eaea17b..e89827b 100644 --- a/site/views/layouts/default.ctp +++ b/site/views/layouts/default.ctp @@ -60,10 +60,16 @@ echo $html->css('sidemenu') . "\n"; echo $javascript->link($protocol . 'ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js') . "\n"; echo $javascript->link($protocol . 'ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js') . "\n"; - //echo $html->css('themes/base/ui.all') . "\n"; - //echo $html->css('themes/smoothness/ui.all') . "\n"; - //echo $html->css('themes/dotluv/ui.all') . "\n"; - echo $html->css('themes/start/ui.all') . "\n"; + + $theme = 'smoothness'; + $theme = 'base'; + $theme = 'dotluv'; + $theme = 'dark-hive'; + $theme = 'start'; + if (sandbox()) + $theme = 'darkness'; + + echo $html->css('themes/'.$theme.'/ui.all') . "\n"; echo $javascript->link('jquery.form') . "\n"; echo $javascript->link('pmgr.jquery') . "\n"; echo $javascript->link('pmgr') . "\n"; diff --git a/site/webroot/css/layout.css b/site/webroot/css/layout.css index b4af245..df70489 100644 --- a/site/webroot/css/layout.css +++ b/site/webroot/css/layout.css @@ -277,19 +277,14 @@ span.grid-error { color: #a00; } -span.ui-jqgrid-title { - color: #ffb; - font-family:'Gill Sans','lucida grande',helvetica, arial, sans-serif; - font-size: 180%; - margin-bottom: 0.0em; +.ui-jqgrid span.ui-jqgrid-title { + font-size: 160%; + margin: 0; } -span.ui-jqgrid-title h2 { - color: #ffb; - font-family:'Gill Sans','lucida grande',helvetica, arial, sans-serif; +.ui-jqgrid span.ui-jqgrid-title h2 { font-weight: bold; font-size: 140%; - margin-bottom: 0.0em; } @@ -365,45 +360,18 @@ fieldset fieldset div { /* margin: 0 20px; */ } -/* - * REVISIT : 20090728 - * This "form div" is way too generic, and in fact - * it's screwing up the jqGrid header. I'm commenting - * it out for now, to see if it actually is needed - * anywhere, and hope to delete it in the near future. - */ -/* form div { */ -/* clear: both; */ -/* /\* margin-bottom: 1em; *\/ */ -/* /\* padding: .5em; *\/ */ -/* vertical-align: text-top; */ -/* } */ -form div.input { - color: #444; -} -form div.required { - color: #333; - font-weight: bold; -} form div.submit { border: 0; clear: both; margin-top: 10px; -/* margin-left: 140px; */ } + /************************************************************ ************************************************************ * General Style Info */ -body { -/* background: #003d4c; */ -/* color: #fff; */ - font-family:'lucida grande',verdana,helvetica,arial,sans-serif; - font-size:90%; - margin: 0; -} a { color: #003d4c; text-decoration: underline; @@ -413,35 +381,4 @@ a:hover { color: #00f; text-decoration:none; } -a img { - border:none; -} - -h1, h2, h3, h4 { - font-weight: normal; -} - -h1 { - color: #003d4c; - font-size: 100%; - margin: 0.1em 0; -} -h2 { -/* color: #e32; */ - color: #993; - font-family:'Gill Sans','lucida grande',helvetica, arial, sans-serif; - font-size: 190%; - margin-bottom: 0.3em; -} -h3 { - color: #993; - font-family:'Gill Sans','lucida grande',helvetica, arial, sans-serif; -/* font-size: 165%; */ -} -h4 { - color: #993; - font-weight: normal; - padding-top: 0.5em; -} - diff --git a/site/webroot/css/sidemenu.css b/site/webroot/css/sidemenu.css index 590d368..a8083bd 100644 --- a/site/webroot/css/sidemenu.css +++ b/site/webroot/css/sidemenu.css @@ -18,3 +18,4 @@ #sidemenu.ui-accordion .ui-accordion-header { padding: 0 0.5em 0 1.1em; } #sidemenu.ui-accordion .ui-accordion-content { padding: 0 0.5em 0 1.1em; } +#sidemenu a { font-size: 90%; } diff --git a/site/webroot/css/themes/dark-hive/images/ui-bg_flat_30_cccccc_40x100.png b/site/webroot/css/themes/dark-hive/images/ui-bg_flat_30_cccccc_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5473afffbc2662173f5af5c27d966c072de8039b GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`Ta z<$H)q$%zYm;;c7~Kd+Iuj%U9o62cnl7#bi-T}u42J&U%yNJ})(84RATelF{r5}E*| CoG&2& literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/dark-hive/images/ui-bg_flat_50_5c5c5c_40x100.png b/site/webroot/css/themes/dark-hive/images/ui-bg_flat_50_5c5c5c_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5950a8db9e64e8d00bb28726cb869947abfdc7fc GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7&<)v zy**H+C;u_aS d;^%;}$C#b3amU=xZ39`u;OXk;vd$@?2>__OD+K@m literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/dark-hive/images/ui-bg_highlight-hard_20_0972a5_1x100.png b/site/webroot/css/themes/dark-hive/images/ui-bg_highlight-hard_20_0972a5_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..142598c15cb0ca540aa6827347b5c7e85a868917 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l%=POV~E7myZr|_859H#C$$#_ zh!;7nulq8`LBM`tV~tntU8W!0Y$9e{&2BDw`ljx4Ke9~`ue)=AB~w`WS&O1LJJ1jY MPgg&ebxsLQ03p^NegFUf literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/dark-hive/images/ui-bg_highlight-soft_33_003147_1x100.png b/site/webroot/css/themes/dark-hive/images/ui-bg_highlight-soft_33_003147_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..a1d8297e7a1d0d11aaa9ccfd7dade9172070872d GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3Ja)XlH!`a*8}%9780guI=;YYYO0T_1~pZ zepu?pPB+J%4-4$o&o^>$x~Z$@7FAbSn&fgFuwGW_=oi~RXFcbPJmlyqtxte`W`Coi8H-DB~ Wz+8vrD+++NGkCiCxvXwA zrKA4;KgZ7h|Nko&3m&<@zkcB+pg^k-2d7Et4IYOXHXr^iHDYAQDR=FqD`wVF*V31rtx^1O-i2-*%VR!`&-n>;7Qxw|F%2EX3gO;DXM(c Q3!pg+p00i_>zopr07oh&m;e9( literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/dark-hive/images/ui-bg_highlight-soft_80_eeeeee_1x100.png b/site/webroot/css/themes/dark-hive/images/ui-bg_highlight-soft_80_eeeeee_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..e56eefd612ae74339bd45ae91ddfc2ae2eb7092b GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l$xiDV~E7mQ98UlM literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/dark-hive/images/ui-bg_loop_25_000000_21x21.png b/site/webroot/css/themes/dark-hive/images/ui-bg_loop_25_000000_21x21.png new file mode 100644 index 0000000000000000000000000000000000000000..bc7ea5f78045721fcbc80c11a7833566ab81f5d2 GIT binary patch literal 235 zcmVe7JuL4hN&d0+x^U% zf*@uFBAPNH8aC#f>GHEBX56nA2az`Z)Mst7aSvDO*P4b(W!ikxEmSJgCesbL>5ZBy l)n`Swhbr~&FF)@1NA1MND3Ij(>C6BC002ovPDHLkV1j6)YcT)- literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/dark-hive/images/ui-icons_222222_256x240.png b/site/webroot/css/themes/dark-hive/images/ui-icons_222222_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..ee039dc096a38a3753f92519546eee94bcfbeffa GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/dark-hive/images/ui-icons_4b8e0b_256x240.png b/site/webroot/css/themes/dark-hive/images/ui-icons_4b8e0b_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..fdaa72a0263f115f0268927c5aa4ad0f05dd9172 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/dark-hive/images/ui-icons_a83300_256x240.png b/site/webroot/css/themes/dark-hive/images/ui-icons_a83300_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e3ad7c87419228390de734786ee856795d9ad4 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/dark-hive/images/ui-icons_ffffff_256x240.png b/site/webroot/css/themes/dark-hive/images/ui-icons_ffffff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..bef5178a9054c16582876bac57017f783272e750 GIT binary patch literal 4369 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 l!Q;r%?Y*7ztoF~2ao>D^xRgPV&GAM literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/dark-hive/ui.all.css b/site/webroot/css/themes/dark-hive/ui.all.css new file mode 100644 index 0000000..42ab154 --- /dev/null +++ b/site/webroot/css/themes/dark-hive/ui.all.css @@ -0,0 +1,406 @@ +/* +* jQuery UI CSS Framework +* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +*/ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + + +/* +* jQuery UI CSS Framework +* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,%20Arial,%20sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=444444&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=44&borderColorHeader=333333&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=000000&bgTextureContent=14_loop.png&bgImgOpacityContent=25&borderColorContent=555555&fcContent=ffffff&iconColorContent=cccccc&bgColorDefault=222222&bgTextureDefault=03_highlight_soft.png&bgImgOpacityDefault=35&borderColorDefault=444444&fcDefault=eeeeee&iconColorDefault=cccccc&bgColorHover=003147&bgTextureHover=03_highlight_soft.png&bgImgOpacityHover=33&borderColorHover=0b93d5&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=0972a5&bgTextureActive=04_highlight_hard.png&bgImgOpacityActive=20&borderColorActive=26b3f7&fcActive=ffffff&iconColorActive=222222&bgColorHighlight=eeeeee&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=80&borderColorHighlight=cccccc&fcHighlight=2e7db2&iconColorHighlight=4b8e0b&bgColorError=ffc73d&bgTextureError=02_glass.png&bgImgOpacityError=40&borderColorError=ffb73d&fcError=111111&iconColorError=a83300&bgColorOverlay=5c5c5c&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=50&opacityOverlay=80&bgColorShadow=cccccc&bgTextureShadow=01_flat.png&bgImgOpacityShadow=30&opacityShadow=60&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px +*/ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Verdana, Arial, sans-serif; font-size: 1.1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana, Arial, sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #555555; background: #000000 url(images/ui-bg_loop_25_000000_21x21.png) 50% 50% repeat; color: #ffffff; } +.ui-widget-content a { color: #ffffff; } +.ui-widget-header { border: 1px solid #333333; background: #444444 url(images/ui-bg_highlight-soft_44_444444_1x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } +.ui-widget-header a { color: #ffffff; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default { border: 1px solid #444444; background: #222222 url(images/ui-bg_highlight-soft_35_222222_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #eeeeee; outline: none; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #eeeeee; text-decoration: none; outline: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { border: 1px solid #0b93d5; background: #003147 url(images/ui-bg_highlight-soft_33_003147_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #ffffff; outline: none; } +.ui-state-hover a, .ui-state-hover a:hover { color: #ffffff; text-decoration: none; outline: none; } +.ui-state-active, .ui-widget-content .ui-state-active { border: 1px solid #26b3f7; background: #0972a5 url(images/ui-bg_highlight-hard_20_0972a5_1x100.png) 50% 50% repeat-x; font-weight: normal; color: #ffffff; outline: none; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #ffffff; outline: none; text-decoration: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px solid #cccccc; background: #eeeeee url(images/ui-bg_highlight-soft_80_eeeeee_1x100.png) 50% top repeat-x; color: #2e7db2; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color: #2e7db2; } +.ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #ffb73d; background: #ffc73d url(images/ui-bg_glass_40_ffc73d_1x400.png) 50% 50% repeat-x; color: #111111; } +.ui-state-error a, .ui-widget-content .ui-state-error a { color: #111111; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #111111; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_cccccc_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_cccccc_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_cccccc_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_4b8e0b_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_a83300_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; } +.ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; } +.ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; } +.ui-corner-top { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; } +.ui-corner-right { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; } +.ui-corner-left { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; } +.ui-corner-all { -moz-border-radius: 6px; -webkit-border-radius: 6px; } + +/* Overlays */ +.ui-widget-overlay { background: #5c5c5c url(images/ui-bg_flat_50_5c5c5c_40x100.png) 50% 50% repeat-x; opacity: .80;filter:Alpha(Opacity=80); } +.ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; background: #cccccc url(images/ui-bg_flat_30_cccccc_40x100.png) 50% 50% repeat-x; opacity: .60;filter:Alpha(Opacity=60); -moz-border-radius: 8px; -webkit-border-radius: 8px; }/* Accordion +----------------------------------*/ +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; } +.ui-accordion .ui-accordion-content-active { display: block; }/* Datepicker +----------------------------------*/ +.ui-datepicker { width: 17em; padding: .2em .2em 0; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { float:left; font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker .ui-datepicker-title select.ui-datepicker-year { float: right; } +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +}/* Dialog +----------------------------------*/ +.ui-dialog { position: relative; padding: .2em; width: 300px; } +.ui-dialog .ui-dialog-titlebar { padding: .5em .3em .3em 1em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 0 .2em; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } +/* Progressbar +----------------------------------*/ +.ui-progressbar { height:2em; text-align: left; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* Resizable +----------------------------------*/ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0px; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0px; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0px; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0px; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Slider +----------------------------------*/ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs +----------------------------------*/ +.ui-tabs { padding: .2em; zoom: 1; } +.ui-tabs .ui-tabs-nav { list-style: none; position: relative; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { position: relative; float: left; border-bottom-width: 0 !important; margin: 0 .2em -1px 0; padding: 0; } +.ui-tabs .ui-tabs-nav li a { float: left; text-decoration: none; padding: .5em 1em; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { padding-bottom: 1px; border-bottom-width: 0; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { padding: 1em 1.4em; display: block; border-width: 0; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } diff --git a/site/webroot/css/themes/darkness/images/ui-bg_flat_30_cccccc_40x100.png b/site/webroot/css/themes/darkness/images/ui-bg_flat_30_cccccc_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5473afffbc2662173f5af5c27d966c072de8039b GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`Ta z<$H)q$%zYm;;c7~Kd+Iuj%U9o62cnl7#bi-T}u42J&U%yNJ})(84RATelF{r5}E*| CoG&2& literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/darkness/images/ui-bg_flat_50_5c5c5c_40x100.png b/site/webroot/css/themes/darkness/images/ui-bg_flat_50_5c5c5c_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5950a8db9e64e8d00bb28726cb869947abfdc7fc GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7&<)v zy**H+ z`**vX!*n&P7dc50adyfl&Nwm{9INpTEp=t_C|dt|%9X7Z^~WTNlbGI|=7x9N5Ldv>mwrvCKftbprRR`AQonq8HO(sejC|M}_Ko)fbJG;L+$#xLfUbvbRHKYdf;lnuLjR)5ZSVxA@w`{_x44Wr={XgrV17G0@K0tCwr|_L4FG`cX~&a)0{{Wbe*M`mHv8AS(OX;q*z!_Z@>{1%MGiyu zR|xbXaPnOIdD+Ux{R6(br<1qK{_>6OVJiyw2cO!f{+2bo_c6Uf@ak*A-gUS0ya}i{ z;V|n10Kl4N15Q?43I?7#{{I#OKX|+gVL-*#_gjMA40sU-?0os>#q4m5zYlyNaNy0i zw^Rg@n2PM1EYnI!r8-ve`DR?E&r)g^!dw?^1cUDl{jIC0LqtYJ2-{< z^zg_cP8X>+p|zOkQCSM#xGKcaAOiy-SU^Z1WD^&VjsjU9nusJEZ09-SzK7LC5*abv z3bV0}9Jo{3#yNAHDALv}?}};!m&BKh#+>m@(WkDJjK<89uTGHg@D-UX>-ETjTK)~$ zOr)}HQ5Q=cqfulXw=zX=4D4-ulurld1T(#Bl#sa@S5 zp`alO&km=OxtEWjt&`%U^>H+i7?)HTR1x^ff5x*RW+|o>hxeK_Kj$^Ig8CR zEqR6U6p+fT895w+wE0LvO;>FXYFOy(XDztA-TA3z$n$NTg#FEvs-1liN z_Nd1G7J&@g9g}bvL8^2_2}WvrG*#cC7wK731W2GBz+jOT^+0{`PNdB!ES|*3C0zQ5 zaN3awY3wD=vgoBTW8JhS)k9-u6((jG8W5J=IvOi0csINJs#yO7^pr@JOg^2@yWSr$ z9H89a;5ALfT5P*q-ysOn-(zrTNv~mw&fses8XC-rM*OQ4w5MNgP4KJ~Bd(HLy{%0; z7gd#cTlMZ*$k+Sqt!4!>k+M1O!(%Np{^9g<`lR~Fc_pDPM+vVC=QPeD`(JRRC~er2 zCi|jkNQ@4;LqAmPTU#w?hmZF1R-aHl=em*uW2JB!U9hT&`^2=uJOOET@j`Ok0#d6 z#(L6k=6ErD*U;XUposM4a^d3L zp-T^hYj>Xmwtaag;LpHTG_dVQw4W-o!G86VCAjbROZ*&Db`T>1l~(J<&d;6s33{d9 z`^k6n9Y1mYo9(hMp0$+wN`M2(jWR#7`wh+LARzCn4N56D%KVR4-u*2}bB{fPi=Paw z6gk|PBCK5=Be17ZBA!UgCS^bmQTXUH0T|@vR`&$2%0`k{CKz4&U2QEYpeHEbxx1yMjh$T zgH4%u$59+kAz#93N7_0O1=Cc<4+g{{!VmvO`@jXnG--~=JzU@`t0Wk2^`7?Wk*WGc5TVydoVC|KVrIzB za*zX6duE2%bCs^gjG+nlgyq-B7Rgi2dP)%$N`p>Fzv0(c&);tlsH5~@w3Wa6?;|Hv zNsmEwPY{wtt{bi6qxNY>L|gaRm?0CRoQUiZ%h) zq(G*nxm^ELo_SHJGxFKNZ)BmA%i(Z}p9hp_yZ~Eg@0lwdJ2rk#AT1>$`NrEH|L$Kk CqOPR? literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png b/site/webroot/css/themes/darkness/images/ui-bg_highlight-soft_80_eeeeee_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..e56eefd612ae74339bd45ae91ddfc2ae2eb7092b GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l$xiDV~E7mQ98UlM literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/darkness/images/ui-bg_inset-soft_25_000000_1x100.png b/site/webroot/css/themes/darkness/images/ui-bg_inset-soft_25_000000_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..3525eb9ff4c26d2c74003e7e2fdf09cccf7c9d54 GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l%}VPV~E7mvV v4~LtZ8=D#sywNe@G+8Wgr}4YKCJTdvGLyysE7#8hH8FU)`njxgN@xNASlk-& literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/darkness/images/ui-bg_inset-soft_30_f58400_1x100.png b/site/webroot/css/themes/darkness/images/ui-bg_inset-soft_30_f58400_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..2b6a9f92408ede5e967497f0c917d99e06a2e7f8 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l#Qp0V~E7myZwe-3<^BV`X67{ z-Q39+s_r<4W%}b;6Bcgql6WBPGHXN18AjIAtjA9+sZ48Zd&-pi=Idqi7tQ7DO<7N; RDFDr3@O1TaS?83{1OO`oCW`<7 literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/darkness/images/ui-icons_222222_256x240.png b/site/webroot/css/themes/darkness/images/ui-icons_222222_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..ee039dc096a38a3753f92519546eee94bcfbeffa GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/darkness/images/ui-icons_4b8e0b_256x240.png b/site/webroot/css/themes/darkness/images/ui-icons_4b8e0b_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..fdaa72a0263f115f0268927c5aa4ad0f05dd9172 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/darkness/images/ui-icons_a83300_256x240.png b/site/webroot/css/themes/darkness/images/ui-icons_a83300_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..b9e3ad7c87419228390de734786ee856795d9ad4 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/darkness/images/ui-icons_ffffff_256x240.png b/site/webroot/css/themes/darkness/images/ui-icons_ffffff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..bef5178a9054c16582876bac57017f783272e750 GIT binary patch literal 4369 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 l!Q;r%?Y*7ztoF~2ao>D^xRgPV&GAM literal 0 HcmV?d00001 diff --git a/site/webroot/css/themes/darkness/ui.all.css b/site/webroot/css/themes/darkness/ui.all.css new file mode 100644 index 0000000..4bed334 --- /dev/null +++ b/site/webroot/css/themes/darkness/ui.all.css @@ -0,0 +1,406 @@ +/* +* jQuery UI CSS Framework +* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +*/ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + + +/* +* jQuery UI CSS Framework +* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) +* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Segoe%20UI,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=333333&bgTextureHeader=12_gloss_wave.png&bgImgOpacityHeader=25&borderColorHeader=333333&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=000000&bgTextureContent=05_inset_soft.png&bgImgOpacityContent=25&borderColorContent=666666&fcContent=ffffff&iconColorContent=cccccc&bgColorDefault=555555&bgTextureDefault=02_glass.png&bgImgOpacityDefault=20&borderColorDefault=666666&fcDefault=eeeeee&iconColorDefault=cccccc&bgColorHover=0078a3&bgTextureHover=02_glass.png&bgImgOpacityHover=40&borderColorHover=59b4d4&fcHover=ffffff&iconColorHover=ffffff&bgColorActive=f58400&bgTextureActive=05_inset_soft.png&bgImgOpacityActive=30&borderColorActive=ffaf0f&fcActive=ffffff&iconColorActive=222222&bgColorHighlight=eeeeee&bgTextureHighlight=03_highlight_soft.png&bgImgOpacityHighlight=80&borderColorHighlight=cccccc&fcHighlight=2e7db2&iconColorHighlight=4b8e0b&bgColorError=ffc73d&bgTextureError=02_glass.png&bgImgOpacityError=40&borderColorError=ffb73d&fcError=111111&iconColorError=a83300&bgColorOverlay=5c5c5c&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=50&opacityOverlay=80&bgColorShadow=cccccc&bgTextureShadow=01_flat.png&bgImgOpacityShadow=30&opacityShadow=60&thicknessShadow=7px&offsetTopShadow=-7px&offsetLeftShadow=-7px&cornerRadiusShadow=8px +*/ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Segoe UI, Arial, sans-serif; font-size: 1.1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Segoe UI, Arial, sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #666666; background: #000000 url(images/ui-bg_inset-soft_25_000000_1x100.png) 50% bottom repeat-x; color: #ffffff; } +.ui-widget-content a { color: #ffffff; } +.ui-widget-header { border: 1px solid #333333; background: #333333 url(images/ui-bg_gloss-wave_25_333333_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } +.ui-widget-header a { color: #ffffff; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default { border: 1px solid #666666; background: #555555 url(images/ui-bg_glass_20_555555_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eeeeee; outline: none; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #eeeeee; text-decoration: none; outline: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { border: 1px solid #59b4d4; background: #0078a3 url(images/ui-bg_glass_40_0078a3_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #ffffff; outline: none; } +.ui-state-hover a, .ui-state-hover a:hover { color: #ffffff; text-decoration: none; outline: none; } +.ui-state-active, .ui-widget-content .ui-state-active { border: 1px solid #ffaf0f; background: #f58400 url(images/ui-bg_inset-soft_30_f58400_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #ffffff; outline: none; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #ffffff; outline: none; text-decoration: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px solid #cccccc; background: #eeeeee url(images/ui-bg_highlight-soft_80_eeeeee_1x100.png) 50% top repeat-x; color: #2e7db2; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color: #2e7db2; } +.ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #ffb73d; background: #ffc73d url(images/ui-bg_glass_40_ffc73d_1x400.png) 50% 50% repeat-x; color: #111111; } +.ui-state-error a, .ui-widget-content .ui-state-error a { color: #111111; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #111111; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_cccccc_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_cccccc_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_cccccc_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_4b8e0b_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_a83300_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; } +.ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; } +.ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; } +.ui-corner-top { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; } +.ui-corner-right { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; } +.ui-corner-left { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; } +.ui-corner-all { -moz-border-radius: 6px; -webkit-border-radius: 6px; } + +/* Overlays */ +.ui-widget-overlay { background: #5c5c5c url(images/ui-bg_flat_50_5c5c5c_40x100.png) 50% 50% repeat-x; opacity: .80;filter:Alpha(Opacity=80); } +.ui-widget-shadow { margin: -7px 0 0 -7px; padding: 7px; background: #cccccc url(images/ui-bg_flat_30_cccccc_40x100.png) 50% 50% repeat-x; opacity: .60;filter:Alpha(Opacity=60); -moz-border-radius: 8px; -webkit-border-radius: 8px; }/* Accordion +----------------------------------*/ +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; } +.ui-accordion .ui-accordion-content-active { display: block; }/* Datepicker +----------------------------------*/ +.ui-datepicker { width: 17em; padding: .2em .2em 0; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { float:left; font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker .ui-datepicker-title select.ui-datepicker-year { float: right; } +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +}/* Dialog +----------------------------------*/ +.ui-dialog { position: relative; padding: .2em; width: 300px; } +.ui-dialog .ui-dialog-titlebar { padding: .5em .3em .3em 1em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 0 .2em; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } +/* Progressbar +----------------------------------*/ +.ui-progressbar { height:2em; text-align: left; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* Resizable +----------------------------------*/ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0px; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0px; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0px; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0px; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Slider +----------------------------------*/ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs +----------------------------------*/ +.ui-tabs { padding: .2em; zoom: 1; } +.ui-tabs .ui-tabs-nav { list-style: none; position: relative; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { position: relative; float: left; border-bottom-width: 0 !important; margin: 0 .2em -1px 0; padding: 0; } +.ui-tabs .ui-tabs-nav li a { float: left; text-decoration: none; padding: .5em 1em; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { padding-bottom: 1px; border-bottom-width: 0; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { padding: 1em 1.4em; display: block; border-width: 0; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; }