2.0.0#255
Open
volarname wants to merge 54 commits into
Open
Conversation
Added: - Internal image flag support for asset licences (DamAssetLicenceExtended type, internalRule config, override/internal flag switches in asset metadata) - Two new job types: jobAssetFileReprocessInternalFlag and jobSynchronizeImageChanged with full create/detail UI
Co-authored-by: Tomas Hermanek <tomas.hermanek@petitpress.sk>
added `mainFileOverrideInternal` and `mainFileInternal` boolean fields in `AssetMetadataBulkItem` for asset metadata updates
… eslint, watch-common-admin, browserslist:update
…rWrapper to layouts/
Reorganize src/ into src/domains/<system>/<entity>/{api,components,
composables,factory,filter,store,types,valueObject} per entity. Three
top-level systems: system/ (auth, app shell, system views), common/
(anzuUser, log, permission, permissionConfig, permissionGroup),
coreDam/ (17 DAM entities + shared/ slot for cross-entity DAM code:
anzutap, ColorBox, FileUpload, customMetadata, ABtnAdvanced,
CachedDamUserChip, FilterClosestColor, distribution helpers,
assetFileRoute, upload service).
Cross-system generics moved to src/shared/ (apiClients/, types/,
utils/, EnvConfigService.ts, ErrorHandlerApiService.ts,
BetaTestFeaturesService.ts, systems.ts, configurationApi.ts).
Old top-level folders src/{components,composables,services,stores,
types,model,views,utils}/ deleted entirely. Every move via git mv so
git log --follow traces full history. layouts/, pages/, plugins/,
styles/, locales/, router/ stay at root.
system/auth/Auth.ts -> simpleLogin.ts (Linux case-sensitive collision
with sibling auth.ts composable rejected by TS forceConsistentCasing
InFileNames). Affects only the import path; SimpleLoginForm export
unchanged.
views/coreDam/externalProviderAsset/ consolidated into
domains/coreDam/externalProvider/components/.
eslint.config.mjs: anzu/no-deprecated-imports toggled warn -> off to
keep CI signal clean during restructure; re-enable in dedicated
cleanup PR.
common-admin chunk dropped from 1,113 kB to 4 parts (all <500 kB): - common-admin (main, 415 kB) - common-admin-internals (index-*.mjs, 461 kB) - common-admin-autocomplete (AFormRemoteAutocomplete async chunk, 176 kB) - common-admin-labs (labs.js, only loaded when used) vue-i18n + @intlify/* pulled out of vue-core (49 kB own chunk). New vendor-utils chunk (115 kB) for axios, @vuelidate, @floating-ui, jwt-decode, universal-cookie, uuid, rusha, sortablejs. No more "chunks larger than 500 kB" Rollup warning.
- vite.config.ts: resolve.dedupe: ['vuetify'] — prevents subtle double-bundling if any transitive dep pulls in its own vuetify copy - package.json: add dotenv ^17.4.2 devDep for future env-loading scripts yarn.lock reshuffled by yarn install.
- api: apiFetch*/apiFetchByIds/apiFetchOne... → useApiFetchList/useApiFetchByIds/useApiRequest factories - filters: makeFilterHelper → createFilter/createFilterStore/MakeFilterOption (/labs); preserve apiName + elastic setup - datatables: usePagination ref + provide(DatatablePaginationKey) + useFilterHelpers(filterData, filterConfig) - asset & external-provider filter sidebars rebuilt on AFilterWrapperSidebar (develop layout parity) - createdAt ranges → AFilterTimeInterval; add timeInterval helper - re-enable anzu/no-deprecated-imports: 'error' (no skipFiles)
Renamed filter fields produced titleT keys with no translation (raw key shown). Match develop:
- ExternalProviderAssetFilter: term titleT → coreDam.asset.filter.text ("Text")
- LogFilter: resourceId titleT → common.log.filter.resourceIds ("ID entity")
- AssetLicenceFilter: extSystem titleT → coreDam.extSystem.filter.extSystem ("Externý systém")
- DistributionCategorySelectFilter: serviceSlug titleT → coreDam.distributionCategorySelect.filter.name ("Meno"); unhide type ("Typ assetu")
feat #84735 synthetic audio (TTS) admin UI
Added:
- VoiceFamily module: list/detail/edit views, datatable, filter, remote
autocomplete, cached chip, and per-family Voice bindings with
ElevenLabs / Google TTS discriminated forms (create/update routed to
per-provider endpoints)
- TtsNarrationRequest module: list/detail views, synthesize dialog
(text 10-50k chars, voice family, podcasts, licence), cancel dialog,
chunk progress display, status/mode chips
- Asset integration: ttsAudio metadata flag (switch, list filter,
meta-icon) and ACL-gated TTS tab in asset detail sidebar
- ExtSystem TTS settings form: active provider mode, default voice
family, auto keyword, free-audio epilog asset select
- 10 new DAM_TTS_* ACL permissions, routes, breadcrumbs and full
sk/en locales for all new modules
Changed:
- PublicExport: single assetLicence replaced by multi-licence
(licences[] with minLength validation) to match the BE join-table
redesign shipped with this task
- PodcastRemoteAutocomplete: defineModel + optional extSystemId
scoping (used by the synthesize dialog)
- extSystem/assetLicence stores: dropped pass-through setters in
favor of direct ref assignment
- Job create/detail forms: minValue(1) on targetLicenceId,
dateTimePretty date display
- Dependency bumps (axios, uuid, postcss, vite)
bind public export create to licences array
Integrate main's 6 new commits into the domain-driven /labs structure (restructure + @anzusystems/common-admin/labs migration + file-based routing): - New modules voiceFamily & ttsNarrationRequest relocated into src/domains/coreDam, migrated off the deprecated barrel to /labs, wired via file-based src/pages routes (manual ROUTE enum / routes.ts dropped) - Resolve 33 conflicts across asset, assetLicence, extSystem, job, podcast, publicExport, asset/user filters and the router - Features: mainFileInternal + ttsAudio asset filters (#253); publicExport licences[] (#256); podcast extSystemId-scoped select; extSystem TTS settings; internal-image/synchronize-image job kinds; asset-detail TTS panel - Fix sidebar nav to file-based route names; cancel request POSTs an explicit {} body to match main (Symfony reads the request body) Gates green: vue-tsc, eslint (anzu/no-deprecated-imports), oxlint, stylelint, build.
The :model-value cast used a TS union inside the template binding. It only passed eslint because of wrapping parens — but oxfmt strips those "redundant" parens, after which vue-eslint-parser reads `string | string[]` as a deprecated Vue filter (vue/no-deprecated-filter). Move the union into a script-side type alias so no `|` appears in the template; oxfmt and eslint are now both stable.
Replace the deprecated ASortable with the /labs list editors, matching admin-cms: - podcast PodcastEditForm: ASortable -> ASortableListEditor (item-factory using nextListEditorTempId for stable row keys, manage-delete, update-position); editing stays in the existing dialog via @edit/@added - asset DistributionManage: ASortable (disable-dragable) -> AListEditor; delete stays API-backed via :on-delete; editing via the existing dialog No ASortable usages remain in admin-dam.
…mputed Replace the one-off type alias (added to keep the TS union out of the template binding, where oxfmt strips the parens and vue-eslint-parser then misreads `|` as a deprecated Vue filter) with a computed that does the same narrowing in script. Cleaner and self-explanatory; template binding stays `|`-free so oxfmt and eslint are both stable.
…in-cms parity) These are auto-generated by the vite plugins (unplugin-vue-router / unplugin-auto-import) and regenerated by `generate:dts`, which runs first in `yarn ci`. Tracking them just produces churn (e.g. ~900-line typed-router diffs) on every regeneration. admin-cms already gitignores both; match that.
Routine version bumps (already present in the working tree): @anzusystems/common-admin dev build, @tiptap/* 3.27, axios 1.18, vue 3.5.38, vuetify 4.1.2, @sentry/vue, vue-i18n; dev tooling oxfmt 0.55, oxlint 1.70, eslint 10.5, vite, vue-tsc, cypress, @types/node. yarn.lock regenerated to match.
3b3c9a9 to
89f5aed
Compare
a8da3a0 migrated to props that don't exist in the labs v2 API (item-factory/manage-delete/update-position/@added/@add). Vue treats unknown props/events as silent fall-through, so it type-checked but the Add actions in podcast export-data and asset distributions were dead at runtime, and none of the consumer recipe was applied. - podcast: drop dead props, restore add via external button + dialog (cancel removes the new row), sort exportData by position at ingress, renumber + adopt response + commit() to re-baseline on save, gate form on !detailLoading - asset distributions: hide built-in add, add external button opening the type-select dialog - distributionCategorySelect: migrate off raw useSortable to inline ASortableListEditor; validateAll() save gate, position sort at ingress, renumber + temp-id strip (id stays '' for new in the payload) + response adopt + commit() on save yarn ci green.
New export-data rows carry a negative temp id for the list-editor key, but core-dam's deserializer treats a non-zero unknown id as a reference to an existing entity (Doctrine then fails with a cascade-persist error on Podcast#exportData). Map negative temp ids to 0 in the save payload so the backend creates them, matching the pre-migration convention and the DistributionCategoryOption handling. Verified end-to-end: add export-data -> save -> 200.
Author ids are UUIDs (DocId), so sorting by id produced an arbitrary order. Both the author list (useAuthorListActions) and the author select autocomplete (useAuthorSelectActions) hard-set pagination.sortBy to 'id' on non-text fetches; default them to createdAt so the newest authors show first, while keeping relevance ordering for fulltext search.
…ted-at fix(author): order author list by createdAt instead of id
Route pluralization in #85491 left many singular cy.visit/urlContains targets that now 404 (no redirect layer). Update asset, podcast, video-show, user, public-export and distribution-category-select detail paths plus nav hrefs to the plural routes. API URLs are left unchanged.
The "Najkratšia dimenzia" (shortestDimensionFrom/Until) filter was sent to the search API but core-dam's AssetQueryFactory never applies it (no ES clause, field not indexed), so it silently did nothing. Remove the dead field from the asset list filter config, form and locales.
Conflict in author/composables/authorActions.ts (moved to src/domains on this branch): kept the new labs-API version. Preserved main's PR #257 intent (order author lists by createdAt): AuthorDatatable.vue now usePagination('createdAt') instead of SORT_BY_ID. Author select autocomplete sort stays on common-admin default (pagination built there, not controllable from admin-dam).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.