mirror of
https://github.com/thomiceli/opengist.git
synced 2025-06-20 16:58:00 +02:00
Save content form on gist create error (#420)
This commit is contained in:
@ -567,6 +567,32 @@ func (gist *Gist) TopicsSlice() []string {
|
|||||||
return topics
|
return topics
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (gist *Gist) ToDTO() (*GistDTO, error) {
|
||||||
|
files, err := gist.Files("HEAD", false)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
fileDTOs := make([]FileDTO, 0, len(files))
|
||||||
|
for _, file := range files {
|
||||||
|
fileDTOs = append(fileDTOs, FileDTO{
|
||||||
|
Filename: file.Filename,
|
||||||
|
Content: file.Content,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return &GistDTO{
|
||||||
|
Title: gist.Title,
|
||||||
|
Description: gist.Description,
|
||||||
|
URL: gist.URL,
|
||||||
|
Files: fileDTOs,
|
||||||
|
VisibilityDTO: VisibilityDTO{
|
||||||
|
Private: gist.Private,
|
||||||
|
},
|
||||||
|
Topics: strings.Join(gist.TopicsSlice(), " "),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
// -- DTO -- //
|
// -- DTO -- //
|
||||||
|
|
||||||
type GistDTO struct {
|
type GistDTO struct {
|
||||||
@ -580,6 +606,10 @@ type GistDTO struct {
|
|||||||
VisibilityDTO
|
VisibilityDTO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (dto *GistDTO) HasMetadata() bool {
|
||||||
|
return dto.Title != "" || dto.Description != "" || dto.URL != "" || dto.Topics != ""
|
||||||
|
}
|
||||||
|
|
||||||
type VisibilityDTO struct {
|
type VisibilityDTO struct {
|
||||||
Private Visibility `validate:"number,min=0,max=2" form:"private"`
|
Private Visibility `validate:"number,min=0,max=2" form:"private"`
|
||||||
}
|
}
|
||||||
|
@ -62,6 +62,7 @@ func ProcessCreate(ctx *context.Context) error {
|
|||||||
Content: escapedValue,
|
Content: escapedValue,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
ctx.SetData("dto", dto)
|
||||||
|
|
||||||
err = ctx.Validate(dto)
|
err = ctx.Validate(dto)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -10,12 +10,12 @@ import (
|
|||||||
func Edit(ctx *context.Context) error {
|
func Edit(ctx *context.Context) error {
|
||||||
gist := ctx.GetData("gist").(*db.Gist)
|
gist := ctx.GetData("gist").(*db.Gist)
|
||||||
|
|
||||||
files, err := gist.Files("HEAD", false)
|
gistDto, err := gist.ToDTO()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ctx.ErrorRes(500, "Error fetching files from repository", err)
|
return ctx.ErrorRes(500, "Error getting gist data", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.SetData("files", files)
|
ctx.SetData("dto", gistDto)
|
||||||
ctx.SetData("htmlTitle", ctx.TrH("gist.edit.edit-gist", gist.Title))
|
ctx.SetData("htmlTitle", ctx.TrH("gist.edit.edit-gist", gist.Title))
|
||||||
|
|
||||||
return ctx.Html("edit.html")
|
return ctx.Html("edit.html")
|
||||||
|
@ -49,7 +49,7 @@ func (s *Server) registerMiddlewares() {
|
|||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
}))
|
}))
|
||||||
s.echo.Use(middleware.Recover())
|
//s.echo.Use(middleware.Recover())
|
||||||
s.echo.Use(middleware.Secure())
|
s.echo.Use(middleware.Secure())
|
||||||
s.echo.Use(Middleware(sessionInit).toEcho())
|
s.echo.Use(Middleware(sessionInit).toEcho())
|
||||||
|
|
||||||
@ -79,9 +79,9 @@ func (s *Server) registerMiddlewares() {
|
|||||||
|
|
||||||
func (s *Server) errorHandler(err error, ctx echo.Context) {
|
func (s *Server) errorHandler(err error, ctx echo.Context) {
|
||||||
var httpErr *echo.HTTPError
|
var httpErr *echo.HTTPError
|
||||||
|
data := ctx.Request().Context().Value(context.DataKeyStr).(echo.Map)
|
||||||
if errors.As(err, &httpErr) {
|
if errors.As(err, &httpErr) {
|
||||||
acceptJson := strings.Contains(ctx.Request().Header.Get("Accept"), "application/json")
|
acceptJson := strings.Contains(ctx.Request().Header.Get("Accept"), "application/json")
|
||||||
data := ctx.Request().Context().Value(context.DataKeyStr).(echo.Map)
|
|
||||||
data["error"] = err
|
data["error"] = err
|
||||||
if acceptJson {
|
if acceptJson {
|
||||||
if err := ctx.JSON(httpErr.Code, httpErr); err != nil {
|
if err := ctx.JSON(httpErr.Code, httpErr); err != nil {
|
||||||
@ -96,8 +96,13 @@ func (s *Server) errorHandler(err error, ctx echo.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.Error().Err(err).Send()
|
||||||
|
httpErr = echo.NewHTTPError(http.StatusInternalServerError, err.Error())
|
||||||
|
data["error"] = httpErr
|
||||||
|
if err := ctx.Render(500, "error", data); err != nil {
|
||||||
log.Fatal().Err(err).Send()
|
log.Fatal().Err(err).Send()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func dataInit(next Handler) Handler {
|
func dataInit(next Handler) Handler {
|
||||||
return func(ctx *context.Context) error {
|
return func(ctx *context.Context) error {
|
||||||
|
55
templates/pages/create.html
vendored
55
templates/pages/create.html
vendored
@ -10,64 +10,35 @@
|
|||||||
<main class="mt-4">
|
<main class="mt-4">
|
||||||
<form id="create" class="space-y-4" method="post" action="{{ $.c.ExternalUrl }}/">
|
<form id="create" class="space-y-4" method="post" action="{{ $.c.ExternalUrl }}/">
|
||||||
<div>
|
<div>
|
||||||
<p class="cursor-pointer select-none" id="gist-metadata-btn">Metadata ▼</p>
|
<p class="cursor-pointer select-none" id="gist-metadata-btn">Metadata {{ if .dto.HasMetadata }}▲{{ else }}▼{{ end }}</p>
|
||||||
<div class="grid grid-cols-12 gap-x-4 mt-1 hidden" id="gist-metadata">
|
<div class="grid grid-cols-12 gap-x-4 mt-1 {{ if not .dto.HasMetadata }}hidden{{ end }}" id="gist-metadata">
|
||||||
<div class="col-span-8 sm:col-span-4">
|
<div class="col-span-8 sm:col-span-4">
|
||||||
<div class="mt-1">
|
<div class="mt-1">
|
||||||
<input type="text" placeholder="{{ .locale.Tr "gist.new.title" }}" name="title" id="title" class="bg-white dark:bg-black shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md" maxlength="250">
|
<input type="text" placeholder="{{ .locale.Tr "gist.new.title" }}" value="{{ .dto.Title }}" name="title" id="title" class="bg-white dark:bg-black shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md" maxlength="250">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-span-12 sm:col-span-8">
|
<div class="col-span-12 sm:col-span-8">
|
||||||
<div class="mt-1">
|
<div class="mt-1">
|
||||||
<input type="text" placeholder="{{ .locale.Tr "gist.new.description" }}" name="description" id="description" class="bg-white dark:bg-black shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md" maxlength="1000">
|
<input type="text" placeholder="{{ .locale.Tr "gist.new.description" }}" value="{{ .dto.Description }}" name="description" id="description" class="bg-white dark:bg-black shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md" maxlength="1000">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-span-6 sm:col-span-3 mt-2">
|
<div class="col-span-6 sm:col-span-3 mt-2">
|
||||||
<input type="text" placeholder="{{ .locale.Tr "gist.new.url" }}" name="url" id="url" class="bg-white dark:bg-black shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md" maxlength="32">
|
<input type="text" placeholder="{{ .locale.Tr "gist.new.url" }}" value="{{ .dto.URL }}" name="url" id="url" class="bg-white dark:bg-black shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md" maxlength="32">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-span-12 sm:col-span-9 mt-2">
|
<div class="col-span-12 sm:col-span-9 mt-2">
|
||||||
<input type="text" placeholder="{{ .locale.Tr "gist.new.topics" }}" name="topics" id="topics" class="bg-white dark:bg-black shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md">
|
<input type="text" placeholder="{{ .locale.Tr "gist.new.topics" }}" value="{{ .dto.Topics }}" name="topics" id="topics" class="bg-white dark:bg-black shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="editors" class="space-y-4">
|
<div id="editors" class="space-y-4">
|
||||||
<div class="rounded-md border border-1 border-gray-200 dark:border-gray-700 editor">
|
{{ if .dto.Files }}
|
||||||
<div class="border-b-1 border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 my-auto flex">
|
{{ range .dto.Files }}
|
||||||
<p class="mx-2 my-2 inline-flex">
|
{{ template "_editor" dict "Filename" .Filename "Content" .Content "locale" $.locale }}
|
||||||
<input type="text" name="name" placeholder="{{ .locale.Tr "gist.new.filename-with-extension" }}" style="line-height: 0.05em" class="form-filename bg-white dark:bg-gray-900 shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md gist-title" autocomplete="off" data-lpignore data-bwignore data-1p-ignore>
|
{{ end }}
|
||||||
<button style="line-height: 0.05em" class="hidden delete-file -ml-px relative inline-flex items-center space-x-2 px-4 py-2 border border-gray-200 dark:border-gray-700 text-sm font-medium rounded-r-md text-slate-700 dark:text-slate-300 bg-gray-50 dark:bg-gray-800 hover:bg-white dark:hover:bg-gray-900 focus:outline-none" type="button">
|
{{ else }}
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
{{ template "_editor" . }}
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
|
{{ end }}
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
</p>
|
|
||||||
<button type="button" class="md-preview hidden whitespace-nowrap text-slate-700 dark:text-slate-300 rounded border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-900 my-2 px-2 text-xs font-medium shadow-sm hover:bg-gray-200 dark:hover:bg-gray-700 hover:border-gray-500 hover:text-slate-700 dark:hover:text-slate-300 focus:outline-none focus:ring-1 focus:border-primary-500 focus:ring-primary-500">{{ .locale.Tr "gist.new.preview" }}</button>
|
|
||||||
<div class="hidden mx-2 my-2 sm:inline-flex ml-auto space-x-2">
|
|
||||||
<select class="editor-indent-type whitespace-nowrap text-slate-700 dark:text-slate-300 rounded border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-900 pr-8 text-xs font-medium shadow-sm hover:bg-gray-200 dark:hover:bg-gray-700 hover:border-gray-500 hover:text-slate-700 dark:hover:text-slate-300 focus:outline-none focus:ring-1 focus:border-primary-500 focus:ring-primary-500">
|
|
||||||
<optgroup label="{{ .locale.Tr "gist.new.indent-mode" }}">
|
|
||||||
<option value="space">{{ .locale.Tr "gist.new.indent-mode-space" }}</option>
|
|
||||||
<option value="tab">{{ .locale.Tr "gist.new.indent-mode-tab" }}</option>
|
|
||||||
</optgroup>
|
|
||||||
</select>
|
|
||||||
<select class="editor-indent-size whitespace-nowrap text-slate-700 dark:text-slate-300 rounded border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-900 pr-8 text-xs font-medium shadow-sm hover:bg-gray-200 dark:hover:bg-gray-700 hover:border-gray-500 hover:text-slate-700 dark:hover:text-slate-300 focus:outline-none focus:ring-1 focus:border-primary-500 focus:ring-primary-500">
|
|
||||||
<optgroup label="{{ .locale.Tr "gist.new.indent-size" }}">
|
|
||||||
<option value="2">2</option>
|
|
||||||
<option value="4">4</option>
|
|
||||||
<option value="8">8</option>
|
|
||||||
</optgroup>
|
|
||||||
</select>
|
|
||||||
<select class="editor-wrap-mode whitespace-nowrap text-slate-700 dark:text-slate-300 rounded border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-900 pr-8 text-xs font-medium shadow-sm hover:bg-gray-200 dark:hover:bg-gray-700 hover:border-gray-500 hover:text-slate-700 dark:hover:text-slate-300 focus:outline-none focus:ring-1 focus:border-primary-500 focus:ring-primary-500">
|
|
||||||
<optgroup label="{{ .locale.Tr "gist.new.wrap-mode" }}">
|
|
||||||
<option value="no">{{ .locale.Tr "gist.new.wrap-mode-no" }}</option>
|
|
||||||
<option value="soft">{{ .locale.Tr "gist.new.wrap-mode-soft" }}</option>
|
|
||||||
</optgroup>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<input type="hidden" value="" name="content" class="form-filecontent" autocomplete="off">
|
|
||||||
<div class="hidden preview chroma markdown markdown-body p-8"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
|
55
templates/pages/edit.html
vendored
55
templates/pages/edit.html
vendored
@ -43,64 +43,33 @@
|
|||||||
<main class="mt-4">
|
<main class="mt-4">
|
||||||
<form id="create" class="space-y-4" method="post" action="{{ $.c.ExternalUrl }}/{{ .gist.User.Username }}/{{ .gist.Identifier }}/edit">
|
<form id="create" class="space-y-4" method="post" action="{{ $.c.ExternalUrl }}/{{ .gist.User.Username }}/{{ .gist.Identifier }}/edit">
|
||||||
<div>
|
<div>
|
||||||
<p class="cursor-pointer select-none" id="gist-metadata-btn">Metadata ▼</p>
|
<p class="cursor-pointer select-none" id="gist-metadata-btn">Metadata {{ if .dto.HasMetadata }}▲{{ else }}▼{{ end }}</p>
|
||||||
<div class="grid grid-cols-12 gap-x-4 mt-1 hidden" id="gist-metadata">
|
<div class="grid grid-cols-12 gap-x-4 mt-1 {{ if not .dto.HasMetadata }}hidden{{ end }}" id="gist-metadata">
|
||||||
<div class="col-span-8 sm:col-span-4">
|
<div class="col-span-8 sm:col-span-4">
|
||||||
<div class="mt-1">
|
<div class="mt-1">
|
||||||
<input type="text" value="{{ .gist.Title }}" placeholder="{{ .locale.Tr "gist.new.title" }}" name="title" id="title" class="bg-white dark:bg-black shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md" maxlength="250">
|
<input type="text" value="{{ .dto.Title }}" placeholder="{{ .locale.Tr "gist.new.title" }}" name="title" id="title" class="bg-white dark:bg-black shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md" maxlength="250">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-span-12 sm:col-span-8">
|
<div class="col-span-12 sm:col-span-8">
|
||||||
<div class="mt-1">
|
<div class="mt-1">
|
||||||
<input type="text" value="{{ .gist.Description }}" placeholder="{{ .locale.Tr "gist.new.description" }}" name="description" id="description" class="bg-white dark:bg-black shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md" maxlength="1000">
|
<input type="text" value="{{ .dto.Description }}" placeholder="{{ .locale.Tr "gist.new.description" }}" name="description" id="description" class="bg-white dark:bg-black shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md" maxlength="1000">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-span-6 sm:col-span-3 mt-2">
|
<div class="col-span-6 sm:col-span-3 mt-2">
|
||||||
<input type="text" value="{{ .gist.URL }}" placeholder="{{ .locale.Tr "gist.new.url" }}" name="url" id="url" class="bg-white dark:bg-black shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md" maxlength="32">
|
<input type="text" value="{{ .dto.URL }}" placeholder="{{ .locale.Tr "gist.new.url" }}" name="url" id="url" class="bg-white dark:bg-black shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md" maxlength="32">
|
||||||
</div>
|
</div>
|
||||||
<div class="col-span-12 sm:col-span-9 mt-2">
|
<div class="col-span-12 sm:col-span-9 mt-2">
|
||||||
<input type="text" value="{{ topicsToStr .gist.Topics }}" placeholder="{{ .locale.Tr "gist.new.topics" }}" name="topics" id="topics" class="bg-white dark:bg-black shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md">
|
<input type="text" value="{{ .dto.Topics }}" placeholder="{{ .locale.Tr "gist.new.topics" }}" name="topics" id="topics" class="bg-white dark:bg-black shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="editors" class="space-y-4">
|
<div id="editors" class="space-y-4">
|
||||||
{{ range $file := .files }}
|
{{ if .dto.Files }}
|
||||||
<div class="rounded-md border border-1 border-gray-200 dark:border-gray-700 editor">
|
{{ range .dto.Files }}
|
||||||
<div class="border-b-1 border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 my-auto flex">
|
{{ template "_editor" dict "Filename" .Filename "Content" .Content "locale" $.locale }}
|
||||||
<p class="mx-2 my-2 inline-flex">
|
{{ end }}
|
||||||
<input type="text" value="{{ $file.Filename }}" name="name" placeholder="{{ $.locale.Tr "gist.new.filename-with-extension" }}" style="line-height: 0.05em; z-index: 99999" class="form-filename bg-white dark:bg-gray-900 shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 {{ if eq (len $.files) 1 }}rounded-md{{ else }}rounded-l-md{{ end }} gist-title" autocomplete="off" data-lpignore data-bwignore data-1p-ignore>
|
{{ else }}
|
||||||
<button style="line-height: 0.05em" class="{{ if eq (len $.files) 1 }}hidden{{ end }} delete-file -ml-px relative inline-flex items-center space-x-2 px-4 py-2 border border-gray-200 dark:border-gray-700 text-sm font-medium rounded-r-md text-slate-700 dark:text-slate-300 bg-gray-50 dark:bg-gray-800 hover:bg-white dark:hover:bg-gray-900 focus:outline-none" type="button">
|
{{ template "_editor" . }}
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
</p>
|
|
||||||
<button type="button" class="md-preview hidden whitespace-nowrap text-slate-700 dark:text-slate-300 rounded border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-900 my-2 px-2 text-xs font-medium shadow-sm hover:bg-gray-200 dark:hover:bg-gray-700 hover:border-gray-500 hover:text-slate-700 dark:hover:text-slate-300 focus:outline-none focus:ring-1 focus:border-primary-500 focus:ring-primary-500">{{ $.locale.Tr "gist.new.preview" }}</button>
|
|
||||||
<div class="hidden mx-2 my-2 sm:inline-flex ml-auto space-x-2">
|
|
||||||
<select class="editor-indent-type whitespace-nowrap text-slate-700 dark:text-slate-300 rounded border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-900 pr-8 text-xs font-medium shadow-sm hover:bg-gray-200 dark:hover:bg-gray-700 hover:border-gray-500 hover:text-slate-700 dark:hover:text-slate-300 focus:outline-none focus:ring-1 focus:border-primary-500 focus:ring-primary-500">
|
|
||||||
<optgroup label="{{ $.locale.Tr "gist.new.indent-mode" }}">
|
|
||||||
<option value="space">{{ $.locale.Tr "gist.new.indent-mode-space" }}</option>
|
|
||||||
<option value="tab">{{ $.locale.Tr "gist.new.indent-mode-tab" }}</option>
|
|
||||||
</optgroup>
|
|
||||||
</select>
|
|
||||||
<select class="editor-indent-size whitespace-nowrap text-slate-700 dark:text-slate-300 rounded border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-900 pr-8 text-xs font-medium shadow-sm hover:bg-gray-200 dark:hover:bg-gray-700 hover:border-gray-500 hover:text-slate-700 dark:hover:text-slate-300 focus:outline-none focus:ring-1 focus:border-primary-500 focus:ring-primary-500">
|
|
||||||
<optgroup label="{{ $.locale.Tr "gist.new.indent-size" }}">
|
|
||||||
<option value="2">2</option>
|
|
||||||
<option value="4">4</option>
|
|
||||||
<option value="8">8</option>
|
|
||||||
</optgroup>
|
|
||||||
</select>
|
|
||||||
<select class="editor-wrap-mode whitespace-nowrap text-slate-700 dark:text-slate-300 rounded border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-900 pr-8 text-xs font-medium shadow-sm hover:bg-gray-200 dark:hover:bg-gray-700 hover:border-gray-500 hover:text-slate-700 dark:hover:text-slate-300 focus:outline-none focus:ring-1 focus:border-primary-500 focus:ring-primary-500">
|
|
||||||
<optgroup label="{{ $.locale.Tr "gist.new.wrap-mode" }}">
|
|
||||||
<option value="no">{{ $.locale.Tr "gist.new.wrap-mode-no" }}</option>
|
|
||||||
<option value="soft">{{ $.locale.Tr "gist.new.wrap-mode-soft" }}</option>
|
|
||||||
</optgroup>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<input type="hidden" value="{{ $file.Content }}" name="content" class="form-filecontent" autocomplete="off">
|
|
||||||
<div class="hidden preview chroma markdown markdown-body p-8"></div>
|
|
||||||
</div>
|
|
||||||
{{ end }}
|
{{ end }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
38
templates/partials/_editor.html
vendored
Normal file
38
templates/partials/_editor.html
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
{{ define "_editor" }}
|
||||||
|
<div class="rounded-md border border-1 border-gray-200 dark:border-gray-700 editor">
|
||||||
|
<div class="border-b-1 border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 my-auto flex">
|
||||||
|
<p class="mx-2 my-2 inline-flex">
|
||||||
|
<input type="text" name="name" value="{{ .Filename }}" placeholder="{{ $.locale.Tr "gist.new.filename-with-extension" }}" style="line-height: 0.05em" class="form-filename bg-white dark:bg-gray-900 shadow-sm focus:ring-primary-500 focus:border-primary-500 block w-full sm:text-sm border-gray-200 dark:border-gray-700 rounded-md gist-title" autocomplete="off" data-lpignore data-bwignore data-1p-ignore>
|
||||||
|
<button style="line-height: 0.05em" class="hidden delete-file -ml-px relative inline-flex items-center space-x-2 px-4 py-2 border border-gray-200 dark:border-gray-700 text-sm font-medium rounded-r-md text-slate-700 dark:text-slate-300 bg-gray-50 dark:bg-gray-800 hover:bg-white dark:hover:bg-gray-900 focus:outline-none" type="button">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</p>
|
||||||
|
<button type="button" class="md-preview hidden whitespace-nowrap text-slate-700 dark:text-slate-300 rounded border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-900 my-2 px-2 text-xs font-medium shadow-sm hover:bg-gray-200 dark:hover:bg-gray-700 hover:border-gray-500 hover:text-slate-700 dark:hover:text-slate-300 focus:outline-none focus:ring-1 focus:border-primary-500 focus:ring-primary-500">{{ $.locale.Tr "gist.new.preview" }}</button>
|
||||||
|
<div class="hidden mx-2 my-2 sm:inline-flex ml-auto space-x-2">
|
||||||
|
<select class="editor-indent-type whitespace-nowrap text-slate-700 dark:text-slate-300 rounded border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-900 pr-8 text-xs font-medium shadow-sm hover:bg-gray-200 dark:hover:bg-gray-700 hover:border-gray-500 hover:text-slate-700 dark:hover:text-slate-300 focus:outline-none focus:ring-1 focus:border-primary-500 focus:ring-primary-500">
|
||||||
|
<optgroup label="{{ $.locale.Tr "gist.new.indent-mode" }}">
|
||||||
|
<option value="space">{{ $.locale.Tr "gist.new.indent-mode-space" }}</option>
|
||||||
|
<option value="tab">{{ $.locale.Tr "gist.new.indent-mode-tab" }}</option>
|
||||||
|
</optgroup>
|
||||||
|
</select>
|
||||||
|
<select class="editor-indent-size whitespace-nowrap text-slate-700 dark:text-slate-300 rounded border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-900 pr-8 text-xs font-medium shadow-sm hover:bg-gray-200 dark:hover:bg-gray-700 hover:border-gray-500 hover:text-slate-700 dark:hover:text-slate-300 focus:outline-none focus:ring-1 focus:border-primary-500 focus:ring-primary-500">
|
||||||
|
<optgroup label="{{ $.locale.Tr "gist.new.indent-size" }}">
|
||||||
|
<option value="2">2</option>
|
||||||
|
<option value="4">4</option>
|
||||||
|
<option value="8">8</option>
|
||||||
|
</optgroup>
|
||||||
|
</select>
|
||||||
|
<select class="editor-wrap-mode whitespace-nowrap text-slate-700 dark:text-slate-300 rounded border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-900 pr-8 text-xs font-medium shadow-sm hover:bg-gray-200 dark:hover:bg-gray-700 hover:border-gray-500 hover:text-slate-700 dark:hover:text-slate-300 focus:outline-none focus:ring-1 focus:border-primary-500 focus:ring-primary-500">
|
||||||
|
<optgroup label="{{ $.locale.Tr "gist.new.wrap-mode" }}">
|
||||||
|
<option value="no">{{ $.locale.Tr "gist.new.wrap-mode-no" }}</option>
|
||||||
|
<option value="soft">{{ $.locale.Tr "gist.new.wrap-mode-soft" }}</option>
|
||||||
|
</optgroup>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<input type="hidden" value="{{ .Content }}" name="content" class="form-filecontent" autocomplete="off">
|
||||||
|
<div class="hidden preview chroma markdown markdown-body p-8"></div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
Reference in New Issue
Block a user