ImagePreviewGroup.js 5.25 KB
import template from "./ImagePreviewGroup.html";
angular
    .module("esNgAntd")
    .directive("esImagePreviewGroup", function (esNgAntd) {
        return {
            controllerAs: "esImagePreviewGroup",
            restrict: "E",
            transclude: true,
            replace: true,
            scope: {
                preview: "=",
            },
            template: template,
            controller: function ($scope, $element, $attrs) {
                this.getContext = function () {
                    return $scope;
                };

                $scope.state = {
                    current: 0,
                    visible: false,
                    src: null,
                    childrens: [],
                };

                $scope.addChildren = function (children) {
                    $scope.state.childrens.push(children);
                    return $scope.state.childrens.length - 1;
                };

                $scope.setCurrent = function (value) {
                    $scope.state.current = value;

                    if (
                        typeof $scope.preview === "object" &&
                        typeof $scope.preview.onCurrentChange === "function"
                    ) {
                        $scope.preview.onCurrentChange(value);
                    }
                };

                $scope.setVisible = function (value) {
                    $scope.state.visible = value;

                    if (
                        typeof $scope.preview === "object" &&
                        typeof $scope.preview.onVisibleChange === "function"
                    ) {
                        $scope.preview.onVisibleChange(value);
                    }
                };

                $scope.handleOpen = function (index) {
                    $scope.setCurrent(index);
                    $scope.state.src = $scope.state.childrens[index].state.src;
                    $scope.setVisible(true);
                };

                $scope.handleClose = function () {
                    $scope.setVisible(false);
                };

                $scope.handlePrev = function () {
                    $scope.setCurrent(
                        $scope.state.current > 0 ? $scope.state.current - 1 : 0
                    );
                    $scope.state.src =
                        $scope.state.childrens[$scope.state.current].state.src;
                };

                $scope.handleNext = function () {
                    $scope.setCurrent(
                        $scope.state.current < $scope.state.childrens.length - 1
                            ? $scope.state.current + 1
                            : $scope.state.childrens.length - 1
                    );
                    $scope.state.src =
                        $scope.state.childrens[$scope.state.current].state.src;
                };

                $scope.handlePreview = function () {
                    let className;

                    if ($attrs.class) {
                        className = ` ${$attrs.class}`;
                    }

                    esNgAntd.createLayer(
                        `
            <div class="ant-image-preview-root${className}">
                <div class="ant-image-preview-mask" ng-if="state.visible"></div>
                <div class="ant-image-preview-wrap" ng-show="state.visible">
                    <div class="ant-image-preview">
                        <div class="ant-image-preview-content">
                            <div class="ant-image-preview-body">
                                <ul class="ant-image-preview-operations">
                                    <li class="ant-image-preview-operations-operation">
                                        <span class="anticon anticon-close ant-image-preview-operations-icon" ng-click="handleClose()">
                                            <es-icon type="CloseOutlined"></es-icon>
                                        </span>
                                    </li> 
                                </ul>
                                <div class="ant-image-preview-img-wrapper">
                                    <img class="ant-image-preview-img" ng-src="{{state.src}}"/>
                                </div>
                                <div ng-class="{'ant-image-preview-switch-left': true, 'ant-image-preview-switch-left-disabled': state.current===0}" ng-click="handlePrev()">
                                    <es-icon type="LeftOutlined"></es-icon>
                                </div>
                                <div ng-class="{'ant-image-preview-switch-right': true,'ant-image-preview-switch-right-disabled': (state.childrens.length-1)===state.current}"  ng-click="handleNext()">
                                    <es-icon type="RightOutlined"></es-icon>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        `,
                        $scope
                    );
                };
            },
            link: function (
                $scope,
                $element,
                $attrs,
                $controllers,
                $transclude
            ) {
                $scope.handlePreview();
            },
        };
    });