From b401c04a16e870af6789a7cc89e530873653037c Mon Sep 17 00:00:00 2001
From: 이민희 <mhlee@maprex.co.kr>
Date: 금, 05 11월 2021 13:03:39 +0900
Subject: [PATCH] "부서 관리" 프론트

---
 src/main/webapp/scripts/app/manageUser/manageUser.controller.js               |    2 
 src/main/webapp/views/workspace/workspaceUserLevelConfig.html                 |    2 
 src/main/webapp/scripts/app/workspace/departmentModify.controller.js          |   97 +++++++++++++++++++
 src/main/webapp/views/workspace/workspaceDepartmentModify.html                |   58 +++++++++++
 src/main/webapp/scripts/app/workspace/levelModify.controller.js               |    4 
 src/main/webapp/views/workspace/workspaceLevelModify.html                     |    4 
 src/main/webapp/i18n/ko/global.json                                           |    3 
 src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js  |    9 +
 src/main/webapp/scripts/app/workspace/workspaceDepartmentConfig.controller.js |   54 +++++++---
 src/main/webapp/scripts/components/userWorkspace/userWorkspace.service.js     |   21 +++
 src/main/webapp/views/workspace/workspaceDepartmentConfig.html                |   29 ++---
 11 files changed, 241 insertions(+), 42 deletions(-)

diff --git a/src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js b/src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js
index 732c3b0..527d5ed 100644
--- a/src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js
+++ b/src/main/webapp/custom_components/js-table/tableColumnGenerator.directive.js
@@ -328,6 +328,15 @@
                                             makeTag += "<label class='switch'><input type='checkbox' ng-model='data.permGuide' ng-click='event.modifyLevelPermission(data)'><span class='slider round'></span></label>";
                                             break;
 
+                                        case "DEPARTMENT_MODIFY":
+                                            if ($rootScope.checkMngPermission('USER_PERMISSION_MNG_WORKSPACE')) {
+                                                makeTag += "<span class='titlename cursor table-word-break-all' ng-click='event.modifyDepartment(data.id)'>" + scope.data.departmentName + "</span>";
+                                            }
+                                            else {
+                                                makeTag += "<span class='titlename cursor table-word-break-all'>" + scope.data.departmentName + "</span>";
+                                            }
+                                            break;
+
                                         case "DEPARTMENT_OPTION" :
                                             makeTag +="<select class='form-control input-sm' ng-model='data.departmentId' ng-change=''><option ng-repeat='department in data.departments' ng-value='department.fieldKey'>{{::department.fieldValue}}</option></select>";
                                             break;
diff --git a/src/main/webapp/i18n/ko/global.json b/src/main/webapp/i18n/ko/global.json
index 2bdc5d8..1091b13 100644
--- a/src/main/webapp/i18n/ko/global.json
+++ b/src/main/webapp/i18n/ko/global.json
@@ -66,6 +66,7 @@
         "addLevel" : "�벑湲� 異붽�",
         "levelName" : "�벑湲됰챸",
         "failedLevelRegistration" : "�궗�슜�옄 �벑湲� �벑濡� �떎�뙣",
+        "failedDepartmentRegistration" : "遺��꽌 �벑濡� �떎�뙣",
         "read" : "�씫湲�",
         "write" : "�벐湲�",
         "departmentManagement" : "遺��꽌 愿�由�",
@@ -139,6 +140,8 @@
         "failedToRegularPaymentChange": "�젙湲� 寃곗젣 蹂�寃� �떎�뙣",
         "failedToParticipationStatusChange": "李몄뿬 �긽�깭 蹂�寃� �떎�뙣",
         "failedToSelectWorkspaceFullUserList": "�뾽臾� 怨듦컙 �쟾泥� �궗�슜�옄 紐⑸줉 議고쉶 �떎�뙣",
+        "failedToSelectWorkspaceFullUserLevelList": "�궗�슜�옄 �벑湲� 紐⑸줉 議고쉶 �떎�뙣",
+        "failedToSelectWorkspaceFullDepartmentList": "遺��꽌 紐⑸줉 議고쉶 �떎�뙣",
         "failedToModifyUserLevel": "�궗�슜�옄 �벑湲� �긽�꽭 �젙蹂� 議고쉶 �떎�뙣"
     },
     "issue": {
diff --git a/src/main/webapp/scripts/app/manageUser/manageUser.controller.js b/src/main/webapp/scripts/app/manageUser/manageUser.controller.js
index 640d693..2c18495 100644
--- a/src/main/webapp/scripts/app/manageUser/manageUser.controller.js
+++ b/src/main/webapp/scripts/app/manageUser/manageUser.controller.js
@@ -103,7 +103,7 @@
                         .setHWidth("width-40-p")
                         .setDAlign("text-center")
                         .setDName("account"));
-                    $scope.vm.tableConfigs1.push($tableProvider.config()
+                    $scope.vm.tableConfigs.push($tableProvider.config()
                         .setHName("manageUser.manageWorkspacePerm")
                         .setHWidth("width-120-p")
                         .setDType("renderer")
diff --git a/src/main/webapp/scripts/app/workspace/departmentModify.controller.js b/src/main/webapp/scripts/app/workspace/departmentModify.controller.js
new file mode 100644
index 0000000..405e87e
--- /dev/null
+++ b/src/main/webapp/scripts/app/workspace/departmentModify.controller.js
@@ -0,0 +1,97 @@
+/**
+ * Created by wisestone on 2018-05-08.
+ */
+'use strict';
+
+define([
+        'app',
+        'angular'
+    ],
+    function (app, angular) {
+        app.controller('departmentModifyController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$uibModalInstance', 'UserWorkspace', 'parameter', 'SweetAlert', '$filter',
+            function ($scope, $rootScope, $log, $resourceProvider, $uibModalInstance, UserWorkspace, parameter, SweetAlert, $filter) {
+
+                $scope.fn = {
+                    getDepartmentList : getDepartmentList,  //  遺��꽌 愿�由� 由ъ뒪�듃
+                    cancel : cancel,    //  �뙘�뾽 李� �떕湲�
+                    formSubmit : formSubmit,    //  �뤌 �쟾�넚
+                    formCheck : formCheck,  //  �뤌 泥댄겕
+                };
+
+                $scope.vm = {
+                    id : parameter.id,
+                    form : {
+                        departmentName : "",
+                        departmentEx : ""
+                    }
+                };
+
+                //  遺��꽌 愿�由� 紐⑸줉 議고쉶
+                function getDepartmentList() {
+
+                    var conditions = {
+                        id : $scope.vm.id
+                    };
+
+                    //�뀒�씠釉� 由ъ뒪�듃 �뜲�씠�꽣 而⑦듃濡ㅻ윭 �슂泥�
+                    UserWorkspace.departmentFind($resourceProvider.getContent(conditions,
+                        $resourceProvider.getPageContent(0, 10))).then(function (result) {
+
+                        if (result.data.message.status === "success") {
+                            $scope.vm.form.departmentName = result.data.data[0].departmentName; //departmentName 媛��졇�삤湲�
+                            $scope.vm.form.departmentDescription = result.data.data[0].departmentDescription; //departmentEx 媛��졇�삤湲�
+
+                        }
+                        else {
+                            SweetAlert.error($filter("translate")("managementWorkspace.failedToSelectWorkspaceFullDepartmentList"), result.data.message.message); // "遺��꽌 愿�由� 紐⑸줉 議고쉶 �떎�뙣"
+                        }
+                    });
+                }
+
+                function formCheck(formInvalid) {
+                    if (formInvalid) {
+                        return true;
+                    }
+
+                    return false;
+                }
+
+                //  �뤌 �쟾�넚
+                function formSubmit(condition) {
+                    $rootScope.spinner = true;
+
+                    var content = {
+                        id : parameter.id,
+                        title : $rootScope.preventXss($scope.vm.form.departmentName),
+                        description : $rootScope.preventXss($scope.vm.form.departmentDescription)
+                    };
+
+                    UserWorkspace.modifyDepartment($resourceProvider.getContent(condition,
+                        content,
+                        $resourceProvider.getPageContent(0, 0))).then(function (result) {
+
+                        if (result.data.message.status === "success") {
+                            $scope.fn.cancel();
+                            //  紐⑸줉 �솕硫� 媛깆떊
+                            $rootScope.$broadcast("getDepartmentList", {});
+                        }
+                        else {
+                            SweetAlert.error($filter("translate")("managementWorkspace.failedDepartmentRegistration"), result.data.message.message);
+                        }
+
+                        $rootScope.spinner = false;
+                    });
+
+                }
+
+                //  �뙘�뾽 李� �떕湲�
+                function cancel() {
+                    $rootScope.$broadcast("closeLayer");    //  �뙘�뾽�씠 �뿴由ш퀬 �굹�꽌 js-multi, js-single �벑�뿉�꽌 body �씠踰ㅽ듃媛� �궇�븘媛��뒗 �쁽�긽 �닔�젙
+                    $uibModalInstance.dismiss('cancel');
+                    $(document).unbind("keydown");  //  �떒異뺥궎 �씠踰ㅽ듃 �젣嫄�
+                }
+
+                $scope.fn.getDepartmentList();
+
+            }]);
+    });
diff --git a/src/main/webapp/scripts/app/workspace/levelModify.controller.js b/src/main/webapp/scripts/app/workspace/levelModify.controller.js
index 767b821..94815ed 100644
--- a/src/main/webapp/scripts/app/workspace/levelModify.controller.js
+++ b/src/main/webapp/scripts/app/workspace/levelModify.controller.js
@@ -16,8 +16,6 @@
                     cancel : cancel,    //  �뙘�뾽 李� �떕湲�
                     formSubmit : formSubmit,    //  �뤌 �쟾�넚
                     formCheck : formCheck,  //  �뤌 泥댄겕
-                    //modifyUserPermission : modifyUserPermission,   //  沅뚰븳 蹂�寃�
-                    //detail : detail //  �긽�꽭 �젙蹂�
                 };
 
                 $scope.vm = {
@@ -51,7 +49,7 @@
 
                         }
                         else {
-                            SweetAlert.error($filter("translate")("managementWorkspace.failedToSelectWorkspaceFullUserList"), result.data.message.message); // "�궗�슜�옄 �벑湲� 紐⑸줉 議고쉶 �떎�뙣"
+                            SweetAlert.error($filter("translate")("managementWorkspace.failedToSelectWorkspaceFullUserLevelList"), result.data.message.message); // "�궗�슜�옄 �벑湲� 紐⑸줉 議고쉶 �떎�뙣"
                         }
                     });
                 }
diff --git a/src/main/webapp/scripts/app/workspace/workspaceDepartmentConfig.controller.js b/src/main/webapp/scripts/app/workspace/workspaceDepartmentConfig.controller.js
index 9e98603..b56f44d 100644
--- a/src/main/webapp/scripts/app/workspace/workspaceDepartmentConfig.controller.js
+++ b/src/main/webapp/scripts/app/workspace/workspaceDepartmentConfig.controller.js
@@ -35,8 +35,8 @@
                 };
 
                 //  �뀒�씠釉� �씠踰ㅽ듃
-                $scope.vm.tableEvent = {
-                    // modifyUserWorkspace : modifyUserWorkspace   //  �뾽臾� 怨듦컙 李몄뿬�븯�뒗 �궗�슜�옄�쓽 李몄뿬 �긽�깭 蹂�寃�
+                $scope.vm.tableEvent2 = {
+                    modifyDepartment : modifyDepartment //遺��꽌紐� 蹂�寃�
                 };
 
                 //  遺��꽌 愿�由� 由ъ뒪�듃 遺덈윭�삤湲�
@@ -61,17 +61,19 @@
                         .setHName("manageDepartment.departmentName")
                         .setHWidth("width-120-p")
                         .setDAlign("text-center")
-                        .setDName("levelName"));
+                        .setDName("departmentName")
+                        .setDType("renderer")
+                        .setDRenderer("DEPARTMENT_MODIFY"));
                     $scope.vm.tableConfigs2.push($tableProvider.config()
-                        .setHName("manageDepartment.departmentEx")
+                        .setHName("manageDepartment.departmentDescription")
                         .setHWidth("width-120-p")
                         .setDAlign("text-center")
-                        .setDName("manageProject"));
+                        .setDName("departmentDescription"));
                     $scope.vm.tableConfigs2.push($tableProvider.config()
                         .setHName("manageDepartment.departmentCount")
                         .setHWidth("width-120-p")
                         .setDAlign("text-center")
-                        .setDName("IssueSystem"));
+                        .setDName("departmentCount"));
                 }
 
                 //  遺��꽌 愿�由� 紐⑸줉 議고쉶
@@ -95,17 +97,17 @@
                     };
 
                     //�뀒�씠釉� 由ъ뒪�듃 �뜲�씠�꽣 而⑦듃濡ㅻ윭 �슂泥�
-                    // UserWorkspace.departmentFind($resourceProvider.getContent(conditions,
-                    //     $resourceProvider.getPageContent(currentPage, $scope.vm.page.selectedPageRowCount))).then(function (result) {
-                    //
-                    //     if (result.data.message.status === "success") {
-                    //         $scope.vm.page.selectedPage = currentPage + 1;
-                    //         $scope.vm.responseData = result.data;
-                    //     }
-                    //     else {
-                    //         SweetAlert.error($filter("translate")("managementWorkspace.failedToSelectWorkspaceFullUserList"), result.data.message.message); // "�뾽臾� 怨듦컙 �쟾泥� �궗�슜�옄 紐⑸줉 議고쉶 �떎�뙣"
-                    //     }
-                    // });
+                    UserWorkspace.departmentFind($resourceProvider.getContent(conditions,
+                        $resourceProvider.getPageContent(currentPage, $scope.vm.page.selectedPageRowCount))).then(function (result) {
+
+                        if (result.data.message.status === "success") {
+                            $scope.vm.page.selectedPage = currentPage + 1;
+                            $scope.vm.responseData = result.data;
+                        }
+                        else {
+                            SweetAlert.error($filter("translate")("managementWorkspace.failedToSelectWorkspaceFullUserList"), result.data.message.message); // "�뾽臾� 怨듦컙 �쟾泥� �궗�슜�옄 紐⑸줉 議고쉶 �떎�뙣"
+                        }
+                    });
                 }
                 //  遺��꽌 異붽�
                 function departmentAdd() {
@@ -125,6 +127,24 @@
                         }
                     });
                 }
+
+                //  遺��꽌紐� �닔�젙
+                function modifyDepartment(id) {
+                    $uibModal.open({
+                        templateUrl : 'views/workspace/workspaceDepartmentModify.html',
+                        size : "md",
+                        controller : 'departmentModifyController',
+                        backdrop : 'static',
+                        resolve : {
+                            parameter : function () {
+                                return {
+                                    id : id
+                                };
+                            }
+                        }
+                    });
+                }
+
                 $scope.fn.makeTableConfigs();
                 $scope.fn.getDepartmentList();
 
diff --git a/src/main/webapp/scripts/components/userWorkspace/userWorkspace.service.js b/src/main/webapp/scripts/components/userWorkspace/userWorkspace.service.js
index ad1614b..51b44f7 100644
--- a/src/main/webapp/scripts/components/userWorkspace/userWorkspace.service.js
+++ b/src/main/webapp/scripts/components/userWorkspace/userWorkspace.service.js
@@ -6,6 +6,7 @@
 define(['app'], function (app) {
     app.factory("UserWorkspace", ['$http', '$log', function ($http, $log) {
         return {
+            //�궗�슜�옄 �벑湲� 愿�由�
             levelFind : function (conditions) {
                 return $http.post("userLevel/find", conditions).then(function (response) {
                     $log.debug("�궗�슜�옄 �벑湲� 紐⑸줉 : ", response);
@@ -30,18 +31,34 @@
                     return response;
                 });
             },
+            
+            //遺��꽌 愿�由�
             departmentFind : function (conditions) {
-                return $http.post("userWorkspace/departmentFind", conditions).then(function (response) {
+                return $http.post("departmentManage/find", conditions).then(function (response) {
                     $log.debug("遺��꽌 紐⑸줉 : ", response);
                     return response;
                 });
             },
             departmentAdd : function (conditions) {
-                return $http.post("userWorkspace/departmentAdd", conditions).then(function (response) {
+                return $http.post("departmentManage/add", conditions).then(function (response) {
                     $log.debug("遺��꽌 �깮�꽦 寃곌낵 : ", response);
                     return response;
                 });
             },
+            departmentModify : function (conditions) {
+                return $http.post("departmentManage/modify", conditions).then(function (response) {
+                    $log.debug("遺��꽌 �닔�젙 寃곌낵 : ", response);
+                    return response;
+                });
+            },
+            departmentRemove : function (conditions) {
+                return $http.post("departmentManage/remove", conditions).then(function (response) {
+                    $log.debug("遺��꽌 �궘�젣 寃곌낵 : ", response);
+                    return response;
+                });
+            },
+            
+            //�궗�슜�옄 愿�由�
             find : function (conditions) {
                 return $http.post("userWorkspace/find", conditions).then(function (response) {
                     $log.debug("�썙�겕�뒪�럹�씠�뒪�뿉 李몄뿬�븯�뒗 �쟾泥� �궗�슜�옄 紐⑸줉 : ", response);
diff --git a/src/main/webapp/views/workspace/workspaceDepartmentConfig.html b/src/main/webapp/views/workspace/workspaceDepartmentConfig.html
index 15f5661..15dd3d1 100644
--- a/src/main/webapp/views/workspace/workspaceDepartmentConfig.html
+++ b/src/main/webapp/views/workspace/workspaceDepartmentConfig.html
@@ -114,28 +114,25 @@
                             </label>
                         </div>
                     </div>
-                    <!--<div class="col-sm-6 text-right">
-                        <div class="btn-group">
-                            <button aria-expanded="false"
-                                    aria-haspopup="true"
-                                    class="btn btn-secondary dropdown-toggle"
-                                    data-toggle="dropdown"
-                                    type="button">異붽�湲곕뒫
-                            </button>
-                            <div aria-labelledby="dropdownMenuButton2"
-                                 class="dropdown-menu"
-                                 x-placement="bottom-start"
-                                 style="position: absolute; transform: translate3d(0px, 30px, 0px); top: 0px; left: 0px; will-change: transform;">
-                                <a class="dropdown-item" href="#"> �궘�젣</a>
+                    <div class="col-sm-6 text-right" ng-if="$root.checkMngPermission('USER_PERMISSION_MNG_WORKSPACE')">
+                        <form class="form-inline justify-content-sm-end pull-right ng-pristine ng-valid" method="post" action="/departmentManage/downloadExcel" name="departmentManageListForm">
+                            <input type="hidden" name="conditions" autocomplete="off">
+                            <div class="btn-group">
+                                <button aria-expanded="false" aria-haspopup="true" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" type="button"><span translate="common.addFunction" class="ng-scope">異붽�湲곕뒫</span>
+                                </button>
+                                <div aria-labelledby="dropdownMenuButton2" class="dropdown-menu left-menu" x-placement="bottom-start">
+                                    <a class="dropdown-item cursor ng-isolate-scope" form-submit="departmentManageListForm" make-search-conditions="fn.makeSearchConditions()"><span translate="common.downloadExcel" class="ng-scope">�뿊�� �떎�슫濡쒕뱶</span></a>
+                                    <a class="dropdown-item cursor" ng-click="fn.removes()"> <span translate="common.delete" class="ng-scope">�궘�젣</span></a>
+                                </div>
                             </div>
-                        </div>
-                    </div>-->
+                        </form>
+                    </div>
                 </div>
             </div>
 
             <div class="table-responsive">
                 <js-table data="vm.responseData.data" table-configs="vm.tableConfigs2"
-                          event="vm.tableEvent"></js-table>
+                          event="vm.tableEvent2"></js-table>
             </div>
 
             <div class="controls-below-table text-center">
diff --git a/src/main/webapp/views/workspace/workspaceDepartmentModify.html b/src/main/webapp/views/workspace/workspaceDepartmentModify.html
new file mode 100644
index 0000000..94b1e47
--- /dev/null
+++ b/src/main/webapp/views/workspace/workspaceDepartmentModify.html
@@ -0,0 +1,58 @@
+<div class="formModal">
+    <div class="modal-header faded smaller">
+        <div class="modal-title">
+            <strong>遺��꽌紐� �닔�젙</strong>
+        </div>
+        <button aria-label="Close" class="close" type="button" ng-click="fn.cancel()">
+            <span aria-hidden="true"> &times;</span>
+        </button>
+    </div>
+
+    <div class="modal-body">
+        <form role="form" name="departmentModifyForm">
+            <div class="form-group">
+                <label for="departmentModifyForm1">
+                    <span translate="common.departmentName">遺��꽌紐�</span>
+                    <code class="highlighter-rouge">*</code>
+                </label>
+                <input id="departmentModifyForm1"
+                       name="name"
+                       type="text"
+                       class="form-control"
+                       autofocus
+                       kr-input
+                       input-regex="[^a-zA-Z0-9 媛�-�옡�꽦-�뀕�뀖-�뀭\u318D\u119E\u11A2\u2022\u2025a\u00B7\uFE55]"
+                       autocomplete="off"
+                       ng-model="vm.form.departmentName"
+                       ng-maxlength="200"
+                       maxlength="200"
+                       required>
+                <!--<small translate="notice.enterSpecialCharacters">�젣紐⑹뿉�뒗 �듅�닔 臾몄옄瑜� �엯�젰�븷 �닔 �뾾�뒿�땲�떎.</small>-->
+            </div>
+
+            <div class="form-group">
+                <label>
+                    <span translate="manageDepartment.departmentEx">遺��꽌 �꽕紐�</span>
+                    <code class="highlighter-rouge">*</code>
+                </label>
+                <summernote
+                        class="summernote"
+                        lang="ko-KR"
+                        required
+                        config="vm.options"
+                        ng-model="vm.form.description"
+                        target=".note-editable"></summernote>
+            </div>
+        </form>
+    </div>
+
+    <div class="modal-footer buttons-on-right">
+        <button type="button" class="btn btn-md btn-grey" ng-click="fn.cancel()"><span translate="common.cancel">痍⑥냼</span></button>
+        <button type="button" class="btn btn-md btn-primary bold"
+                js-short-cut
+                js-short-cut-action="(fn.formCheck(departmentModifyForm.$invalid) || $root.spinner) ? null : fn.formSubmit()"
+                ng-disabled="fn.formCheck(departmentModifyForm.$invalid)"
+                ng-click="fn.formSubmit()"><span translate="common.save">���옣</span>
+        </button>
+    </div>
+</div>
\ No newline at end of file
diff --git a/src/main/webapp/views/workspace/workspaceLevelModify.html b/src/main/webapp/views/workspace/workspaceLevelModify.html
index 5dbb0f4..87e3f3c 100644
--- a/src/main/webapp/views/workspace/workspaceLevelModify.html
+++ b/src/main/webapp/views/workspace/workspaceLevelModify.html
@@ -13,11 +13,11 @@
             <table class="table table-lightborder">
                 <tr>
                     <td>
-                        <label for="levelAddForm1"><span translate="managementWorkspace.levelName">�벑湲됰챸</span><code class="highlighter-rouge">*</code></label>
+                        <label for="levelModifyForm1"><span translate="managementWorkspace.levelName">�벑湲됰챸</span><code class="highlighter-rouge">*</code></label>
                     </td>
                     <td>
                         <div class="input-group mb-0 mr-sm-0 mb-sm-0">
-                            <input id="levelAddForm1"
+                            <input id="levelModifyForm1"
                                    name="levelName"
                                    type="text"
                                    class="form-control"
diff --git a/src/main/webapp/views/workspace/workspaceUserLevelConfig.html b/src/main/webapp/views/workspace/workspaceUserLevelConfig.html
index 8df62d9..6454cb8 100644
--- a/src/main/webapp/views/workspace/workspaceUserLevelConfig.html
+++ b/src/main/webapp/views/workspace/workspaceUserLevelConfig.html
@@ -44,7 +44,7 @@
                             </label>
                         </div>
                     </div>
-                    <div class="col-sm-6 text-right" ng-if="$root.checkMngPermission('USER_PERMISSION_MNG_API')">
+                    <div class="col-sm-6 text-right" ng-if="$root.checkMngPermission('USER_PERMISSION_MNG_WORKSPACE')">
                         <form class="form-inline justify-content-sm-end pull-right ng-pristine ng-valid" method="post" action="/userLevel/downloadExcel" name="userLevelListForm">
                             <input type="hidden" name="conditions" autocomplete="off">
                             <div class="btn-group">

--
Gitblit v1.8.0