feat(sprint18): editor autosave/reset, admin auth, QR reuse, Ed25519 prep
Some checks failed
Architecture Governance / architecture (push) Has been cancelled
Some checks failed
Architecture Governance / architecture (push) Has been cancelled
- Project editor: persist draft to localStorage, restore on reload, last-saved/draft-restored status indicators, section/whole-draft reset with confirmation. - Extract shared QR/polling/expiry engine from TelegramLoginComponent (shared/qr-login) and reuse it for a new admin login flow. - Admin authentication kept fully separate from customer session: own cookie/localStorage keys, signals, guard, and header interceptor (core/admin-auth). - ?login=true / ?adminLogin=true open the respective login dialog for manual testing. - Ed25519 challenge/verify interfaces (fail-closed no-op binding) ready for backend delivery. - Document autosave/reset/admin-auth/QR-reuse/Ed25519 model and the remaining full-field-coverage gap in docs/Project-Editor.md.
This commit is contained in:
@@ -522,6 +522,13 @@ export const en: Translations = {
|
||||
promptImageUrl: 'Image URL',
|
||||
htmlEditorCode: 'Code',
|
||||
htmlEditorPreview: 'Preview',
|
||||
lastSaved: 'Last saved',
|
||||
draftRestored: 'A local draft was restored from your last session.',
|
||||
dismiss: 'Dismiss',
|
||||
resetDraft: 'Reset draft',
|
||||
resetSection: 'Reset section',
|
||||
confirmResetDraft: 'This discards all unpublished changes and restores the last published configuration. Continue?',
|
||||
confirmResetSection: 'This discards unpublished changes in this section only. Continue?',
|
||||
},
|
||||
staticPages: {
|
||||
notFound: 'Page not found',
|
||||
@@ -555,6 +562,16 @@ export const en: Translations = {
|
||||
qrExpired: 'QR code expired. Click to refresh',
|
||||
qrError: 'Could not create login session. Click to retry',
|
||||
},
|
||||
adminAuth: {
|
||||
loginRequired: 'Admin login required',
|
||||
loginDescription: 'Log in with your admin account to continue. This is a separate session from the storefront login.',
|
||||
checking: 'Checking...',
|
||||
loginWithApp: 'Log in with app',
|
||||
orScanQr: 'Or scan the QR code',
|
||||
loginNote: 'You will be redirected back after login',
|
||||
qrExpired: 'QR code expired. Click to refresh',
|
||||
qrError: 'Could not create login session. Click to retry',
|
||||
},
|
||||
ux: {
|
||||
items: 'items',
|
||||
wishlistTitle: 'Wishlist',
|
||||
|
||||
@@ -522,6 +522,13 @@ export const hy: Translations = {
|
||||
promptImageUrl: 'Նկարի URL',
|
||||
htmlEditorCode: 'Կոդ',
|
||||
htmlEditorPreview: 'Նախադիտում',
|
||||
lastSaved: 'Վերջին պահպանումը',
|
||||
draftRestored: 'Տեղական սևագիրը վերականգնվել է նախորդ սեսիայից։',
|
||||
dismiss: 'Փակել',
|
||||
resetDraft: 'Զրոյացնել սևագիրը',
|
||||
resetSection: 'Զրոյացնել սեկցիան',
|
||||
confirmResetDraft: 'Սա կչեղարկի բոլոր չհրապարակված փոփոխությունները և կվերականգնի վերջին հրապարակված կոնֆիգուրացիան։ Շարունակե՞լ։',
|
||||
confirmResetSection: 'Սա կչեղարկի չհրապարակված փոփոխությունները միայն այս սեկցիայում։ Շարունակե՞լ։',
|
||||
},
|
||||
staticPages: {
|
||||
notFound: 'Էջը չի գտնվել',
|
||||
@@ -555,6 +562,16 @@ export const hy: Translations = {
|
||||
qrExpired: 'QR կոդը հնացել է։ Սեղմեք՝ թարմացնելու համար',
|
||||
qrError: 'Չհաջողվեց ստեղծել մուտքի սեսիա։ Սեղմեք՝ կրկնելու համար',
|
||||
},
|
||||
adminAuth: {
|
||||
loginRequired: 'Անհրաժեշտ է ադմինի մուտք',
|
||||
loginDescription: 'Մուտք գործեք ադմինի հաշվով։ Սա առանձին սեսիա է՝ խանութի մուտքից անկախ։',
|
||||
checking: 'Ստուգում...',
|
||||
loginWithApp: 'Մուտք հավելվածով',
|
||||
orScanQr: 'Կամ սքանավորեք QR կոդը',
|
||||
loginNote: 'Մուտքից հետո դուք կվերաուղղվեք',
|
||||
qrExpired: 'QR կոդը հնացել է։ Սեղմեք՝ թարմացնելու համար',
|
||||
qrError: 'Չհաջողվեց ստեղծել մուտքի սեսիա։ Սեղմեք՝ կրկնելու համար',
|
||||
},
|
||||
ux: {
|
||||
items: 'ապրանք',
|
||||
wishlistTitle: 'Ընտրյալներ',
|
||||
|
||||
@@ -522,6 +522,13 @@ export const ru: Translations = {
|
||||
promptImageUrl: 'URL изображения',
|
||||
htmlEditorCode: 'Код',
|
||||
htmlEditorPreview: 'Предпросмотр',
|
||||
lastSaved: 'Последнее сохранение',
|
||||
draftRestored: 'Локальный черновик восстановлен из предыдущей сессии.',
|
||||
dismiss: 'Скрыть',
|
||||
resetDraft: 'Сбросить черновик',
|
||||
resetSection: 'Сбросить секцию',
|
||||
confirmResetDraft: 'Это отменит все неопубликованные изменения и восстановит последнюю опубликованную конфигурацию. Продолжить?',
|
||||
confirmResetSection: 'Это отменит неопубликованные изменения только в этой секции. Продолжить?',
|
||||
},
|
||||
staticPages: {
|
||||
notFound: 'Страница не найдена',
|
||||
@@ -555,6 +562,16 @@ export const ru: Translations = {
|
||||
qrExpired: 'QR-код устарел. Нажмите, чтобы обновить',
|
||||
qrError: 'Не удалось создать сессию входа. Нажмите, чтобы повторить',
|
||||
},
|
||||
adminAuth: {
|
||||
loginRequired: 'Требуется вход администратора',
|
||||
loginDescription: 'Войдите под учётной записью администратора. Это отдельная сессия от входа покупателя.',
|
||||
checking: 'Проверка...',
|
||||
loginWithApp: 'Войти через приложение',
|
||||
orScanQr: 'Или отсканируйте QR-код',
|
||||
loginNote: 'После входа вы будете перенаправлены обратно',
|
||||
qrExpired: 'QR-код устарел. Нажмите, чтобы обновить',
|
||||
qrError: 'Не удалось создать сессию входа. Нажмите, чтобы повторить',
|
||||
},
|
||||
ux: {
|
||||
items: 'товаров',
|
||||
wishlistTitle: 'Избранное',
|
||||
|
||||
@@ -520,6 +520,13 @@ export interface Translations {
|
||||
promptImageUrl: string;
|
||||
htmlEditorCode: string;
|
||||
htmlEditorPreview: string;
|
||||
lastSaved: string;
|
||||
draftRestored: string;
|
||||
dismiss: string;
|
||||
resetDraft: string;
|
||||
resetSection: string;
|
||||
confirmResetDraft: string;
|
||||
confirmResetSection: string;
|
||||
};
|
||||
staticPages: {
|
||||
notFound: string;
|
||||
@@ -553,6 +560,16 @@ export interface Translations {
|
||||
qrExpired: string;
|
||||
qrError: string;
|
||||
};
|
||||
adminAuth: {
|
||||
loginRequired: string;
|
||||
loginDescription: string;
|
||||
checking: string;
|
||||
loginWithApp: string;
|
||||
orScanQr: string;
|
||||
loginNote: string;
|
||||
qrExpired: string;
|
||||
qrError: string;
|
||||
};
|
||||
ux: {
|
||||
items: string;
|
||||
wishlistTitle: string;
|
||||
|
||||
Reference in New Issue
Block a user