github.com/kotovmak/go-admin@v1.1.1/plugins/admin/controller/handler.go (about)

     1  package controller
     2  
     3  import (
     4  	template2 "html/template"
     5  	"regexp"
     6  	"strings"
     7  
     8  	"github.com/kotovmak/go-admin/context"
     9  	"github.com/kotovmak/go-admin/modules/auth"
    10  	"github.com/kotovmak/go-admin/modules/errors"
    11  	"github.com/kotovmak/go-admin/modules/logger"
    12  	"github.com/kotovmak/go-admin/plugins/admin/modules/constant"
    13  	"github.com/kotovmak/go-admin/plugins/admin/modules/form"
    14  	"github.com/kotovmak/go-admin/plugins/admin/modules/parameter"
    15  	"github.com/kotovmak/go-admin/plugins/admin/modules/response"
    16  	"github.com/kotovmak/go-admin/plugins/admin/modules/table"
    17  	"github.com/kotovmak/go-admin/template"
    18  	"github.com/kotovmak/go-admin/template/types"
    19  )
    20  
    21  // GlobalDeferHandler is a global error handler of admin plugin.
    22  func (h *Handler) GlobalDeferHandler(ctx *context.Context) {
    23  
    24  	logger.Access(ctx)
    25  
    26  	if !h.config.OperationLogOff {
    27  		h.RecordOperationLog(ctx)
    28  	}
    29  
    30  	if err := recover(); err != nil {
    31  		logger.Error(err)
    32  
    33  		var (
    34  			errMsg string
    35  			ok     bool
    36  			e      error
    37  		)
    38  
    39  		if errMsg, ok = err.(string); !ok {
    40  			if e, ok = err.(error); ok {
    41  				errMsg = e.Error()
    42  			}
    43  		}
    44  
    45  		if errMsg == "" {
    46  			errMsg = "system error"
    47  		}
    48  
    49  		if ctx.WantJSON() {
    50  			response.Error(ctx, errMsg)
    51  			return
    52  		}
    53  
    54  		if ok, _ = regexp.MatchString("/edit(.*)", ctx.Path()); ok {
    55  			h.setFormWithReturnErrMessage(ctx, errMsg, "edit")
    56  			return
    57  		}
    58  		if ok, _ = regexp.MatchString("/new(.*)", ctx.Path()); ok {
    59  			h.setFormWithReturnErrMessage(ctx, errMsg, "new")
    60  			return
    61  		}
    62  
    63  		h.HTML(ctx, auth.Auth(ctx), template.WarningPanelWithDescAndTitle(errMsg, errors.Msg, errors.Msg))
    64  	}
    65  }
    66  
    67  func (h *Handler) setFormWithReturnErrMessage(ctx *context.Context, errMsg string, kind string) {
    68  
    69  	var (
    70  		formInfo table.FormInfo
    71  		prefix   = ctx.Query(constant.PrefixKey)
    72  		panel    = h.table(prefix, ctx)
    73  		btnWord  template2.HTML
    74  		f        *types.FormPanel
    75  	)
    76  
    77  	if kind == "edit" {
    78  		f = panel.GetForm()
    79  		id := ctx.Query("id")
    80  		if id == "" {
    81  			id = ctx.Request.MultipartForm.Value[panel.GetPrimaryKey().Name][0]
    82  		}
    83  		formInfo, _ = panel.GetDataWithId(parameter.GetParam(ctx.Request.URL,
    84  			panel.GetInfo().DefaultPageSize,
    85  			panel.GetInfo().SortField,
    86  			panel.GetInfo().GetSort()).WithPKs(id))
    87  		btnWord = f.FormEditBtnWord
    88  	} else {
    89  		f = panel.GetActualNewForm()
    90  		formInfo = panel.GetNewFormInfo()
    91  		formInfo.Title = f.Title
    92  		formInfo.Description = f.Description
    93  		btnWord = f.FormNewBtnWord
    94  	}
    95  
    96  	queryParam := parameter.GetParam(ctx.Request.URL, panel.GetInfo().DefaultPageSize,
    97  		panel.GetInfo().SortField, panel.GetInfo().GetSort()).GetRouteParamStr()
    98  
    99  	h.HTML(ctx, auth.Auth(ctx), types.Panel{
   100  		Content: aAlert().Warning(errMsg) + formContent(aForm().
   101  			SetContent(formInfo.FieldList).
   102  			SetTabContents(formInfo.GroupFieldList).
   103  			SetTabHeaders(formInfo.GroupFieldHeaders).
   104  			SetTitle(template2.HTML(strings.Title(kind))).
   105  			SetPrimaryKey(panel.GetPrimaryKey().Name).
   106  			SetPrefix(h.config.PrefixFixSlash()).
   107  			SetHiddenFields(map[string]string{
   108  				form.TokenKey:    h.authSrv().AddToken(),
   109  				form.PreviousKey: h.config.Url("/info/" + prefix + queryParam),
   110  			}).
   111  			SetUrl(h.config.Url("/"+kind+"/"+prefix)).
   112  			SetOperationFooter(formFooter(kind, f.IsHideContinueEditCheckBox, f.IsHideContinueNewCheckBox,
   113  				f.IsHideResetButton, btnWord)).
   114  			SetHeader(f.HeaderHtml).
   115  			SetFooter(f.FooterHtml), len(formInfo.GroupFieldHeaders) > 0,
   116  			ctx.IsIframe(),
   117  			f.IsHideBackButton, f.Header),
   118  		Description: template2.HTML(formInfo.Description),
   119  		Title:       template2.HTML(formInfo.Title),
   120  	})
   121  
   122  	ctx.AddHeader(constant.PjaxUrlHeader, h.config.Url("/info/"+prefix+"/"+kind+queryParam))
   123  }