@dskripchenko/laravel-admin 1.21.4 → 1.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { inject as l, reactive as i, provide as d } from "vue";
1
+ import { reactive as i, provide as d, inject as l } from "vue";
2
2
  const n = /* @__PURE__ */ Symbol("admin.form-state");
3
3
  function F(o = {}, f = {}, u) {
4
4
  const s = i(o), e = i({ ...f }), c = {
@@ -38,4 +38,4 @@ export {
38
38
  y as t,
39
39
  p as u
40
40
  };
41
- //# sourceMappingURL=formState-DC25j4xe.js.map
41
+ //# sourceMappingURL=formState-DeRZBwWH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formState-DC25j4xe.js","sources":["../resources/ts/components/render/formState.ts"],"sourcesContent":["/**\n * Composable для form-state: предоставляет state + ошибки через provide/inject.\n *\n * Контейнер (Resource form / Settings page) вызывает `provideFormState()`,\n * Field-компоненты в дереве — `useFormState()` для чтения значения и\n * мутации поля.\n *\n * State — reactive proxy; setField мутирует ключ. Errors — отдельный\n * reactive Map (field-name → string[] messages).\n */\n\nimport { inject, provide, reactive, type InjectionKey } from 'vue'\n\nexport interface FormStateContext {\n state: Record<string, unknown>\n errors: Record<string, string[]>\n /** Контекст формы: FieldRenderer скрывает поля с visibility[mode]=false. */\n mode?: 'create' | 'update' | 'view'\n setField: (name: string, value: unknown) => void\n getField: (name: string) => unknown\n setError: (name: string, messages: string[] | null) => void\n setErrors: (next: Record<string, string[]>) => void\n clearErrors: () => void\n}\n\nconst FormStateKey: InjectionKey<FormStateContext> = Symbol('admin.form-state')\n\n/**\n * Создаёт form-context и provid'ит его потомкам.\n *\n * Переданный `initial`-object оборачивается в `reactive()` — мутации stora\n * видны и снаружи (caller владеет state'ом и может его читать после submit'а).\n *\n * @param initial Начальные значения state'а.\n * @param initialErrors Начальные ошибки (для повторного render'а после\n * ValidationError).\n */\nexport function provideFormState(\n initial: Record<string, unknown> = {},\n initialErrors: Record<string, string[]> = {},\n mode?: 'create' | 'update' | 'view',\n): FormStateContext {\n const state = reactive(initial)\n const errors = reactive<Record<string, string[]>>({ ...initialErrors })\n\n const ctx: FormStateContext = {\n state,\n errors,\n mode,\n setField(name, value) {\n ;(state as Record<string, unknown>)[name] = value\n // Очистить ошибки этого поля при изменении — стандартный UX.\n if (errors[name]) {\n delete errors[name]\n }\n },\n getField(name) {\n return (state as Record<string, unknown>)[name]\n },\n setError(name, messages) {\n if (messages === null || messages.length === 0) {\n delete errors[name]\n } else {\n errors[name] = messages\n }\n },\n setErrors(next) {\n for (const key of Object.keys(errors)) delete errors[key]\n Object.assign(errors, next)\n },\n clearErrors() {\n for (const key of Object.keys(errors)) delete errors[key]\n },\n }\n\n provide(FormStateKey, ctx)\n return ctx\n}\n\n/**\n * Получить form-context. Throws, если не вызван внутри `provideFormState()`.\n */\nexport function useFormState(): FormStateContext {\n const ctx = inject(FormStateKey)\n if (!ctx) {\n throw new Error('useFormState() called outside of provideFormState() scope')\n }\n return ctx\n}\n\n/** Опционально получить (null если нет). */\nexport function tryUseFormState(): FormStateContext | null {\n return inject(FormStateKey, null)\n}\n"],"names":["FormStateKey","provideFormState","initial","initialErrors","mode","state","reactive","errors","ctx","name","value","messages","next","key","provide","useFormState","inject","tryUseFormState"],"mappings":";AAyBA,MAAMA,2BAAsD,kBAAkB;AAYvE,SAASC,EACdC,IAAmC,CAAA,GACnCC,IAA0C,CAAA,GAC1CC,GACkB;AAClB,QAAMC,IAAQC,EAASJ,CAAO,GACxBK,IAASD,EAAmC,EAAE,GAAGH,GAAe,GAEhEK,IAAwB;AAAA,IAC5B,OAAAH;AAAA,IACA,QAAAE;AAAA,IACA,MAAAH;AAAA,IACA,SAASK,GAAMC,GAAO;AAClB,MAAAL,EAAkCI,CAAI,IAAIC,GAExCH,EAAOE,CAAI,KACb,OAAOF,EAAOE,CAAI;AAAA,IAEtB;AAAA,IACA,SAASA,GAAM;AACb,aAAQJ,EAAkCI,CAAI;AAAA,IAChD;AAAA,IACA,SAASA,GAAME,GAAU;AACvB,MAAIA,MAAa,QAAQA,EAAS,WAAW,IAC3C,OAAOJ,EAAOE,CAAI,IAElBF,EAAOE,CAAI,IAAIE;AAAA,IAEnB;AAAA,IACA,UAAUC,GAAM;AACd,iBAAWC,KAAO,OAAO,KAAKN,CAAM,EAAG,QAAOA,EAAOM,CAAG;AACxD,aAAO,OAAON,GAAQK,CAAI;AAAA,IAC5B;AAAA,IACA,cAAc;AACZ,iBAAWC,KAAO,OAAO,KAAKN,CAAM,EAAG,QAAOA,EAAOM,CAAG;AAAA,IAC1D;AAAA,EAAA;AAGF,SAAAC,EAAQd,GAAcQ,CAAG,GAClBA;AACT;AAKO,SAASO,IAAiC;AAC/C,QAAMP,IAAMQ,EAAOhB,CAAY;AAC/B,MAAI,CAACQ;AACH,UAAM,IAAI,MAAM,2DAA2D;AAE7E,SAAOA;AACT;AAGO,SAASS,IAA2C;AACzD,SAAOD,EAAOhB,GAAc,IAAI;AAClC;"}
1
+ {"version":3,"file":"formState-DeRZBwWH.js","sources":["../resources/ts/components/render/formState.ts"],"sourcesContent":["/**\n * Composable для form-state: предоставляет state + ошибки через provide/inject.\n *\n * Контейнер (Resource form / Settings page) вызывает `provideFormState()`,\n * Field-компоненты в дереве — `useFormState()` для чтения значения и\n * мутации поля.\n *\n * State — reactive proxy; setField мутирует ключ. Errors — отдельный\n * reactive Map (field-name → string[] messages).\n */\n\nimport { inject, provide, reactive, type InjectionKey } from 'vue'\n\nexport interface FormStateContext {\n state: Record<string, unknown>\n errors: Record<string, string[]>\n /** Контекст формы: FieldRenderer скрывает поля с visibility[mode]=false. */\n mode?: 'create' | 'update' | 'view'\n setField: (name: string, value: unknown) => void\n getField: (name: string) => unknown\n setError: (name: string, messages: string[] | null) => void\n setErrors: (next: Record<string, string[]>) => void\n clearErrors: () => void\n}\n\nconst FormStateKey: InjectionKey<FormStateContext> = Symbol('admin.form-state')\n\n/**\n * Создаёт form-context и provid'ит его потомкам.\n *\n * Переданный `initial`-object оборачивается в `reactive()` — мутации stora\n * видны и снаружи (caller владеет state'ом и может его читать после submit'а).\n *\n * @param initial Начальные значения state'а.\n * @param initialErrors Начальные ошибки (для повторного render'а после\n * ValidationError).\n */\nexport function provideFormState(\n initial: Record<string, unknown> = {},\n initialErrors: Record<string, string[]> = {},\n mode?: 'create' | 'update' | 'view',\n): FormStateContext {\n const state = reactive(initial)\n const errors = reactive<Record<string, string[]>>({ ...initialErrors })\n\n const ctx: FormStateContext = {\n state,\n errors,\n mode,\n setField(name, value) {\n ;(state as Record<string, unknown>)[name] = value\n // Очистить ошибки этого поля при изменении — стандартный UX.\n if (errors[name]) {\n delete errors[name]\n }\n },\n getField(name) {\n return (state as Record<string, unknown>)[name]\n },\n setError(name, messages) {\n if (messages === null || messages.length === 0) {\n delete errors[name]\n } else {\n errors[name] = messages\n }\n },\n setErrors(next) {\n for (const key of Object.keys(errors)) delete errors[key]\n Object.assign(errors, next)\n },\n clearErrors() {\n for (const key of Object.keys(errors)) delete errors[key]\n },\n }\n\n provide(FormStateKey, ctx)\n return ctx\n}\n\n/**\n * Получить form-context. Throws, если не вызван внутри `provideFormState()`.\n */\nexport function useFormState(): FormStateContext {\n const ctx = inject(FormStateKey)\n if (!ctx) {\n throw new Error('useFormState() called outside of provideFormState() scope')\n }\n return ctx\n}\n\n/** Опционально получить (null если нет). */\nexport function tryUseFormState(): FormStateContext | null {\n return inject(FormStateKey, null)\n}\n"],"names":["FormStateKey","provideFormState","initial","initialErrors","mode","state","reactive","errors","ctx","name","value","messages","next","key","provide","useFormState","inject","tryUseFormState"],"mappings":";AAyBA,MAAMA,2BAAsD,kBAAkB;AAYvE,SAASC,EACdC,IAAmC,CAAA,GACnCC,IAA0C,CAAA,GAC1CC,GACkB;AAClB,QAAMC,IAAQC,EAASJ,CAAO,GACxBK,IAASD,EAAmC,EAAE,GAAGH,GAAe,GAEhEK,IAAwB;AAAA,IAC5B,OAAAH;AAAA,IACA,QAAAE;AAAA,IACA,MAAAH;AAAA,IACA,SAASK,GAAMC,GAAO;AAClB,MAAAL,EAAkCI,CAAI,IAAIC,GAExCH,EAAOE,CAAI,KACb,OAAOF,EAAOE,CAAI;AAAA,IAEtB;AAAA,IACA,SAASA,GAAM;AACb,aAAQJ,EAAkCI,CAAI;AAAA,IAChD;AAAA,IACA,SAASA,GAAME,GAAU;AACvB,MAAIA,MAAa,QAAQA,EAAS,WAAW,IAC3C,OAAOJ,EAAOE,CAAI,IAElBF,EAAOE,CAAI,IAAIE;AAAA,IAEnB;AAAA,IACA,UAAUC,GAAM;AACd,iBAAWC,KAAO,OAAO,KAAKN,CAAM,EAAG,QAAOA,EAAOM,CAAG;AACxD,aAAO,OAAON,GAAQK,CAAI;AAAA,IAC5B;AAAA,IACA,cAAc;AACZ,iBAAWC,KAAO,OAAO,KAAKN,CAAM,EAAG,QAAOA,EAAOM,CAAG;AAAA,IAC1D;AAAA,EAAA;AAGF,SAAAC,EAAQd,GAAcQ,CAAG,GAClBA;AACT;AAKO,SAASO,IAAiC;AAC/C,QAAMP,IAAMQ,EAAOhB,CAAY;AAC/B,MAAI,CAACQ;AACH,UAAM,IAAI,MAAM,2DAA2D;AAE7E,SAAOA;AACT;AAGO,SAASS,IAA2C;AACzD,SAAOD,EAAOhB,GAAc,IAAI;AAClC;"}
@@ -0,0 +1,2 @@
1
+ "use strict";const g=require("pinia"),s=require("vue");function d(e){try{return c().tr(e)}catch{return e}}const c=g.defineStore("admin-i18n",()=>{const e=s.ref({}),r=s.ref("ru");function o(t){const n=t.translations;n&&typeof n=="object"&&(e.value={...n}),r.value=t.locale??"ru"}function a(t){e.value={...t}}function i(t,n={}){let u=e.value[t]??t;for(const[v,S]of Object.entries(n))u=u.replace(new RegExp(`:${v}`,"g"),String(S));return u}const f=t=>t in e.value;function l(t){return e.value[t]??t}return{messages:e,locale:r,hydrate:o,setMessages:a,t:i,tr:l,has:f,keys:s.computed(()=>Object.keys(e.value))}});function p(e,r){return c().t(e,r??{})}exports.tRaw=p;exports.trSafe=d;exports.useI18nStore=c;
2
+ //# sourceMappingURL=i18n-Brm4-uwE.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"i18n-Dz2R-DQS.cjs","sources":["../resources/ts/stores/i18n.ts"],"sourcesContent":["/**\n * i18n store — простой message-bag + t() helper.\n *\n * Backend кладёт translations bag в `bootstrap.translations` (Record<key, string>).\n * При смене локали (`/system/setLocale`) bootstrap переподнимается либо\n * helper зовёт `loadLocale(locale)`, который POST'ит messages.\n *\n * Формат:\n * t('admin.dashboard.add_widget') // 'Add widget'\n * t('admin.records.count', { n: 42 }) // 'Записей: 42' (interpolation :n)\n *\n * Fallback: если ключ не найден — возвращает сам ключ (помогает быстро\n * увидеть отсутствующие переводы во время разработки).\n */\nimport { defineStore } from 'pinia'\nimport { computed, ref } from 'vue'\nimport type { AdminBootstrap } from '../types/bootstrap'\n\n/**\n * Standalone-обёртка над store.tr() для компонентов: не падает без активной\n * Pinia (unit-тесты, SSR-edge) — возвращает исходную строку.\n */\nexport function trSafe(text: string): string {\n try {\n return useI18nStore().tr(text)\n } catch {\n return text\n }\n}\n\nexport const useI18nStore = defineStore('admin-i18n', () => {\n const messages = ref<Record<string, string>>({})\n const locale = ref<string>('ru')\n\n function hydrate(bootstrap: AdminBootstrap): void {\n // Backend кладёт translations в bootstrap (опционально).\n const t = (bootstrap as unknown as { translations?: Record<string, string> }).translations\n if (t && typeof t === 'object') {\n messages.value = { ...t }\n }\n locale.value = bootstrap.locale ?? 'ru'\n }\n\n function setMessages(next: Record<string, string>): void {\n messages.value = { ...next }\n }\n\n /**\n * Translate. Поддерживает interpolation вида `:name` (Laravel-стиль).\n * Если ключ отсутствует — возвращается сам ключ (visible-fallback).\n */\n function t(key: string, replace: Record<string, string | number> = {}): string {\n let str = messages.value[key] ?? key\n for (const [k, v] of Object.entries(replace)) {\n str = str.replace(new RegExp(`:${k}`, 'g'), String(v))\n }\n return str\n }\n\n const has = (key: string): boolean => key in messages.value\n\n /**\n * Перевод по строке-ключу (JSON-стиль, ключ = исходная строка на языке\n * разработки). Backend подмешивает в bag JSON-переводы текущей локали\n * (lang/{locale}.json хоста) — BL-11. Без перевода строка возвращается\n * как есть, интерполяция не применяется.\n */\n function tr(text: string): string {\n return messages.value[text] ?? text\n }\n\n return {\n messages,\n locale,\n hydrate,\n setMessages,\n t,\n tr,\n has,\n keys: computed(() => Object.keys(messages.value)),\n }\n})\n\n/**\n * Convenience: глобальный t() для не-Vue контекстов (utils, services).\n * В Vue-компонентах предпочтительнее `const { t } = useI18nStore()`.\n */\nexport function tRaw(key: string, replace?: Record<string, string | number>): string {\n return useI18nStore().t(key, replace ?? {})\n}\n"],"names":["trSafe","text","useI18nStore","defineStore","messages","ref","locale","hydrate","bootstrap","t","setMessages","next","key","replace","str","k","v","has","tr","computed"],"mappings":"uDAsBO,SAASA,EAAOC,EAAsB,CAC3C,GAAI,CACF,OAAOC,EAAA,EAAe,GAAGD,CAAI,CAC/B,MAAQ,CACN,OAAOA,CACT,CACF,CAEO,MAAMC,EAAeC,EAAAA,YAAY,aAAc,IAAM,CAC1D,MAAMC,EAAWC,EAAAA,IAA4B,EAAE,EACzCC,EAASD,EAAAA,IAAY,IAAI,EAE/B,SAASE,EAAQC,EAAiC,CAEhD,MAAMC,EAAKD,EAAmE,aAC1EC,GAAK,OAAOA,GAAM,WACpBL,EAAS,MAAQ,CAAE,GAAGK,CAAAA,GAExBH,EAAO,MAAQE,EAAU,QAAU,IACrC,CAEA,SAASE,EAAYC,EAAoC,CACvDP,EAAS,MAAQ,CAAE,GAAGO,CAAA,CACxB,CAMA,SAASF,EAAEG,EAAaC,EAA2C,GAAY,CAC7E,IAAIC,EAAMV,EAAS,MAAMQ,CAAG,GAAKA,EACjC,SAAW,CAACG,EAAGC,CAAC,IAAK,OAAO,QAAQH,CAAO,EACzCC,EAAMA,EAAI,QAAQ,IAAI,OAAO,IAAIC,CAAC,GAAI,GAAG,EAAG,OAAOC,CAAC,CAAC,EAEvD,OAAOF,CACT,CAEA,MAAMG,EAAOL,GAAyBA,KAAOR,EAAS,MAQtD,SAASc,EAAGjB,EAAsB,CAChC,OAAOG,EAAS,MAAMH,CAAI,GAAKA,CACjC,CAEA,MAAO,CACL,SAAAG,EACA,OAAAE,EACA,QAAAC,EACA,YAAAG,EACA,EAAAD,EACA,GAAAS,EACA,IAAAD,EACA,KAAME,EAAAA,SAAS,IAAM,OAAO,KAAKf,EAAS,KAAK,CAAC,CAAA,CAEpD,CAAC"}
1
+ {"version":3,"file":"i18n-Brm4-uwE.cjs","sources":["../resources/ts/stores/i18n.ts"],"sourcesContent":["/**\n * i18n store — простой message-bag + t() helper.\n *\n * Backend кладёт translations bag в `bootstrap.translations` (Record<key, string>).\n * При смене локали (`/system/setLocale`) bootstrap переподнимается либо\n * helper зовёт `loadLocale(locale)`, который POST'ит messages.\n *\n * Формат:\n * t('admin.dashboard.add_widget') // 'Add widget'\n * t('admin.records.count', { n: 42 }) // 'Записей: 42' (interpolation :n)\n *\n * Fallback: если ключ не найден — возвращает сам ключ (помогает быстро\n * увидеть отсутствующие переводы во время разработки).\n */\nimport { defineStore } from 'pinia'\nimport { computed, ref } from 'vue'\nimport type { AdminBootstrap } from '../types/bootstrap'\n\n/**\n * Standalone-обёртка над store.tr() для компонентов: не падает без активной\n * Pinia (unit-тесты, SSR-edge) — возвращает исходную строку.\n */\nexport function trSafe(text: string): string {\n try {\n return useI18nStore().tr(text)\n } catch {\n return text\n }\n}\n\nexport const useI18nStore = defineStore('admin-i18n', () => {\n const messages = ref<Record<string, string>>({})\n const locale = ref<string>('ru')\n\n function hydrate(bootstrap: AdminBootstrap): void {\n // Backend кладёт translations в bootstrap (опционально).\n const t = (bootstrap as unknown as { translations?: Record<string, string> }).translations\n if (t && typeof t === 'object') {\n messages.value = { ...t }\n }\n locale.value = bootstrap.locale ?? 'ru'\n }\n\n function setMessages(next: Record<string, string>): void {\n messages.value = { ...next }\n }\n\n /**\n * Translate. Поддерживает interpolation вида `:name` (Laravel-стиль).\n * Если ключ отсутствует — возвращается сам ключ (visible-fallback).\n */\n function t(key: string, replace: Record<string, string | number> = {}): string {\n let str = messages.value[key] ?? key\n for (const [k, v] of Object.entries(replace)) {\n str = str.replace(new RegExp(`:${k}`, 'g'), String(v))\n }\n return str\n }\n\n const has = (key: string): boolean => key in messages.value\n\n /**\n * Перевод по строке-ключу (JSON-стиль, ключ = исходная строка на языке\n * разработки). Backend подмешивает в bag JSON-переводы текущей локали\n * (lang/{locale}.json хоста) — BL-11. Без перевода строка возвращается\n * как есть, интерполяция не применяется.\n */\n function tr(text: string): string {\n return messages.value[text] ?? text\n }\n\n return {\n messages,\n locale,\n hydrate,\n setMessages,\n t,\n tr,\n has,\n keys: computed(() => Object.keys(messages.value)),\n }\n})\n\n/**\n * Convenience: глобальный t() для не-Vue контекстов (utils, services).\n * В Vue-компонентах предпочтительнее `const { t } = useI18nStore()`.\n */\nexport function tRaw(key: string, replace?: Record<string, string | number>): string {\n return useI18nStore().t(key, replace ?? {})\n}\n"],"names":["trSafe","text","useI18nStore","defineStore","messages","ref","locale","hydrate","bootstrap","t","setMessages","next","key","replace","str","k","v","has","tr","computed","tRaw"],"mappings":"uDAsBO,SAASA,EAAOC,EAAsB,CAC3C,GAAI,CACF,OAAOC,EAAA,EAAe,GAAGD,CAAI,CAC/B,MAAQ,CACN,OAAOA,CACT,CACF,CAEO,MAAMC,EAAeC,EAAAA,YAAY,aAAc,IAAM,CAC1D,MAAMC,EAAWC,EAAAA,IAA4B,EAAE,EACzCC,EAASD,EAAAA,IAAY,IAAI,EAE/B,SAASE,EAAQC,EAAiC,CAEhD,MAAMC,EAAKD,EAAmE,aAC1EC,GAAK,OAAOA,GAAM,WACpBL,EAAS,MAAQ,CAAE,GAAGK,CAAAA,GAExBH,EAAO,MAAQE,EAAU,QAAU,IACrC,CAEA,SAASE,EAAYC,EAAoC,CACvDP,EAAS,MAAQ,CAAE,GAAGO,CAAA,CACxB,CAMA,SAASF,EAAEG,EAAaC,EAA2C,GAAY,CAC7E,IAAIC,EAAMV,EAAS,MAAMQ,CAAG,GAAKA,EACjC,SAAW,CAACG,EAAGC,CAAC,IAAK,OAAO,QAAQH,CAAO,EACzCC,EAAMA,EAAI,QAAQ,IAAI,OAAO,IAAIC,CAAC,GAAI,GAAG,EAAG,OAAOC,CAAC,CAAC,EAEvD,OAAOF,CACT,CAEA,MAAMG,EAAOL,GAAyBA,KAAOR,EAAS,MAQtD,SAASc,EAAGjB,EAAsB,CAChC,OAAOG,EAAS,MAAMH,CAAI,GAAKA,CACjC,CAEA,MAAO,CACL,SAAAG,EACA,OAAAE,EACA,QAAAC,EACA,YAAAG,EACA,EAAAD,EACA,GAAAS,EACA,IAAAD,EACA,KAAME,EAAAA,SAAS,IAAM,OAAO,KAAKf,EAAS,KAAK,CAAC,CAAA,CAEpD,CAAC,EAMM,SAASgB,EAAKR,EAAaC,EAAmD,CACnF,OAAOX,IAAe,EAAEU,EAAKC,GAAW,CAAA,CAAE,CAC5C"}
@@ -0,0 +1,48 @@
1
+ import { defineStore as p } from "pinia";
2
+ import { ref as u, computed as g } from "vue";
3
+ function S(e) {
4
+ try {
5
+ return a().tr(e);
6
+ } catch {
7
+ return e;
8
+ }
9
+ }
10
+ const a = p("admin-i18n", () => {
11
+ const e = u({}), r = u("ru");
12
+ function s(t) {
13
+ const n = t.translations;
14
+ n && typeof n == "object" && (e.value = { ...n }), r.value = t.locale ?? "ru";
15
+ }
16
+ function c(t) {
17
+ e.value = { ...t };
18
+ }
19
+ function i(t, n = {}) {
20
+ let o = e.value[t] ?? t;
21
+ for (const [v, m] of Object.entries(n))
22
+ o = o.replace(new RegExp(`:${v}`, "g"), String(m));
23
+ return o;
24
+ }
25
+ const f = (t) => t in e.value;
26
+ function l(t) {
27
+ return e.value[t] ?? t;
28
+ }
29
+ return {
30
+ messages: e,
31
+ locale: r,
32
+ hydrate: s,
33
+ setMessages: c,
34
+ t: i,
35
+ tr: l,
36
+ has: f,
37
+ keys: g(() => Object.keys(e.value))
38
+ };
39
+ });
40
+ function h(e, r) {
41
+ return a().t(e, r ?? {});
42
+ }
43
+ export {
44
+ h as a,
45
+ S as t,
46
+ a as u
47
+ };
48
+ //# sourceMappingURL=i18n-CoD-_QDg.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"i18n-CoRTQbVV.js","sources":["../resources/ts/stores/i18n.ts"],"sourcesContent":["/**\n * i18n store — простой message-bag + t() helper.\n *\n * Backend кладёт translations bag в `bootstrap.translations` (Record<key, string>).\n * При смене локали (`/system/setLocale`) bootstrap переподнимается либо\n * helper зовёт `loadLocale(locale)`, который POST'ит messages.\n *\n * Формат:\n * t('admin.dashboard.add_widget') // 'Add widget'\n * t('admin.records.count', { n: 42 }) // 'Записей: 42' (interpolation :n)\n *\n * Fallback: если ключ не найден — возвращает сам ключ (помогает быстро\n * увидеть отсутствующие переводы во время разработки).\n */\nimport { defineStore } from 'pinia'\nimport { computed, ref } from 'vue'\nimport type { AdminBootstrap } from '../types/bootstrap'\n\n/**\n * Standalone-обёртка над store.tr() для компонентов: не падает без активной\n * Pinia (unit-тесты, SSR-edge) — возвращает исходную строку.\n */\nexport function trSafe(text: string): string {\n try {\n return useI18nStore().tr(text)\n } catch {\n return text\n }\n}\n\nexport const useI18nStore = defineStore('admin-i18n', () => {\n const messages = ref<Record<string, string>>({})\n const locale = ref<string>('ru')\n\n function hydrate(bootstrap: AdminBootstrap): void {\n // Backend кладёт translations в bootstrap (опционально).\n const t = (bootstrap as unknown as { translations?: Record<string, string> }).translations\n if (t && typeof t === 'object') {\n messages.value = { ...t }\n }\n locale.value = bootstrap.locale ?? 'ru'\n }\n\n function setMessages(next: Record<string, string>): void {\n messages.value = { ...next }\n }\n\n /**\n * Translate. Поддерживает interpolation вида `:name` (Laravel-стиль).\n * Если ключ отсутствует — возвращается сам ключ (visible-fallback).\n */\n function t(key: string, replace: Record<string, string | number> = {}): string {\n let str = messages.value[key] ?? key\n for (const [k, v] of Object.entries(replace)) {\n str = str.replace(new RegExp(`:${k}`, 'g'), String(v))\n }\n return str\n }\n\n const has = (key: string): boolean => key in messages.value\n\n /**\n * Перевод по строке-ключу (JSON-стиль, ключ = исходная строка на языке\n * разработки). Backend подмешивает в bag JSON-переводы текущей локали\n * (lang/{locale}.json хоста) — BL-11. Без перевода строка возвращается\n * как есть, интерполяция не применяется.\n */\n function tr(text: string): string {\n return messages.value[text] ?? text\n }\n\n return {\n messages,\n locale,\n hydrate,\n setMessages,\n t,\n tr,\n has,\n keys: computed(() => Object.keys(messages.value)),\n }\n})\n\n/**\n * Convenience: глобальный t() для не-Vue контекстов (utils, services).\n * В Vue-компонентах предпочтительнее `const { t } = useI18nStore()`.\n */\nexport function tRaw(key: string, replace?: Record<string, string | number>): string {\n return useI18nStore().t(key, replace ?? {})\n}\n"],"names":["trSafe","text","useI18nStore","defineStore","messages","ref","locale","hydrate","bootstrap","t","setMessages","next","key","replace","str","k","has","tr","computed"],"mappings":";;AAsBO,SAASA,EAAOC,GAAsB;AAC3C,MAAI;AACF,WAAOC,EAAA,EAAe,GAAGD,CAAI;AAAA,EAC/B,QAAQ;AACN,WAAOA;AAAA,EACT;AACF;AAEO,MAAMC,IAAeC,EAAY,cAAc,MAAM;AAC1D,QAAMC,IAAWC,EAA4B,EAAE,GACzCC,IAASD,EAAY,IAAI;AAE/B,WAASE,EAAQC,GAAiC;AAEhD,UAAMC,IAAKD,EAAmE;AAC9E,IAAIC,KAAK,OAAOA,KAAM,aACpBL,EAAS,QAAQ,EAAE,GAAGK,EAAAA,IAExBH,EAAO,QAAQE,EAAU,UAAU;AAAA,EACrC;AAEA,WAASE,EAAYC,GAAoC;AACvD,IAAAP,EAAS,QAAQ,EAAE,GAAGO,EAAA;AAAA,EACxB;AAMA,WAASF,EAAEG,GAAaC,IAA2C,IAAY;AAC7E,QAAIC,IAAMV,EAAS,MAAMQ,CAAG,KAAKA;AACjC,eAAW,CAACG,GAAG,CAAC,KAAK,OAAO,QAAQF,CAAO;AACzC,MAAAC,IAAMA,EAAI,QAAQ,IAAI,OAAO,IAAIC,CAAC,IAAI,GAAG,GAAG,OAAO,CAAC,CAAC;AAEvD,WAAOD;AAAA,EACT;AAEA,QAAME,IAAM,CAACJ,MAAyBA,KAAOR,EAAS;AAQtD,WAASa,EAAGhB,GAAsB;AAChC,WAAOG,EAAS,MAAMH,CAAI,KAAKA;AAAA,EACjC;AAEA,SAAO;AAAA,IACL,UAAAG;AAAA,IACA,QAAAE;AAAA,IACA,SAAAC;AAAA,IACA,aAAAG;AAAA,IACA,GAAAD;AAAA,IACA,IAAAQ;AAAA,IACA,KAAAD;AAAA,IACA,MAAME,EAAS,MAAM,OAAO,KAAKd,EAAS,KAAK,CAAC;AAAA,EAAA;AAEpD,CAAC;"}
1
+ {"version":3,"file":"i18n-CoD-_QDg.js","sources":["../resources/ts/stores/i18n.ts"],"sourcesContent":["/**\n * i18n store — простой message-bag + t() helper.\n *\n * Backend кладёт translations bag в `bootstrap.translations` (Record<key, string>).\n * При смене локали (`/system/setLocale`) bootstrap переподнимается либо\n * helper зовёт `loadLocale(locale)`, который POST'ит messages.\n *\n * Формат:\n * t('admin.dashboard.add_widget') // 'Add widget'\n * t('admin.records.count', { n: 42 }) // 'Записей: 42' (interpolation :n)\n *\n * Fallback: если ключ не найден — возвращает сам ключ (помогает быстро\n * увидеть отсутствующие переводы во время разработки).\n */\nimport { defineStore } from 'pinia'\nimport { computed, ref } from 'vue'\nimport type { AdminBootstrap } from '../types/bootstrap'\n\n/**\n * Standalone-обёртка над store.tr() для компонентов: не падает без активной\n * Pinia (unit-тесты, SSR-edge) — возвращает исходную строку.\n */\nexport function trSafe(text: string): string {\n try {\n return useI18nStore().tr(text)\n } catch {\n return text\n }\n}\n\nexport const useI18nStore = defineStore('admin-i18n', () => {\n const messages = ref<Record<string, string>>({})\n const locale = ref<string>('ru')\n\n function hydrate(bootstrap: AdminBootstrap): void {\n // Backend кладёт translations в bootstrap (опционально).\n const t = (bootstrap as unknown as { translations?: Record<string, string> }).translations\n if (t && typeof t === 'object') {\n messages.value = { ...t }\n }\n locale.value = bootstrap.locale ?? 'ru'\n }\n\n function setMessages(next: Record<string, string>): void {\n messages.value = { ...next }\n }\n\n /**\n * Translate. Поддерживает interpolation вида `:name` (Laravel-стиль).\n * Если ключ отсутствует — возвращается сам ключ (visible-fallback).\n */\n function t(key: string, replace: Record<string, string | number> = {}): string {\n let str = messages.value[key] ?? key\n for (const [k, v] of Object.entries(replace)) {\n str = str.replace(new RegExp(`:${k}`, 'g'), String(v))\n }\n return str\n }\n\n const has = (key: string): boolean => key in messages.value\n\n /**\n * Перевод по строке-ключу (JSON-стиль, ключ = исходная строка на языке\n * разработки). Backend подмешивает в bag JSON-переводы текущей локали\n * (lang/{locale}.json хоста) — BL-11. Без перевода строка возвращается\n * как есть, интерполяция не применяется.\n */\n function tr(text: string): string {\n return messages.value[text] ?? text\n }\n\n return {\n messages,\n locale,\n hydrate,\n setMessages,\n t,\n tr,\n has,\n keys: computed(() => Object.keys(messages.value)),\n }\n})\n\n/**\n * Convenience: глобальный t() для не-Vue контекстов (utils, services).\n * В Vue-компонентах предпочтительнее `const { t } = useI18nStore()`.\n */\nexport function tRaw(key: string, replace?: Record<string, string | number>): string {\n return useI18nStore().t(key, replace ?? {})\n}\n"],"names":["trSafe","text","useI18nStore","defineStore","messages","ref","locale","hydrate","bootstrap","t","setMessages","next","key","replace","str","k","v","has","tr","computed","tRaw"],"mappings":";;AAsBO,SAASA,EAAOC,GAAsB;AAC3C,MAAI;AACF,WAAOC,EAAA,EAAe,GAAGD,CAAI;AAAA,EAC/B,QAAQ;AACN,WAAOA;AAAA,EACT;AACF;AAEO,MAAMC,IAAeC,EAAY,cAAc,MAAM;AAC1D,QAAMC,IAAWC,EAA4B,EAAE,GACzCC,IAASD,EAAY,IAAI;AAE/B,WAASE,EAAQC,GAAiC;AAEhD,UAAMC,IAAKD,EAAmE;AAC9E,IAAIC,KAAK,OAAOA,KAAM,aACpBL,EAAS,QAAQ,EAAE,GAAGK,EAAAA,IAExBH,EAAO,QAAQE,EAAU,UAAU;AAAA,EACrC;AAEA,WAASE,EAAYC,GAAoC;AACvD,IAAAP,EAAS,QAAQ,EAAE,GAAGO,EAAA;AAAA,EACxB;AAMA,WAASF,EAAEG,GAAaC,IAA2C,IAAY;AAC7E,QAAIC,IAAMV,EAAS,MAAMQ,CAAG,KAAKA;AACjC,eAAW,CAACG,GAAGC,CAAC,KAAK,OAAO,QAAQH,CAAO;AACzC,MAAAC,IAAMA,EAAI,QAAQ,IAAI,OAAO,IAAIC,CAAC,IAAI,GAAG,GAAG,OAAOC,CAAC,CAAC;AAEvD,WAAOF;AAAA,EACT;AAEA,QAAMG,IAAM,CAACL,MAAyBA,KAAOR,EAAS;AAQtD,WAASc,EAAGjB,GAAsB;AAChC,WAAOG,EAAS,MAAMH,CAAI,KAAKA;AAAA,EACjC;AAEA,SAAO;AAAA,IACL,UAAAG;AAAA,IACA,QAAAE;AAAA,IACA,SAAAC;AAAA,IACA,aAAAG;AAAA,IACA,GAAAD;AAAA,IACA,IAAAS;AAAA,IACA,KAAAD;AAAA,IACA,MAAME,EAAS,MAAM,OAAO,KAAKf,EAAS,KAAK,CAAC;AAAA,EAAA;AAEpD,CAAC;AAMM,SAASgB,EAAKR,GAAaC,GAAmD;AACnF,SAAOX,IAAe,EAAEU,GAAKC,KAAW,CAAA,CAAE;AAC5C;"}