Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
bd8ea14
feat(ui): implement new Key/Value editor - WF-233
madeindjs Apr 2, 2025
86faec7
fix(ui): use `BuilderTemplateInput` for autocomplete - WF-223
madeindjs Apr 4, 2025
431f467
feat(ui): use floating UI for autocomplete - WF-233
madeindjs Apr 29, 2025
8b18363
fix(ui): cleanup dead code - WF-223
madeindjs Apr 29, 2025
64838b9
fix(ui): adapt E2E to new key-value editor - WF-233
madeindjs Apr 30, 2025
157db34
feat(ui): disable KV editor switch when JSON is not valid - WF-233
madeindjs Apr 30, 2025
e0a3205
fix: remove validator schema for `WriterUploadFile`
mmikita95 May 1, 2025
af7aeac
Merge pull request #852 from mmikita95/fix-files-block-validator
mmikita95 May 1, 2025
13d8bd1
feat(ui): remove K/V editor freehand button - WF-233
madeindjs May 2, 2025
bcc1845
Merge pull request #808 from madeindjs/WF-233
madeindjs May 2, 2025
439a2aa
fix(ui): autocomplete with closing `}` - WF-372
madeindjs May 2, 2025
b9017da
Merge pull request #853 from writer/WF-372
madeindjs May 2, 2025
13a51b5
fix(ui): prevent CORS issue on Dataframe data loading - WF-383
madeindjs May 2, 2025
2938890
feat(ui): implement component selection shortcurts - WF-326
madeindjs Apr 10, 2025
c91d5ff
feat(ui): implement lateral component positon move - WF-326
madeindjs Apr 10, 2025
479eb07
Merge pull request #855 from writer/WF-383
madeindjs May 2, 2025
3093e77
Merge pull request #821 from writer/WF-326
madeindjs May 2, 2025
e8bca3e
remove ui.json support
UladzislauK-Writer May 5, 2025
67c03d7
save file hashes in memory
UladzislauK-Writer May 5, 2025
117920a
Merge pull request #851 from UladzislauK-Writer/vlad/file-hash
ramedina86 May 5, 2025
362168b
fix(writer): handle file operation on S3 - WF-386
madeindjs May 6, 2025
76da3f0
chore: increase timeout for `HTTPRequest` block
mmikita95 May 7, 2025
1b96184
Merge pull request #859 from mmikita95/chore-increase-httpx-timeout
mmikita95 May 7, 2025
f475e3a
Merge pull request #857 from writer/WF-386
ramedina86 May 7, 2025
b1e3c7e
chore: Version bump
ramedina86 May 7, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions alfred/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,6 @@ def apps_update(app: str = None):
if not os.path.isdir(abs_path):
continue

if os.path.isfile(os.path.join(abs_path, "ui.json")):
print(f'{app} : migrate ui.json')
wf_project.migrate_obsolete_ui_json(abs_path, {"writer_version": VERSION})

if not os.path.isfile(os.path.join(abs_path, ".wf", 'components-workflows_root.jsonl')):
wf_project.create_default_workflows_root(abs_path)

Expand All @@ -51,5 +47,5 @@ def apps_update(app: str = None):
else:
metadata['writer_version'] = writer.VERSION
components = audit_and_fix.fix_components(components)
wf_project.write_files(abs_path, metadata, components)
wf_project.write_files(abs_path, metadata, components, context=wf_project.WfProjectContext(app_path=abs_path))
print(f"{app} : app is up to date")
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"

[tool.poetry]
name = "writer"
version = "0.8.3rc18"
version = "0.8.3rc19"
description = "An open-source, Python framework for building feature-rich apps that are fully integrated with the Writer platform."
authors = ["Writer, Inc."]
readme = "README.md"
Expand Down
97 changes: 65 additions & 32 deletions src/ui/src/builder/BuilderApp.vue
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ const wf = inject(injectionKeys.core);
const ssbm = inject(injectionKeys.builderManager);

const tracking = useWriterTracking(wf);
const toasts = useToasts();

const {
candidateId,
Expand All @@ -146,14 +147,20 @@ const {
isCutAllowed,
isDeleteAllowed,
isGoToParentAllowed,
isGoToChildAllowed,
isGoToNextSiblingAllowed,
isGoToPrevSiblingAllowed,
pasteComponent,
copyComponent,
removeComponentsSubtree,
goToParent,
goToChild,
goToNextSibling,
goToPrevSibling,
moveComponentToParent,
moveComponentInsideNextSibling,
} = useComponentActions(wf, ssbm, tracking);

const toasts = useToasts();

const builderMode = computed(() => ssbm.getMode());
const selectedId = computed(() => ssbm.firstSelectedId.value);

Expand Down Expand Up @@ -192,37 +199,63 @@ async function handleKeydown(ev: KeyboardEvent) {
removeComponentsSubtree(...componentIds);
return;
}
if (ev.key == "ArrowUp" && isModifierKeyActive && ev.shiftKey) {
if (!isGoToParentAllowed(selectedId)) return;
goToParent(selectedId, selectedInstancePath);
return;
}
if (ev.key == "ArrowUp" && isModifierKeyActive) {
moveComponentUp(selectedId);
return;
}
if (ev.key == "ArrowDown" && isModifierKeyActive) {
moveComponentDown(selectedId);
return;
}
if (ev.key == "v" && isModifierKeyActive) {
if (!isPasteAllowed(selectedId)) return;
try {
await pasteComponent(selectedId);
} catch (error) {
toasts.pushToast({ type: "error", message: String(error) });
if (!isModifierKeyActive) return;

if (ev.shiftKey) {
switch (ev.key) {
case "ArrowDown":
ev.preventDefault();
if (isGoToNextSiblingAllowed(selectedId))
goToNextSibling(selectedId);
break;
case "ArrowUp":
ev.preventDefault();
if (isGoToPrevSiblingAllowed(selectedId))
goToPrevSibling(selectedId);
break;
case "ArrowLeft":
ev.preventDefault();
if (isGoToParentAllowed(selectedId))
goToParent(selectedId, selectedInstancePath);
break;
case "ArrowRight":
ev.preventDefault();
if (isGoToChildAllowed(selectedId)) goToChild(selectedId);
break;
}
} else {
switch (ev.key) {
case "ArrowDown":
ev.preventDefault();
moveComponentDown(selectedId);
break;
case "ArrowUp":
ev.preventDefault();
moveComponentUp(selectedId);
break;
case "ArrowLeft":
ev.preventDefault();
moveComponentToParent(selectedId);
break;
case "ArrowRight":
ev.preventDefault();
moveComponentInsideNextSibling(selectedId);
break;
case "v":
if (!isPasteAllowed(selectedId)) return;
try {
await pasteComponent(selectedId);
} catch (error) {
toasts.pushToast({ type: "error", message: String(error) });
}
break;
case "c":
if (isCopyAllowed(selectedId)) copyComponent(selectedId);
break;
case "x":
if (isCutAllowed(selectedId)) cutComponent(selectedId);
break;
}
return;
}
if (ev.key == "c" && isModifierKeyActive) {
if (!isCopyAllowed(selectedId)) return;
copyComponent(selectedId);
return;
}
if (ev.key == "x" && isModifierKeyActive) {
if (!isCutAllowed(selectedId)) return;
cutComponent(selectedId);
return;
}
}

Expand Down
Loading