diff --git a/assets/js/controllers/edit_upload.js b/assets/js/controllers/edit_upload.js index 65b0234..929b905 100644 --- a/assets/js/controllers/edit_upload.js +++ b/assets/js/controllers/edit_upload.js @@ -5,7 +5,10 @@ const processorFrame = Handlebars.compile(`
{{name}} - X + X
{{{props}}} @@ -13,14 +16,12 @@ const processorFrame = Handlebars.compile(`
`); -const processors = [ - { - name: "shadow", +const processorUIs = { + "shadow": { label: "Shadow", template: Handlebars.compile(`This processor has no properties.`), }, - { - name: "resize", + "resize": { label: "Resize", template: Handlebars.compile(`
@@ -32,8 +33,8 @@ const processors = [
`), - } -]; + }, +}; export default class UploadEditController extends Controller { static targets = ['processList', 'preview']; @@ -54,19 +55,33 @@ export default class UploadEditController extends Controller { }); } + async removeProcessor(ev) { + ev.preventDefault(); + let id = ev.params.id; + console.log(ev.params); + await this._removeProcessor(id); + } + _rebuildProcessList() { let el = this.processListTarget; - // TEMP - let cardTemplate = processors[0].template({ - "id": "shadow", - }); - let cardOuter = processorFrame({ - name: processors[0].label, - props: cardTemplate, - }); - el.innerHTML = cardOuter; - // END TEMP + if ((!this._state) || (!this._state.session) || (!this._state.session.processors)) { + return; + } + + el.innerHTML = ""; + for (let p of this._state.session.processors) { + let ui = processorUIs[p.type]; + if (!ui) { + continue; + } + let cardOuter = processorFrame({ + id: p.id, + name: ui.label, + props: ui.template(p), + }); + el.innerHTML += cardOuter; + } } async _createSession() { @@ -83,9 +98,9 @@ export default class UploadEditController extends Controller { }); this._state = await resp.json(); - this.previewTarget.src = this._state.preview_url; - console.log("Session created"); + this._rebuildProcessList(); + this.previewTarget.src = this._state.preview_url; } catch (e) { console.error(e); } @@ -103,9 +118,31 @@ export default class UploadEditController extends Controller { }); this._state = await resp.json(); + + this._rebuildProcessList(); this.previewTarget.src = this._state.preview_url; } catch (e) { console.error(e); } } + + async _removeProcessor(processorID) { + await this._doReturningState(async () => { + return (await fetch(`/sites/${this.siteIdValue}/imageedit/${this._state.session.guid}/processors/${processorID}`, { + method: 'DELETE', + })).json(); + }) + } + + async _doReturningState(fn) { + try { + this._state = await fn(); + + this._rebuildProcessList(); + this.previewTarget.src = this._state.preview_url; + } catch (e) { + console.error(e); + } + + } } \ No newline at end of file diff --git a/cmds/server.go b/cmds/server.go index d776cf3..515f7a5 100644 --- a/cmds/server.go +++ b/cmds/server.go @@ -154,6 +154,7 @@ Starting weiro without any arguments will start the server. siteGroup.Post("/imageedit", ieh.Create) siteGroup.Post("/imageedit/:sessionID/processors", ieh.AddProcessor) + siteGroup.Delete("/imageedit/:sessionID/processors/:processorID", ieh.DeleteProcessor) siteGroup.Get("/imageedit/:sessionID/preview/:versionID", ieh.Preview) siteGroup.Get("/settings", ssh.General) diff --git a/handlers/imageedit.go b/handlers/imageedit.go index 1ca9817..8026c53 100644 --- a/handlers/imageedit.go +++ b/handlers/imageedit.go @@ -91,3 +91,25 @@ func (ieh ImageEditHandlers) AddProcessor(c fiber.Ctx) error { PreviewURL: res.PreviewURL(), }) } + +func (ieh ImageEditHandlers) DeleteProcessor(c fiber.Ctx) error { + sessionID := c.Params("sessionID") + if sessionID == "" { + return fiber.ErrBadRequest + } + + processorID := c.Params("processorID") + if processorID == "" { + return fiber.ErrBadRequest + } + + res, err := ieh.ImageEditService.DeleteProcessor(c.Context(), sessionID, processorID) + if err != nil { + return err + } + + return c.Status(http.StatusOK).JSON(sessionResponse{ + Session: res, + PreviewURL: res.PreviewURL(), + }) +} diff --git a/services/imgedit/processing.go b/services/imgedit/processing.go index 107bcb3..68f8b9d 100644 --- a/services/imgedit/processing.go +++ b/services/imgedit/processing.go @@ -6,6 +6,7 @@ import ( "fmt" "image" "image/color" + "log" "os" "path/filepath" @@ -46,6 +47,8 @@ func (s *Service) reprocess(ctx context.Context, session *models.ImageEditSessio img = imageImageSource{resImg} } + log.Printf("result of processed image: %T", img) + return img, nil } diff --git a/services/imgedit/service.go b/services/imgedit/service.go index fa6b795..97603a8 100644 --- a/services/imgedit/service.go +++ b/services/imgedit/service.go @@ -8,6 +8,7 @@ import ( "lmika.dev/lmika/weiro/models" "lmika.dev/lmika/weiro/services/uploads" + "lmika.dev/pkg/modash/moslice" ) type Service struct { @@ -114,6 +115,25 @@ func (s *Service) AddProcessor(ctx context.Context, sessionID string, req AddPro return session, nil } +func (s *Service) DeleteProcessor(ctx context.Context, sessionID, processorID string) (*models.ImageEditSession, error) { + session, err := s.loadAndVerifySession(ctx, sessionID) + if err != nil { + return nil, err + } + + session.Processors = moslice.Filter(session.Processors, func(p models.ImageEditProcessor) bool { return p.ID != processorID }) + session.RecalcVersionIDs() + if err := s.sessionStore.save(session); err != nil { + return nil, err + } + + if _, err := s.reprocess(ctx, session); err != nil { + return nil, err + } + + return session, nil +} + func (s *Service) loadAndVerifySession(ctx context.Context, sessionID string) (*models.ImageEditSession, error) { site, user, err := s.fetchSiteAndUser(ctx) if err != nil {