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(`
{{{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 {