From fd7bc472ecac2df2d7c0292eaf95e959d5a69564 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Sat, 23 Sep 2017 19:05:54 +0200 Subject: [PATCH] Schema updated for modules (also called 'extensions') + the view 'analytics' became 'extensions' and now there is the default layout for choosing extensions + TODO: extensions.js + POST::link / POST::unlink to add to 'clusterDefault' or create 'extensionDefault' + TODO: rename module to extension --- build/api/module/clusterDefault.php | 48 +++- build/database/repo/module.php | 236 ++++++++++++++++++ build/database/repo/warehouse.php | 21 +- build/viewer/view/extension/view.php | 72 ++++++ build/viewer/view/extension/view.twig | 42 ++++ config/db-schema.json | 2 +- config/modules.json | 11 + config/repositories.json | 9 + public_html/css/container.scss | 6 +- public_html/css/header.scss | 2 +- public_html/css/min/container.css | 40 ++- .../src/static/container/extension.svg | 1 + public_html/view/extensions.php | 88 ++++++- 13 files changed, 543 insertions(+), 35 deletions(-) create mode 100644 build/database/repo/module.php create mode 100644 build/viewer/view/extension/view.php create mode 100644 build/viewer/view/extension/view.twig create mode 100644 public_html/src/static/container/extension.svg diff --git a/build/api/module/clusterDefault.php b/build/api/module/clusterDefault.php index 6129b98..3d1a200 100755 --- a/build/api/module/clusterDefault.php +++ b/build/api/module/clusterDefault.php @@ -326,7 +326,7 @@ */ public function addPermission($params){ extract($params); - + /* [1] On crée la relation via le repo =========================================================*/ /* (1) On rédige la requête */ @@ -340,7 +340,7 @@ =========================================================*/ return [ 'error' => $res ]; } - + /* SUPPRIME UNE PERMISSION * * @id_target UID du groupe de machine cible @@ -350,7 +350,7 @@ */ public function remPermission($params){ extract($params); - + /* [1] On supprime la relation via le repo =========================================================*/ /* (1) On rédige la requête */ @@ -383,7 +383,7 @@ /* (2) On exécute et récupère la réponse */ $res = $req->answer(); - + // Gestion erreur if( !is_array($res) ) return ['error' => new Error(Err::NoMatchFound)]; @@ -416,7 +416,45 @@ return ['clusters' => $res]; } - + + + + + + + + + /* RETOURNE LA LISTE DES MODULE D'UN GROUPE DE MACHINES + * + * @id_cluster UID du groupe de machine + * + * @return modules Liste des modules autorisés pour le groupe de machines + * + */ + public static function getModules($params){ + extract($params); + + + /* [1] On récupère les modules + =========================================================*/ + /* (1) Récupération */ + $mod_req = new Repo('module/getByMachineCluster', [ + $_SESSION['WAREHOUSE']['id'], + $id_cluster + ]); + + $answer = $mod_req->answer(); + + /* (2) Gestion erreur */ + if( $answer === false ) + return ['error' => new Error(Err::NoMatchFound)]; // no error + + + /* [3] On retourne la liste + =========================================================*/ + return [ 'modules' => $answer ]; + } + } diff --git a/build/database/repo/module.php b/build/database/repo/module.php new file mode 100644 index 0000000..79d2f0b --- /dev/null +++ b/build/database/repo/module.php @@ -0,0 +1,236 @@ + The list of modules + * FALSE on error + * + =========================================================*/ + public static function getAll(){ + return Table::get('module')->select('*')->fetch(); + } + + + + + + + + /* [2] Fetch all modules for the given warehouse + * + * @id_warehouse UID of the given warehouse + * + * @return modules The list of modules + * FALSE on error + * + =========================================================*/ + public static function getByWarehouse($id_warehouse){ + + /* (1) Build request */ + $modules = Table::get('module')->select('*'); + $merge = Table::get('module_availability')->whereIdWarehouse($id_warehouse); + $merge->join('id_module', $modules); + + return $merge->fetch(); + } + + + + + + + + + /* [3] Fetch all modules for the given machine_cluster + * + * @id_warehouse UID of the given warehouse + * @id_machine_cluster UID of the given machine_cluster + * + * @return modules The list of modules + * FALSE on error + * + =========================================================*/ + public static function getByMachineCluster($id_warehouse, $id_machine_cluster){ + + /* (1) Build request */ + $modules = Table::get('module')->select('*'); + $merge = Table::get('module_merge') + ->whereIdWarehouse($id_warehouse) + ->whereIdMachineCluster($id_machine_cluster); + $merge->join('id_module', $modules); + + return $merge->fetch(); + + } + + + + + + + + + + + + /* [4] Adds a module to machine cluster of a warehouse + * + * @id_warehouse UID of the given warehouse + * @id_machine_cluster UID of the given machine_cluster + * @id_module UID of the given module + * + * @return status TRUE on success + * + =========================================================*/ + public static function link($id_warehouse, $id_machine_cluster, $id_module){ + + /* (1) Check module + ---------------------------------------------------------*/ + /* (1) Check if module exists (by its id) */ + $module = Table::get('module') + ->select('*') + ->unique() + ->whereId($id_module); + + if( !$module->fetch() ) + return false; + + /* (2) Check if the module is allowed in the warehouse */ + $module_m = Table::get('module_availability') + ->select('*') + ->unique() + ->whereIdWarehouse($id_warehouse) + ->whereIdModule($id_module); + + // if not allowed in the warehouse -> error + if( !$module->fetch() ) + return false; + + + /* (2) Check machine_cluster + ---------------------------------------------------------*/ + /* (1) Check if machine_cluster exists (by its id) */ + $machine_cluster = Table::get('machine_cluster') + ->select('*') + ->unique() + ->whereIdWarehouse($id_warehouse) + ->whereId($id_machine_cluster); + + if( !$machine_cluster->fetch() ) + return false; + + /* (2) Check link does not already exists */ + $exists = Table::get('module_merge') + ->select('*') + ->unique() + ->whereIdWarehouse($id_warehouse) + ->whereIdMachineCluster($id_machine_cluster) + ->whereIdModule($id_module); + + if( !!$exists->fetch() ) + return true; // returns all right (even if nothing done) + + + + /* (3) Create link + ---------------------------------------------------------*/ + $inserted = Table::get('module_merge')->insert([ + 'id_warehouse' => $id_warehouse, + 'id_module' => $id_module, + 'id_machine_cluster' => $id_machine_cluster + ]); + + // return TRUE only if PDO insert successful + return $inserted; + + } + + + + + + + + /* [5] Removes a module from machine cluster of a warehouse + * + * @id_warehouse UID of the given warehouse + * @id_machine_cluster UID of the given machine_cluster + * @id_module UID of the given module + * + * @return status TRUE on success + * + =========================================================*/ + public static function unlink($id_warehouse, $id_machine_cluster, $id_module){ + + /* (1) Check module + ---------------------------------------------------------*/ + /* (1) Check if module exists (by its id) */ + $module = Table::get('module') + ->select('*') + ->unique() + ->whereId($id_module); + + if( !$module->fetch() ) + return false; + + + + /* (2) Check machine_cluster + ---------------------------------------------------------*/ + /* (1) Check if machine_cluster exists (by its id) */ + $machine_cluster = Table::get('machine_cluster') + ->select('*') + ->unique() + ->whereIdWarehouse($id_warehouse) + ->whereId($id_machine_cluster); + + if( !$machine_cluster->fetch() ) + return false; + + /* (2) Check if link already exists */ + $exists = Table::get('module_merge') + ->select('*') + ->unique() + ->whereIdWarehouse($id_warehouse) + ->whereIdMachineCluster($id_machine_cluster) + ->whereIdModule($id_module); + + if( !$exists->fetch() ) + return false; // returns all right (even if nothing done) + + + + /* (3) Remove link + ---------------------------------------------------------*/ + $deleted = Table::get('module_merge') + ->whereIdWarehouse($id_warehouse) + ->whereIdModule($id_module) + ->whereIdMachineCluster($id_machine_cluster) + ->delete(); + + // return TRUE only if PDO delete successful + return $deleted; + + } + + + + + + } + + +?> diff --git a/build/database/repo/warehouse.php b/build/database/repo/warehouse.php index 2b071b1..e0d640f 100755 --- a/build/database/repo/warehouse.php +++ b/build/database/repo/warehouse.php @@ -2,6 +2,7 @@ namespace database\repo; use \database\core\DatabaseDriver; + use \database\core\Repo; use \manager\sessionManager; use \orm\core\Table; use \orm\core\Rows; @@ -97,20 +98,22 @@ public static function getModules($id_warehouse){ /* [1] On récupère les modules =========================================================*/ - $module = Table::get('module') - ->select('id_module') - ->select('name'); + /* (1) Récupération */ + $mod_req = new Repo('module/getByWarehouse', [$id_warehouse]); - $merge = Table::get('module_merge') - ->whereIdWarehouse($id_warehouse) - ->join('id_module', $module); + $answer = $mod_req->answer(); + + /* (2) Gestion erreur */ + if( $answer === false ) + return []; // no error - $modules = $merge->fetch(); /* [2] On formatte les données pour avoir 1 niveau de tableau =========================================================*/ - foreach($modules as $m=>$module) - $modules[$m] = $module['name']; + $modules = []; // id => name + + foreach($answer as $module) + $modules[$module['id_module']] = $module['name']; /* [3] On retourne la liste diff --git a/build/viewer/view/extension/view.php b/build/viewer/view/extension/view.php new file mode 100644 index 0000000..828ce5d --- /dev/null +++ b/build/viewer/view/extension/view.php @@ -0,0 +1,72 @@ + [ + 'group' => file_get_contents( __PUBLIC__.'/src/static/container/extension.svg' ) + ], + + 'p_theme' => $_SESSION['WAREHOUSE']['theme'] + ]; + + /* [3] Store functions + =========================================================*/ + $twig->addFunction(new \Twig_Function('f_clusters', function(){ + $request = new Request('clusterDefault/getAll', [ + 'class' => 1 + ]); + + $answer = $request->dispatch(); + + // si erreur, on affiche rien par défaut + if( $answer->error->get() != Err::Success ) + return []; + + return $answer->get('clusters'); + + })); + + $twig->addFunction(new \Twig_Function('f_modules', function($id_cluster){ + $extReq = new Request('clusterDefault/getModules', [ + 'id_cluster' => (int) $id_cluster + ]); + + $extRes = $extReq->dispatch(); + // si erreur, on affiche rien par défaut + if( $extRes->error->get() != Err::Success ) + return []; + + return $extRes->get('modules'); + })); + + + /* [4] Build the whole stuff + =========================================================*/ + return $twig->render('extension/view.twig', [ + 'p_icon' => $variables['p_icon'], + 'p_theme' => $variables['p_theme'] + ]); + } + + + } + + +?> diff --git a/build/viewer/view/extension/view.twig b/build/viewer/view/extension/view.twig new file mode 100644 index 0000000..edede42 --- /dev/null +++ b/build/viewer/view/extension/view.twig @@ -0,0 +1,42 @@ + + +{% for cluster in f_clusters() %} +
+ + {% set modulelist = f_modules(cluster.id_machine_cluster) %} + + {{ cluster.name }} + {{ p_icon.remove | raw }} + + {{ p_icon.edit | raw }} + + + {{ p_icon.device | raw }} + {{ modulelist | length }} modules + + + + {{ p_icon.group | raw }} + + + {% for module in modulelist %} + + {{ module.name }} + + + {% endfor %} + + + + + + +
+ +{# if no result #} +{% else %} + +
+ Aucun groupe trouvé. +
+ +{% endfor %} diff --git a/config/db-schema.json b/config/db-schema.json index cdcb9ca..d80b703 100644 --- a/config/db-schema.json +++ b/config/db-schema.json @@ -66,7 +66,7 @@ "name": { "type": "varchar(50)" } }, - "module_merge": { + "module_availability": { "#id_warehouse": { "type": "int", "ref": [ "warehouse", "id_warehouse" ] }, "#id_module": { "type": "int", "ref": [ "module", "id_module" ] } }, diff --git a/config/modules.json b/config/modules.json index 1709491..e168521 100755 --- a/config/modules.json +++ b/config/modules.json @@ -503,6 +503,17 @@ "output": { "clusters": { "description": "Liste des groupes d'utilisateurs.", "type": "array" } } + }, + + "POST::getModules": { + "description": "Retourne les modules d'un groupe de machines", + "permissions": [["admin"]], + "parameters": { + "id_cluster": { "description": "UID du groupe de machines", "type": "id" } + }, + "output": { + "modules": { "description": "Modules du groupe", "type": "array" } + } } }, diff --git a/config/repositories.json b/config/repositories.json index 96ab073..4ac7bd0 100755 --- a/config/repositories.json +++ b/config/repositories.json @@ -1,4 +1,13 @@ { + + "module": [ + "getAll", + "getByWarehouse", + "getByMachineCluster", + "link", + "unlink" + ], + "history": [ "create", "delete", diff --git a/public_html/css/container.scss b/public_html/css/container.scss index 8ce7258..0249eda 100755 --- a/public_html/css/container.scss +++ b/public_html/css/container.scss @@ -236,7 +236,8 @@ &.add-permission, &.add-group, - &.add-member{ + &.add-member, + &.add-extension{ border-radius: 3px; cursor: pointer; @@ -291,7 +292,8 @@ & > span.rem-group, & > span.icon-permission, & > span.rem-permission, - & > span.rem-member{ + & > span.rem-member, + & > span.rem-extension{ display: block; position: absolute; top: -1px; diff --git a/public_html/css/header.scss b/public_html/css/header.scss index 832723b..52ae6b5 100755 --- a/public_html/css/header.scss +++ b/public_html/css/header.scss @@ -39,7 +39,7 @@ width: $menu-side-width; height: $menu-side-width; - + background: transparent url('/src/static/logout@e0e7ed.svg') center center no-repeat; background-size: 40%; diff --git a/public_html/css/min/container.css b/public_html/css/min/container.css index 2e7b7e6..a80714a 100644 --- a/public_html/css/min/container.css +++ b/public_html/css/min/container.css @@ -248,30 +248,36 @@ cursor: default; } -#WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-permission, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-group, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-member, +#WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-permission, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-group, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-member, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-extension, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span.add-permission, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span.add-group, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span.add-member, +#WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span.add-extension, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore).add-permission, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore).add-group, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore).add-member, +#WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore).add-extension, #WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-permission, #WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-group, -#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-member { +#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-member, +#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-extension { border-radius: 3px; cursor: pointer; } -#WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-permission > div.dropdown, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-group > div.dropdown, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-member > div.dropdown, +#WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-permission > div.dropdown, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-group > div.dropdown, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-member > div.dropdown, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-extension > div.dropdown, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span.add-permission > div.dropdown, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span.add-group > div.dropdown, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span.add-member > div.dropdown, +#WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span.add-extension > div.dropdown, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore).add-permission > div.dropdown, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore).add-group > div.dropdown, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore).add-member > div.dropdown, +#WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore).add-extension > div.dropdown, #WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-permission > div.dropdown, #WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-group > div.dropdown, -#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-member > div.dropdown { +#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-member > div.dropdown, +#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-extension > div.dropdown { display: flex; flex-direction: column; flex-wrap: nowrap; @@ -290,32 +296,38 @@ z-index: 100; } -#WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-permission > div.dropdown > span, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-group > div.dropdown > span, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-member > div.dropdown > span, +#WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-permission > div.dropdown > span, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-group > div.dropdown > span, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-member > div.dropdown > span, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-extension > div.dropdown > span, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span.add-permission > div.dropdown > span, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span.add-group > div.dropdown > span, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span.add-member > div.dropdown > span, +#WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span.add-extension > div.dropdown > span, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore).add-permission > div.dropdown > span, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore).add-group > div.dropdown > span, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore).add-member > div.dropdown > span, +#WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore).add-extension > div.dropdown > span, #WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-permission > div.dropdown > span, #WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-group > div.dropdown > span, -#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-member > div.dropdown > span { +#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-member > div.dropdown > span, +#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-extension > div.dropdown > span { padding: .5em; padding-left: 1em; flex: 2em 1 1; cursor: pointer; } -#WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-permission > div.dropdown > span:hover, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-group > div.dropdown > span:hover, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-member > div.dropdown > span:hover, +#WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-permission > div.dropdown > span:hover, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-group > div.dropdown > span:hover, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-member > div.dropdown > span:hover, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore).add-extension > div.dropdown > span:hover, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span.add-permission > div.dropdown > span:hover, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span.add-group > div.dropdown > span:hover, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span.add-member > div.dropdown > span:hover, +#WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span.add-extension > div.dropdown > span:hover, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore).add-permission > div.dropdown > span:hover, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore).add-group > div.dropdown > span:hover, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore).add-member > div.dropdown > span:hover, +#WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore).add-extension > div.dropdown > span:hover, #WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-permission > div.dropdown > span:hover, #WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-group > div.dropdown > span:hover, -#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-member > div.dropdown > span:hover { +#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-member > div.dropdown > span:hover, +#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span.add-extension > div.dropdown > span:hover { background-color: #F8F8F8; } @@ -323,18 +335,22 @@ #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore) > span.icon-permission, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore) > span.rem-permission, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore) > span.rem-member, +#WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore) > span.rem-extension, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span > span.rem-group, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span > span.icon-permission, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span > span.rem-permission, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span > span.rem-member, +#WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span > span.rem-extension, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore) > span.rem-group, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore) > span.icon-permission, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore) > span.rem-permission, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore) > span.rem-member, +#WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore) > span.rem-extension, #WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span > span.rem-group, #WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span > span.icon-permission, #WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span > span.rem-permission, -#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span > span.rem-member { +#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span > span.rem-member, +#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span > span.rem-extension { display: block; position: absolute; top: -1px; @@ -356,18 +372,22 @@ #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore) > span.icon-permission:hover, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore) > span.rem-permission:hover, #WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore) > span.rem-member:hover, +#WRAPPER > #CONTAINER > section > .inline-box .groups > span:not(.ignore) > span.rem-extension:hover, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span > span.rem-group:hover, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span > span.icon-permission:hover, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span > span.rem-permission:hover, #WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span > span.rem-member:hover, +#WRAPPER > #CONTAINER > section > .inline-box .groups > span.ignore > span > span.rem-extension:hover, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore) > span.rem-group:hover, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore) > span.icon-permission:hover, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore) > span.rem-permission:hover, #WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore) > span.rem-member:hover, +#WRAPPER > #CONTAINER > section > .inline-row .groups > span:not(.ignore) > span.rem-extension:hover, #WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span > span.rem-group:hover, #WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span > span.icon-permission:hover, #WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span > span.rem-permission:hover, -#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span > span.rem-member:hover { +#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span > span.rem-member:hover, +#WRAPPER > #CONTAINER > section > .inline-row .groups > span.ignore > span > span.rem-extension:hover { background-image: url("/src/static/sub-menu-side/remove@d52918.svg"); } diff --git a/public_html/src/static/container/extension.svg b/public_html/src/static/container/extension.svg new file mode 100644 index 0000000..93badcc --- /dev/null +++ b/public_html/src/static/container/extension.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public_html/view/extensions.php b/public_html/view/extensions.php index 8688b35..b8db162 100755 --- a/public_html/view/extensions.php +++ b/public_html/view/extensions.php @@ -1,19 +1,20 @@