@open-mercato/core 0.6.7-develop.6828.1.ab1620a63e → 0.6.7-develop.6842.1.8cd8a8883c
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.
- package/.turbo/turbo-build.log +1 -1
- package/dist/modules/attachments/fields/attachment.js +1 -1
- package/dist/modules/attachments/fields/attachment.js.map +2 -2
- package/dist/modules/auth/components/UserConsentsPanel.js +9 -9
- package/dist/modules/auth/components/UserConsentsPanel.js.map +2 -2
- package/dist/modules/auth/frontend/reset.js +2 -2
- package/dist/modules/auth/frontend/reset.js.map +2 -2
- package/dist/modules/business_rules/components/ActionRow.js +1 -1
- package/dist/modules/business_rules/components/ActionRow.js.map +1 -1
- package/dist/modules/business_rules/components/ConditionRow.js +8 -4
- package/dist/modules/business_rules/components/ConditionRow.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js +4 -4
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/create/page.js +5 -5
- package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
- package/dist/modules/catalog/components/PriceKindSettings.js +3 -3
- package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductCategorizeSection.js +3 -3
- package/dist/modules/catalog/components/products/ProductCategorizeSection.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductMediaManager.js +1 -1
- package/dist/modules/catalog/components/products/ProductMediaManager.js.map +2 -2
- package/dist/modules/catalog/components/products/VariantBuilder.js +5 -5
- package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.js +1 -1
- package/dist/modules/communication_channels/backend/profile/communication-channels/page.js.map +2 -2
- package/dist/modules/customers/components/detail/ActivitiesDayStrip.js +2 -3
- package/dist/modules/customers/components/detail/ActivitiesDayStrip.js.map +2 -2
- package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js +1 -1
- package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js.map +1 -1
- package/dist/modules/dashboards/api/widgets/data/schema.js +26 -17
- package/dist/modules/dashboards/api/widgets/data/schema.js.map +2 -2
- package/dist/modules/dashboards/lib/aggregations.js +20 -6
- package/dist/modules/dashboards/lib/aggregations.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/detail.js +8 -8
- package/dist/modules/design_system/gallery/entries/detail.js.map +1 -1
- package/dist/modules/design_system/gallery/entries/overlays.js +2 -2
- package/dist/modules/design_system/gallery/entries/overlays.js.map +2 -2
- package/dist/modules/design_system/gallery/entries/scaffolding.js +8 -8
- package/dist/modules/design_system/gallery/entries/scaffolding.js.map +1 -1
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +1 -1
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +6 -6
- package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js +3 -3
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js.map +2 -2
- package/dist/modules/messages/components/message-detail/panels/dialogs.js +1 -1
- package/dist/modules/messages/components/message-detail/panels/dialogs.js.map +1 -1
- package/dist/modules/planner/components/AvailabilityRulesEditor.js +4 -4
- package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
- package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js +1 -1
- package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js.map +1 -1
- package/dist/modules/wms/components/backend/ReleaseReservationDialog.js +1 -1
- package/dist/modules/wms/components/backend/ReleaseReservationDialog.js.map +1 -1
- package/dist/modules/workflows/backend/definitions/page.js +1 -1
- package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js +1 -1
- package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
- package/dist/modules/workflows/backend/instances/page.js +8 -8
- package/dist/modules/workflows/backend/instances/page.js.map +2 -2
- package/dist/modules/workflows/backend/tasks/page.js +6 -6
- package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
- package/dist/modules/workflows/components/ActivitiesEditor.js +2 -2
- package/dist/modules/workflows/components/ActivitiesEditor.js.map +2 -2
- package/dist/modules/workflows/components/BusinessRulesSelector.js +1 -1
- package/dist/modules/workflows/components/BusinessRulesSelector.js.map +2 -2
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js +2 -2
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
- package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js +1 -2
- package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js.map +2 -2
- package/dist/modules/workflows/components/NodeEditDialogCrudForm.js +1 -2
- package/dist/modules/workflows/components/NodeEditDialogCrudForm.js.map +2 -2
- package/dist/modules/workflows/components/StepsEditor.js +2 -2
- package/dist/modules/workflows/components/StepsEditor.js.map +2 -2
- package/dist/modules/workflows/components/TransitionsEditor.js +3 -3
- package/dist/modules/workflows/components/TransitionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowLegend.js +1 -1
- package/dist/modules/workflows/components/WorkflowLegend.js.map +2 -2
- package/dist/modules/workflows/components/WorkflowSelector.js +1 -1
- package/dist/modules/workflows/components/WorkflowSelector.js.map +2 -2
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +1 -1
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +1 -1
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/MappingArrayEditor.js +1 -1
- package/dist/modules/workflows/components/fields/MappingArrayEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +1 -1
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/WorkflowSelectorField.js +4 -4
- package/dist/modules/workflows/components/fields/WorkflowSelectorField.js.map +2 -2
- package/package.json +8 -8
- package/src/modules/api_keys/i18n/ko.json +42 -0
- package/src/modules/attachments/fields/attachment.tsx +1 -1
- package/src/modules/attachments/i18n/ko.json +172 -0
- package/src/modules/audit_logs/i18n/ko.json +66 -0
- package/src/modules/auth/components/UserConsentsPanel.tsx +9 -9
- package/src/modules/auth/frontend/reset.tsx +2 -2
- package/src/modules/auth/i18n/ko.json +255 -0
- package/src/modules/business_rules/components/ActionRow.tsx +1 -1
- package/src/modules/business_rules/components/ConditionRow.tsx +9 -6
- package/src/modules/business_rules/i18n/ko.json +396 -0
- package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +4 -4
- package/src/modules/catalog/backend/catalog/products/create/page.tsx +5 -5
- package/src/modules/catalog/components/PriceKindSettings.tsx +3 -3
- package/src/modules/catalog/components/products/ProductCategorizeSection.tsx +3 -3
- package/src/modules/catalog/components/products/ProductMediaManager.tsx +1 -1
- package/src/modules/catalog/components/products/VariantBuilder.tsx +5 -5
- package/src/modules/catalog/i18n/ko.json +723 -0
- package/src/modules/communication_channels/backend/profile/communication-channels/page.tsx +1 -1
- package/src/modules/communication_channels/i18n/ko.json +138 -0
- package/src/modules/configs/i18n/ko.json +197 -0
- package/src/modules/currencies/i18n/de.json +1 -0
- package/src/modules/currencies/i18n/en.json +1 -0
- package/src/modules/currencies/i18n/es.json +1 -0
- package/src/modules/currencies/i18n/ko.json +160 -0
- package/src/modules/currencies/i18n/pl.json +1 -0
- package/src/modules/customer_accounts/i18n/ko.json +354 -0
- package/src/modules/customers/components/detail/ActivitiesDayStrip.tsx +2 -3
- package/src/modules/customers/components/detail/ConfirmDealLostDialog.tsx +1 -1
- package/src/modules/customers/i18n/de.json +10 -0
- package/src/modules/customers/i18n/en.json +10 -0
- package/src/modules/customers/i18n/es.json +10 -0
- package/src/modules/customers/i18n/ko.json +2855 -0
- package/src/modules/customers/i18n/pl.json +10 -0
- package/src/modules/dashboards/api/widgets/data/schema.ts +48 -19
- package/src/modules/dashboards/i18n/ko.json +118 -0
- package/src/modules/dashboards/lib/aggregations.ts +42 -6
- package/src/modules/data_sync/i18n/ko.json +125 -0
- package/src/modules/design_system/gallery/entries/detail.tsx +8 -8
- package/src/modules/design_system/gallery/entries/overlays.tsx +2 -2
- package/src/modules/design_system/gallery/entries/scaffolding.tsx +8 -8
- package/src/modules/design_system/i18n/de.json +12 -0
- package/src/modules/design_system/i18n/en.json +12 -0
- package/src/modules/design_system/i18n/es.json +12 -0
- package/src/modules/design_system/i18n/ko.json +58 -0
- package/src/modules/design_system/i18n/pl.json +12 -0
- package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +1 -1
- package/src/modules/dictionaries/i18n/ko.json +130 -0
- package/src/modules/directory/i18n/ko.json +105 -0
- package/src/modules/entities/i18n/ko.json +260 -0
- package/src/modules/feature_toggles/i18n/ko.json +96 -0
- package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +6 -6
- package/src/modules/inbox_ops/components/proposals/EditActionDialog.tsx +3 -3
- package/src/modules/inbox_ops/i18n/ko.json +196 -0
- package/src/modules/integrations/i18n/ko.json +129 -0
- package/src/modules/messages/components/message-detail/panels/dialogs.tsx +1 -1
- package/src/modules/messages/i18n/ko.json +263 -0
- package/src/modules/notifications/i18n/ko.json +55 -0
- package/src/modules/payment_gateways/i18n/ko.json +87 -0
- package/src/modules/planner/components/AvailabilityRulesEditor.tsx +4 -4
- package/src/modules/planner/i18n/ko.json +565 -0
- package/src/modules/portal/i18n/ko.json +143 -0
- package/src/modules/progress/i18n/ko.json +20 -0
- package/src/modules/query_index/i18n/ko.json +69 -0
- package/src/modules/resources/i18n/ko.json +770 -0
- package/src/modules/sales/i18n/ko.json +1442 -0
- package/src/modules/shipping_carriers/i18n/ko.json +85 -0
- package/src/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.tsx +1 -1
- package/src/modules/staff/i18n/ko.json +1162 -0
- package/src/modules/sync_excel/i18n/ko.json +107 -0
- package/src/modules/translations/i18n/ko.json +45 -0
- package/src/modules/wms/components/backend/ReleaseReservationDialog.tsx +1 -1
- package/src/modules/wms/i18n/ko.json +1053 -0
- package/src/modules/workflows/backend/definitions/page.tsx +1 -1
- package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +1 -1
- package/src/modules/workflows/backend/instances/page.tsx +8 -8
- package/src/modules/workflows/backend/tasks/page.tsx +6 -6
- package/src/modules/workflows/components/ActivitiesEditor.tsx +2 -2
- package/src/modules/workflows/components/BusinessRulesSelector.tsx +1 -1
- package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +2 -2
- package/src/modules/workflows/components/EdgeEditDialogCrudForm.tsx +1 -2
- package/src/modules/workflows/components/NodeEditDialogCrudForm.tsx +1 -2
- package/src/modules/workflows/components/StepsEditor.tsx +2 -2
- package/src/modules/workflows/components/TransitionsEditor.tsx +3 -3
- package/src/modules/workflows/components/WorkflowLegend.tsx +1 -1
- package/src/modules/workflows/components/WorkflowSelector.tsx +1 -1
- package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +1 -1
- package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +1 -1
- package/src/modules/workflows/components/fields/MappingArrayEditor.tsx +1 -1
- package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +1 -1
- package/src/modules/workflows/components/fields/WorkflowSelectorField.tsx +4 -4
- package/src/modules/workflows/i18n/ko.json +1203 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/modules/workflows/components/fields/WorkflowSelectorField.tsx"],
|
|
4
|
-
"sourcesContent": ["'use client'\n\nimport { useState, useEffect } from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Search, X, Loader2, AlertCircle, Workflow } from 'lucide-react'\nimport type { CrudCustomFieldRenderProps } from '@open-mercato/ui/backend/CrudForm'\nimport { WorkflowSelector, type WorkflowDefinition } from '../WorkflowSelector'\nimport { apiFetch } from '@open-mercato/ui/backend/utils/api'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('workflows')\n\ninterface WorkflowSelectorFieldProps extends CrudCustomFieldRenderProps {\n value: string\n label?: string\n description?: string\n}\n\ninterface WorkflowDetails {\n workflowId: string\n workflowName?: string\n version?: number\n enabled?: boolean\n description?: string | null\n loading?: boolean\n error?: boolean\n}\n\n/**\n * WorkflowSelectorField - Custom field component for selecting a sub-workflow\n *\n * Integrates with WorkflowSelector modal to pick a workflow.\n * Fetches and displays workflow details for the selected workflow ID.\n * Allows clearing the selection.\n *\n * Used by NodeEditDialog (SubWorkflow type only)\n */\nexport function WorkflowSelectorField({\n id,\n value = '',\n error,\n setValue,\n disabled,\n label: labelProp,\n description: descriptionProp,\n}: WorkflowSelectorFieldProps) {\n const t = useT()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const label = labelProp ?? t('workflows.fieldEditors.workflowSelector.label')\n const description = descriptionProp ?? t('workflows.fieldEditors.workflowSelector.description')\n const [isModalOpen, setIsModalOpen] = useState(false)\n const [workflowDetails, setWorkflowDetails] = useState<WorkflowDetails | null>(null)\n\n const workflowId = value || ''\n\n // Fetch workflow details when workflowId changes\n useEffect(() => {\n if (workflowId) {\n setWorkflowDetails({ workflowId, loading: true })\n fetchWorkflowDetails(workflowId)\n } else {\n setWorkflowDetails(null)\n }\n }, [workflowId])\n\n const fetchWorkflowDetails = async (wfId: string) => {\n try {\n const params = new URLSearchParams({ workflowId: wfId, limit: '1' })\n const response = await apiFetch(`/api/workflows/definitions?${params.toString()}`)\n\n if (response.ok) {\n const result = await response.json()\n const workflow = result.data?.[0] as WorkflowDefinition | undefined\n\n setWorkflowDetails({\n workflowId: wfId,\n workflowName: workflow?.workflowName,\n version: workflow?.version,\n enabled: workflow?.enabled,\n description: workflow?.description,\n loading: false,\n error: !workflow,\n })\n } else {\n setWorkflowDetails({\n workflowId: wfId,\n loading: false,\n error: true,\n })\n }\n } catch (err) {\n logger.error('Failed to fetch workflow details', { workflowId: wfId, err })\n setWorkflowDetails({\n workflowId: wfId,\n loading: false,\n error: true,\n })\n }\n }\n\n const handleSelect = (selectedWorkflowId: string, _workflow: WorkflowDefinition) => {\n setValue(selectedWorkflowId)\n setIsModalOpen(false)\n }\n\n const handleClear = async () => {\n const confirmed = await confirm({\n title: t('workflows.common.clear'),\n text: t('workflows.fieldEditors.workflowSelector.confirmClear'),\n variant: 'default',\n })\n if (!confirmed) return\n\n setValue('')\n setWorkflowDetails(null)\n }\n\n return (\n <div className=\"space-y-2\">\n <div>\n <Label htmlFor={id} className=\"text-sm font-medium\">\n {label}\n </Label>\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n {description}\n </p>\n {error && <p className=\"text-xs text-
|
|
5
|
-
"mappings": ";AA2HM,SAoCU,UAnCR,KADF;AAzHN,SAAS,UAAU,iBAAiB;AACpC,SAAS,YAAY;AACrB,SAAS,wBAAwB;AACjC,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,aAAa;AACtB,SAAS,QAAQ,GAAG,SAAS,aAAa,gBAAgB;AAE1D,SAAS,wBAAiD;AAC1D,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAE7B,MAAM,SAAS,aAAa,WAAW;AA2BhC,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,aAAa;AACf,GAA+B;AAC7B,QAAM,IAAI,KAAK;AACf,QAAM,EAAE,SAAS,qBAAqB,IAAI,iBAAiB;AAC3D,QAAM,QAAQ,aAAa,EAAE,+CAA+C;AAC5E,QAAM,cAAc,mBAAmB,EAAE,qDAAqD;AAC9F,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAiC,IAAI;AAEnF,QAAM,aAAa,SAAS;AAG5B,YAAU,MAAM;AACd,QAAI,YAAY;AACd,yBAAmB,EAAE,YAAY,SAAS,KAAK,CAAC;AAChD,2BAAqB,UAAU;AAAA,IACjC,OAAO;AACL,yBAAmB,IAAI;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,UAAU,CAAC;AAEf,QAAM,uBAAuB,OAAO,SAAiB;AACnD,QAAI;AACF,YAAM,SAAS,IAAI,gBAAgB,EAAE,YAAY,MAAM,OAAO,IAAI,CAAC;AACnE,YAAM,WAAW,MAAM,SAAS,8BAA8B,OAAO,SAAS,CAAC,EAAE;AAEjF,UAAI,SAAS,IAAI;AACf,cAAM,SAAS,MAAM,SAAS,KAAK;AACnC,cAAM,WAAW,OAAO,OAAO,CAAC;AAEhC,2BAAmB;AAAA,UACjB,YAAY;AAAA,UACZ,cAAc,UAAU;AAAA,UACxB,SAAS,UAAU;AAAA,UACnB,SAAS,UAAU;AAAA,UACnB,aAAa,UAAU;AAAA,UACvB,SAAS;AAAA,UACT,OAAO,CAAC;AAAA,QACV,CAAC;AAAA,MACH,OAAO;AACL,2BAAmB;AAAA,UACjB,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,MAAM,oCAAoC,EAAE,YAAY,MAAM,IAAI,CAAC;AAC1E,yBAAmB;AAAA,QACjB,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,oBAA4B,cAAkC;AAClF,aAAS,kBAAkB;AAC3B,mBAAe,KAAK;AAAA,EACtB;AAEA,QAAM,cAAc,YAAY;AAC9B,UAAM,YAAY,MAAM,QAAQ;AAAA,MAC9B,OAAO,EAAE,wBAAwB;AAAA,MACjC,MAAM,EAAE,sDAAsD;AAAA,MAC9D,SAAS;AAAA,IACX,CAAC;AACD,QAAI,CAAC,UAAW;AAEhB,aAAS,EAAE;AACX,uBAAmB,IAAI;AAAA,EACzB;AAEA,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,yBAAC,SACC;AAAA,0BAAC,SAAM,SAAS,IAAI,WAAU,uBAC3B,iBACH;AAAA,MACA,oBAAC,OAAE,WAAU,wCACV,uBACH;AAAA,MACC,SAAS,oBAAC,OAAE,WAAU,
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport { useState, useEffect } from 'react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Search, X, Loader2, AlertCircle, Workflow } from 'lucide-react'\nimport type { CrudCustomFieldRenderProps } from '@open-mercato/ui/backend/CrudForm'\nimport { WorkflowSelector, type WorkflowDefinition } from '../WorkflowSelector'\nimport { apiFetch } from '@open-mercato/ui/backend/utils/api'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('workflows')\n\ninterface WorkflowSelectorFieldProps extends CrudCustomFieldRenderProps {\n value: string\n label?: string\n description?: string\n}\n\ninterface WorkflowDetails {\n workflowId: string\n workflowName?: string\n version?: number\n enabled?: boolean\n description?: string | null\n loading?: boolean\n error?: boolean\n}\n\n/**\n * WorkflowSelectorField - Custom field component for selecting a sub-workflow\n *\n * Integrates with WorkflowSelector modal to pick a workflow.\n * Fetches and displays workflow details for the selected workflow ID.\n * Allows clearing the selection.\n *\n * Used by NodeEditDialog (SubWorkflow type only)\n */\nexport function WorkflowSelectorField({\n id,\n value = '',\n error,\n setValue,\n disabled,\n label: labelProp,\n description: descriptionProp,\n}: WorkflowSelectorFieldProps) {\n const t = useT()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const label = labelProp ?? t('workflows.fieldEditors.workflowSelector.label')\n const description = descriptionProp ?? t('workflows.fieldEditors.workflowSelector.description')\n const [isModalOpen, setIsModalOpen] = useState(false)\n const [workflowDetails, setWorkflowDetails] = useState<WorkflowDetails | null>(null)\n\n const workflowId = value || ''\n\n // Fetch workflow details when workflowId changes\n useEffect(() => {\n if (workflowId) {\n setWorkflowDetails({ workflowId, loading: true })\n fetchWorkflowDetails(workflowId)\n } else {\n setWorkflowDetails(null)\n }\n }, [workflowId])\n\n const fetchWorkflowDetails = async (wfId: string) => {\n try {\n const params = new URLSearchParams({ workflowId: wfId, limit: '1' })\n const response = await apiFetch(`/api/workflows/definitions?${params.toString()}`)\n\n if (response.ok) {\n const result = await response.json()\n const workflow = result.data?.[0] as WorkflowDefinition | undefined\n\n setWorkflowDetails({\n workflowId: wfId,\n workflowName: workflow?.workflowName,\n version: workflow?.version,\n enabled: workflow?.enabled,\n description: workflow?.description,\n loading: false,\n error: !workflow,\n })\n } else {\n setWorkflowDetails({\n workflowId: wfId,\n loading: false,\n error: true,\n })\n }\n } catch (err) {\n logger.error('Failed to fetch workflow details', { workflowId: wfId, err })\n setWorkflowDetails({\n workflowId: wfId,\n loading: false,\n error: true,\n })\n }\n }\n\n const handleSelect = (selectedWorkflowId: string, _workflow: WorkflowDefinition) => {\n setValue(selectedWorkflowId)\n setIsModalOpen(false)\n }\n\n const handleClear = async () => {\n const confirmed = await confirm({\n title: t('workflows.common.clear'),\n text: t('workflows.fieldEditors.workflowSelector.confirmClear'),\n variant: 'default',\n })\n if (!confirmed) return\n\n setValue('')\n setWorkflowDetails(null)\n }\n\n return (\n <div className=\"space-y-2\">\n <div>\n <Label htmlFor={id} className=\"text-sm font-medium\">\n {label}\n </Label>\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n {description}\n </p>\n {error && <p className=\"text-xs text-status-error-text mt-1\">{error}</p>}\n </div>\n\n {!workflowId ? (\n /* No Workflow Selected */\n <div className=\"border-2 border-dashed border-gray-300 rounded-lg p-6 text-center\">\n <Workflow className=\"size-8 text-muted-foreground mx-auto mb-2\" />\n <p className=\"text-sm text-muted-foreground mb-3\">{t('workflows.fieldEditors.workflowSelector.noWorkflowSelected')}</p>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={() => setIsModalOpen(true)}\n disabled={disabled}\n >\n <Search className=\"size-3 mr-1\" />\n {t('workflows.fieldEditors.workflowSelector.browseWorkflows')}\n </Button>\n </div>\n ) : (\n /* Workflow Selected */\n <div className=\"border border-gray-200 rounded-lg bg-white p-4\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex-1 min-w-0 space-y-2\">\n {workflowDetails?.loading ? (\n <div className=\"flex items-center gap-2\">\n <Loader2 className=\"size-4 animate-spin text-muted-foreground\" />\n <span className=\"text-sm text-muted-foreground\">{t('workflows.common.loadingDetails')}</span>\n </div>\n ) : workflowDetails?.error ? (\n <>\n <div className=\"flex items-center gap-2\">\n <AlertCircle className=\"size-4 text-status-warning-text\" />\n <span className=\"text-sm font-semibold text-gray-900\">{workflowId}</span>\n </div>\n <p className=\"text-xs text-status-warning-text\">{t('workflows.common.workflowNotFoundOrUnavailable')}</p>\n </>\n ) : (\n <>\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-gray-900\">\n {workflowDetails?.workflowName || workflowId}\n </span>\n {workflowDetails?.version !== undefined && (\n <Badge variant=\"secondary\" className=\"text-xs\">\n v{workflowDetails.version}\n </Badge>\n )}\n {workflowDetails?.enabled !== undefined && (\n workflowDetails.enabled ? (\n <Badge variant=\"default\" className=\"bg-status-success-solid text-status-success-solid-foreground text-xs\">\n {t('common.enabled')}\n </Badge>\n ) : (\n <Badge variant=\"secondary\" className=\"text-xs\">\n {t('common.disabled')}\n </Badge>\n )\n )}\n </div>\n <p className=\"text-xs text-muted-foreground font-mono mt-0.5\">{workflowId}</p>\n </div>\n {workflowDetails?.description && (\n <p className=\"text-xs text-muted-foreground\">{workflowDetails.description}</p>\n )}\n </>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-2 ml-4 flex-shrink-0\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setIsModalOpen(true)}\n disabled={disabled}\n >\n <Search className=\"size-3 mr-1\" />\n {t('workflows.common.change')}\n </Button>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleClear}\n disabled={disabled}\n >\n <X className=\"size-4\" />\n </Button>\n </div>\n </div>\n </div>\n )}\n\n {/* Workflow Selector Modal */}\n <WorkflowSelector\n isOpen={isModalOpen}\n onClose={() => setIsModalOpen(false)}\n onSelect={handleSelect}\n excludeWorkflowIds={workflowId ? [workflowId] : []}\n title={t('workflows.fieldEditors.workflowSelector.selectSubWorkflow')}\n description={t('workflows.fieldEditors.workflowSelector.selectSubWorkflowDescription')}\n onlyEnabled={true}\n />\n {ConfirmDialogElement}\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open-mercato/core",
|
|
3
|
-
"version": "0.6.7-develop.
|
|
3
|
+
"version": "0.6.7-develop.6842.1.8cd8a8883c",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -254,18 +254,18 @@
|
|
|
254
254
|
"zod": "^4.4.3"
|
|
255
255
|
},
|
|
256
256
|
"peerDependencies": {
|
|
257
|
-
"@open-mercato/ai-assistant": "0.6.7-develop.
|
|
258
|
-
"@open-mercato/shared": "0.6.7-develop.
|
|
259
|
-
"@open-mercato/ui": "0.6.7-develop.
|
|
257
|
+
"@open-mercato/ai-assistant": "0.6.7-develop.6842.1.8cd8a8883c",
|
|
258
|
+
"@open-mercato/shared": "0.6.7-develop.6842.1.8cd8a8883c",
|
|
259
|
+
"@open-mercato/ui": "0.6.7-develop.6842.1.8cd8a8883c",
|
|
260
260
|
"react": "^19.0.0",
|
|
261
261
|
"react-dom": "^19.0.0"
|
|
262
262
|
},
|
|
263
263
|
"devDependencies": {
|
|
264
|
-
"@open-mercato/ai-assistant": "0.6.7-develop.
|
|
265
|
-
"@open-mercato/shared": "0.6.7-develop.
|
|
266
|
-
"@open-mercato/ui": "0.6.7-develop.
|
|
264
|
+
"@open-mercato/ai-assistant": "0.6.7-develop.6842.1.8cd8a8883c",
|
|
265
|
+
"@open-mercato/shared": "0.6.7-develop.6842.1.8cd8a8883c",
|
|
266
|
+
"@open-mercato/ui": "0.6.7-develop.6842.1.8cd8a8883c",
|
|
267
267
|
"@testing-library/dom": "^10.4.1",
|
|
268
|
-
"@testing-library/jest-dom": "^
|
|
268
|
+
"@testing-library/jest-dom": "^7.0.0",
|
|
269
269
|
"@testing-library/react": "^16.3.1",
|
|
270
270
|
"@types/chance": "^1.1.8",
|
|
271
271
|
"@types/jest": "^30.0.0",
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"api_keys.copy.prefix": "접두사: {prefix}",
|
|
3
|
+
"api_keys.copy.subtitle": "이 비밀 값을 안전하게 보관하세요. 이 화면을 닫으면 다시 볼 수 없습니다.",
|
|
4
|
+
"api_keys.copy.title": "API 키 복사",
|
|
5
|
+
"api_keys.copy.warning": "이 키를 안전하게 보관하세요 — 나중에 다시 확인할 수 없습니다.",
|
|
6
|
+
"api_keys.errors.forbidden": "접근이 거부되었습니다",
|
|
7
|
+
"api_keys.errors.notFound": "찾을 수 없습니다",
|
|
8
|
+
"api_keys.errors.organizationOutOfScope": "조직이 범위를 벗어났습니다",
|
|
9
|
+
"api_keys.errors.roleNotFound": "역할 {identifier}을(를) 찾을 수 없습니다",
|
|
10
|
+
"api_keys.errors.roleWrongTenant": "역할 {role}은(는) 다른 테넌트에 속합니다",
|
|
11
|
+
"api_keys.errors.tenantRequired": "테넌트 컨텍스트가 필요합니다",
|
|
12
|
+
"api_keys.form.description": "설명",
|
|
13
|
+
"api_keys.form.descriptionHint": "팀원이 이 키가 사용되는 위치를 이해하는 데 도움이 되는 선택적 메모입니다.",
|
|
14
|
+
"api_keys.form.details": "상세 정보",
|
|
15
|
+
"api_keys.form.error.createFailed": "API 키 생성에 실패했습니다",
|
|
16
|
+
"api_keys.form.error.secretMissing": "API 키가 생성되었지만 비밀 값이 반환되지 않았습니다",
|
|
17
|
+
"api_keys.form.expiresAt": "만료일",
|
|
18
|
+
"api_keys.form.expiresHint": "만료일이 없으면 비워두세요.",
|
|
19
|
+
"api_keys.form.name": "이름",
|
|
20
|
+
"api_keys.form.organization": "조직",
|
|
21
|
+
"api_keys.form.organizationPlaceholder": "선택한 범위에서 상속",
|
|
22
|
+
"api_keys.form.roles": "역할",
|
|
23
|
+
"api_keys.form.rolesHint": "이 키로 인증된 요청은 이 역할을 대신 수행합니다.",
|
|
24
|
+
"api_keys.form.success": "API 키가 생성되었습니다. 지금 바로 비밀 값을 복사하세요 — 다시 표시되지 않습니다.",
|
|
25
|
+
"api_keys.form.title": "API 키 생성",
|
|
26
|
+
"api_keys.list.actions.create": "생성",
|
|
27
|
+
"api_keys.list.columns.expires": "만료일",
|
|
28
|
+
"api_keys.list.columns.key": "키",
|
|
29
|
+
"api_keys.list.columns.lastUsed": "마지막 사용",
|
|
30
|
+
"api_keys.list.columns.name": "이름",
|
|
31
|
+
"api_keys.list.columns.organization": "조직",
|
|
32
|
+
"api_keys.list.columns.roles": "역할",
|
|
33
|
+
"api_keys.list.confirmDelete": "API 키 \"{name}\"을(를) 삭제하시겠습니까? 즉시 비밀 값이 무효화됩니다.",
|
|
34
|
+
"api_keys.list.error.deleteFailed": "API 키 삭제에 실패했습니다",
|
|
35
|
+
"api_keys.list.error.loadFailed": "API 키를 불러오지 못했습니다",
|
|
36
|
+
"api_keys.list.noDate": "—",
|
|
37
|
+
"api_keys.list.noRoles": "없음",
|
|
38
|
+
"api_keys.list.success.deleted": "API 키가 삭제되었습니다",
|
|
39
|
+
"api_keys.list.title": "API 키",
|
|
40
|
+
"api_keys.nav.apiKeys": "API 키",
|
|
41
|
+
"api_keys.nav.apiKeys.create": "API 키 생성"
|
|
42
|
+
}
|
|
@@ -162,7 +162,7 @@ export const AttachmentInput = ({
|
|
|
162
162
|
/>
|
|
163
163
|
</div>
|
|
164
164
|
)}
|
|
165
|
-
{error ? <div className="text-xs text-
|
|
165
|
+
{error ? <div className="text-xs text-status-error-text">{error}</div> : null}
|
|
166
166
|
<div className="space-y-1">
|
|
167
167
|
{loading ? <div className="text-xs text-muted-foreground">{t('attachments.library.loading', 'Loading attachments…')}</div> : null}
|
|
168
168
|
{items.map(it => (
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
{
|
|
2
|
+
"attachments.errors.activeContentBlocked": "활성 콘텐츠 업로드는 허용되지 않습니다.",
|
|
3
|
+
"attachments.errors.dangerousExecutable": "실행 파일 형식은 첨부 파일로 허용되지 않습니다.",
|
|
4
|
+
"attachments.errors.maxUploadSize": "첨부 파일이 최대 업로드 크기를 초과합니다.",
|
|
5
|
+
"attachments.errors.publicPartitionBlocked": "이 업로드에는 공개 저장소 파티션을 명시적으로 선택할 수 없습니다.",
|
|
6
|
+
"attachments.errors.quotaExceeded": "이 테넌트의 첨부 파일 저장소 할당량을 초과했습니다.",
|
|
7
|
+
"attachments.errors.selectOrganization": "첨부파일을 업로드하기 전에 특정 조직을 선택하세요.",
|
|
8
|
+
"attachments.library.actions.copied": "링크가 복사되었습니다.",
|
|
9
|
+
"attachments.library.actions.copyError": "링크를 복사할 수 없습니다.",
|
|
10
|
+
"attachments.library.actions.copyUrl": "URL 복사",
|
|
11
|
+
"attachments.library.actions.delete": "삭제",
|
|
12
|
+
"attachments.library.actions.edit": "메타데이터 편집",
|
|
13
|
+
"attachments.library.actions.open": "열기",
|
|
14
|
+
"attachments.library.actions.refresh": "새로고침",
|
|
15
|
+
"attachments.library.actions.upload": "업로드",
|
|
16
|
+
"attachments.library.confirm.delete": "첨부 파일 \"{{name}}\"을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
|
|
17
|
+
"attachments.library.delete": "첨부 파일 삭제",
|
|
18
|
+
"attachments.library.description": "이 워크스페이스에 저장된 모든 파일을 찾아보고, 태그를 지정하고, 관리하세요.",
|
|
19
|
+
"attachments.library.errors.delete": "첨부 파일 삭제에 실패했습니다.",
|
|
20
|
+
"attachments.library.errors.load": "첨부 파일을 불러오지 못했습니다.",
|
|
21
|
+
"attachments.library.filters.partition": "파티션",
|
|
22
|
+
"attachments.library.filters.tags": "태그",
|
|
23
|
+
"attachments.library.filters.tagsPlaceholder": "태그로 필터링",
|
|
24
|
+
"attachments.library.loadMore": "더 보기",
|
|
25
|
+
"attachments.library.loading": "첨부 파일을 불러오는 중…",
|
|
26
|
+
"attachments.library.messages.deleted": "첨부 파일이 제거되었습니다.",
|
|
27
|
+
"attachments.library.metadata.assignments.add": "할당 추가",
|
|
28
|
+
"attachments.library.metadata.assignments.description": "이 첨부 파일이 속한 레코드를 선택적 링크와 함께 추가하세요.",
|
|
29
|
+
"attachments.library.metadata.assignments.href": "링크",
|
|
30
|
+
"attachments.library.metadata.assignments.id": "레코드 ID",
|
|
31
|
+
"attachments.library.metadata.assignments.label": "라벨",
|
|
32
|
+
"attachments.library.metadata.assignments.remove": "제거",
|
|
33
|
+
"attachments.library.metadata.assignments.title": "할당",
|
|
34
|
+
"attachments.library.metadata.assignments.type": "유형",
|
|
35
|
+
"attachments.library.metadata.cancel": "취소",
|
|
36
|
+
"attachments.library.metadata.details": "상세 정보",
|
|
37
|
+
"attachments.library.metadata.download": "다운로드",
|
|
38
|
+
"attachments.library.metadata.error": "메타데이터 업데이트에 실패했습니다.",
|
|
39
|
+
"attachments.library.metadata.extractedTitle": "추출된 텍스트",
|
|
40
|
+
"attachments.library.metadata.loadError": "첨부 파일 메타데이터를 불러오지 못했습니다.",
|
|
41
|
+
"attachments.library.metadata.loading": "메타데이터를 불러오는 중…",
|
|
42
|
+
"attachments.library.metadata.noContent": "추출된 텍스트 없음",
|
|
43
|
+
"attachments.library.metadata.noSelection": "편집할 첨부 파일을 선택하세요.",
|
|
44
|
+
"attachments.library.metadata.preview": "미리보기",
|
|
45
|
+
"attachments.library.metadata.previewUnavailable": "이 파일 형식은 미리보기를 사용할 수 없습니다.",
|
|
46
|
+
"attachments.library.metadata.resizeTool.copied": "이미지 URL이 복사되었습니다.",
|
|
47
|
+
"attachments.library.metadata.resizeTool.copy": "URL 복사",
|
|
48
|
+
"attachments.library.metadata.resizeTool.copyError": "URL을 복사할 수 없습니다.",
|
|
49
|
+
"attachments.library.metadata.resizeTool.height": "높이 (px)",
|
|
50
|
+
"attachments.library.metadata.resizeTool.missing": "URL을 생성하려면 너비 또는 높이를 입력하세요.",
|
|
51
|
+
"attachments.library.metadata.resizeTool.title": "크기 조정된 URL 생성",
|
|
52
|
+
"attachments.library.metadata.resizeTool.width": "너비 (px)",
|
|
53
|
+
"attachments.library.metadata.save": "저장",
|
|
54
|
+
"attachments.library.metadata.saving": "저장 중…",
|
|
55
|
+
"attachments.library.metadata.showLess": "간략히 보기",
|
|
56
|
+
"attachments.library.metadata.showMore": "더 보기",
|
|
57
|
+
"attachments.library.metadata.source": "소스",
|
|
58
|
+
"attachments.library.metadata.success": "첨부 파일이 업데이트되었습니다.",
|
|
59
|
+
"attachments.library.metadata.tagsPlaceholder": "태그 추가",
|
|
60
|
+
"attachments.library.metadata.title": "첨부 파일 메타데이터 편집",
|
|
61
|
+
"attachments.library.open": "첨부 파일 상세 정보 열기",
|
|
62
|
+
"attachments.library.openMetadata": "{name}의 첨부 파일 상세 정보 열기",
|
|
63
|
+
"attachments.library.table.assignments": "할당",
|
|
64
|
+
"attachments.library.table.created": "생성됨",
|
|
65
|
+
"attachments.library.table.download": "다운로드",
|
|
66
|
+
"attachments.library.table.empty": "첨부 파일을 찾을 수 없습니다.",
|
|
67
|
+
"attachments.library.table.file": "파일",
|
|
68
|
+
"attachments.library.table.partition": "파티션",
|
|
69
|
+
"attachments.library.table.search": "파일 검색…",
|
|
70
|
+
"attachments.library.table.tags": "태그",
|
|
71
|
+
"attachments.library.title": "첨부 파일",
|
|
72
|
+
"attachments.library.upload.assignments.add": "할당 추가",
|
|
73
|
+
"attachments.library.upload.assignments.description": "지금 이 파일을 기존 레코드에 연결하거나 나중에 추가할 수 있습니다.",
|
|
74
|
+
"attachments.library.upload.assignments.href": "링크",
|
|
75
|
+
"attachments.library.upload.assignments.id": "레코드 ID",
|
|
76
|
+
"attachments.library.upload.assignments.label": "라벨",
|
|
77
|
+
"attachments.library.upload.assignments.remove": "제거",
|
|
78
|
+
"attachments.library.upload.assignments.title": "할당",
|
|
79
|
+
"attachments.library.upload.assignments.type": "유형",
|
|
80
|
+
"attachments.library.upload.cancel": "취소",
|
|
81
|
+
"attachments.library.upload.choose": "파일 선택",
|
|
82
|
+
"attachments.library.upload.dropHint": "여기에 파일을 끌어다 놓거나 클릭하여 업로드하세요.",
|
|
83
|
+
"attachments.library.upload.failed": "업로드에 실패했습니다.",
|
|
84
|
+
"attachments.library.upload.file": "파일",
|
|
85
|
+
"attachments.library.upload.fileRequired": "업로드할 파일을 선택하세요.",
|
|
86
|
+
"attachments.library.upload.noFiles": "아직 선택된 파일이 없습니다.",
|
|
87
|
+
"attachments.library.upload.partition": "파티션",
|
|
88
|
+
"attachments.library.upload.partitionDefault": "기본값 (비공개)",
|
|
89
|
+
"attachments.library.upload.progressLabel": "파일 업로드 중",
|
|
90
|
+
"attachments.library.upload.saveFirst": "파일을 업로드하기 전에 레코드를 저장하세요.",
|
|
91
|
+
"attachments.library.upload.submit": "업로드",
|
|
92
|
+
"attachments.library.upload.submitting": "업로드 중…",
|
|
93
|
+
"attachments.library.upload.success": "첨부 파일이 업로드되었습니다.",
|
|
94
|
+
"attachments.library.upload.tagsPlaceholder": "태그 추가",
|
|
95
|
+
"attachments.library.upload.title": "첨부 파일 업로드",
|
|
96
|
+
"attachments.nav.group": "메디아",
|
|
97
|
+
"attachments.partitions.actions.add": "파티션 추가",
|
|
98
|
+
"attachments.partitions.actions.cancel": "취소",
|
|
99
|
+
"attachments.partitions.actions.create": "파티션 생성",
|
|
100
|
+
"attachments.partitions.actions.delete": "삭제",
|
|
101
|
+
"attachments.partitions.actions.edit": "편집",
|
|
102
|
+
"attachments.partitions.actions.refresh": "새로고침",
|
|
103
|
+
"attachments.partitions.actions.save": "변경 사항 저장",
|
|
104
|
+
"attachments.partitions.confirm.delete": "파티션 \"{{code}}\"을(를) 삭제하시겠습니까?",
|
|
105
|
+
"attachments.partitions.description": "업로드를 위한 저장소 파티션과 공개 범위를 정의합니다.",
|
|
106
|
+
"attachments.partitions.dialog.createDescription": "첨부 파일용 저장소 파티션을 정의합니다.",
|
|
107
|
+
"attachments.partitions.dialog.createTitle": "파티션 생성",
|
|
108
|
+
"attachments.partitions.dialog.editDescription": "파티션 메타데이터와 공개 범위를 업데이트합니다.",
|
|
109
|
+
"attachments.partitions.dialog.editTitle": "파티션 편집",
|
|
110
|
+
"attachments.partitions.errors.delete": "파티션 삭제에 실패했습니다.",
|
|
111
|
+
"attachments.partitions.errors.load": "파티션을 불러오지 못했습니다.",
|
|
112
|
+
"attachments.partitions.errors.required": "코드와 제목은 필수입니다.",
|
|
113
|
+
"attachments.partitions.errors.s3BucketRequired": "별도의 자격 증명 소스를 사용하는 경우 버킷이 필요합니다.",
|
|
114
|
+
"attachments.partitions.errors.s3Disabled": "이 파티션은 S3를 사용하지만 S3는 비활성화되어 있습니다. OM_ENABLE_STORAGE_S3=true로 설정하고 앱을 다시 시작하세요.",
|
|
115
|
+
"attachments.partitions.errors.s3EnvPrefixRequired": "별도의 자격 증명 소스를 사용하는 경우 자격 증명 env 접두사가 필요합니다.",
|
|
116
|
+
"attachments.partitions.errors.save": "파티션 저장에 실패했습니다.",
|
|
117
|
+
"attachments.partitions.form.codeLabel": "코드",
|
|
118
|
+
"attachments.partitions.form.codePlaceholder": "예: marketingAssets",
|
|
119
|
+
"attachments.partitions.form.descriptionLabel": "설명",
|
|
120
|
+
"attachments.partitions.form.descriptionPlaceholder": "이 파티션이 어떻게 사용되는지 설명하세요.",
|
|
121
|
+
"attachments.partitions.form.envKeyHelp": "저장소 경로를 재정의하려면 이 환경 변수를 설정하세요:",
|
|
122
|
+
"attachments.partitions.form.ocrLabel": "OCR/텍스트 추출 필요",
|
|
123
|
+
"attachments.partitions.form.ocrModelHelp": "이미지 및 PDF OCR에 사용할 LLM 모델을 선택하세요. OCR_MODEL 환경 변수 또는 gpt-4o로 대체됩니다. LLM OCR을 사용할 수 없으면 PDF는 순수 JS 텍스트 추출(pdfjs-dist)로, DOCX 파일은 순수 JS 추출(mammoth)로 대체됩니다.",
|
|
124
|
+
"attachments.partitions.form.ocrModelLabel": "OCR 모델",
|
|
125
|
+
"attachments.partitions.form.ocrModelOptions.default": "기본값 (환경에서)",
|
|
126
|
+
"attachments.partitions.form.ocrModelOptions.gpt-4o": "GPT-4o (권장)",
|
|
127
|
+
"attachments.partitions.form.ocrModelOptions.gpt-4o-mini": "GPT-4o Mini (더 빠르고 저렴함)",
|
|
128
|
+
"attachments.partitions.form.publicLabel": "공개 접근 가능",
|
|
129
|
+
"attachments.partitions.form.s3BucketLabel": "버킷",
|
|
130
|
+
"attachments.partitions.form.s3BucketOverrideLabel": "버킷 재정의 (선택 사항)",
|
|
131
|
+
"attachments.partitions.form.s3BucketOverridePlaceholder": "통합 버킷을 사용하려면 비워 두세요.",
|
|
132
|
+
"attachments.partitions.form.s3ConfigTitle": "S3 구성",
|
|
133
|
+
"attachments.partitions.form.s3CredsPrefixHelp": "환경 변수에서 {PREFIX}_ACCESS_KEY_ID 및 {PREFIX}_SECRET_ACCESS_KEY를 읽습니다.",
|
|
134
|
+
"attachments.partitions.form.s3CredsPrefixLabel": "자격 증명 환경 변수 접두사",
|
|
135
|
+
"attachments.partitions.form.s3CredsSourceEnv": "별도의 환경 기반 자격 증명 사용",
|
|
136
|
+
"attachments.partitions.form.s3CredsSourceEnvHelp": "이 파티션은 환경 변수에서 읽은 자체 자격 증명을 사용합니다. 통합 자격 증명은 무시됩니다. 버킷 및 자격 증명 접두사가 필요합니다.",
|
|
137
|
+
"attachments.partitions.form.s3CredsSourceIntegration": "Integration Marketplace 자격 증명 사용",
|
|
138
|
+
"attachments.partitions.form.s3CredsSourceIntegrationHelp": "이 파티션은 S3 통합에 구성된 자격 증명, 버킷, 지역 및 엔드포인트를 재사용합니다. 필요한 경우에만 아래의 개별 필드를 재정의하세요.",
|
|
139
|
+
"attachments.partitions.form.s3CredsSourceLabel": "자격 증명 소스",
|
|
140
|
+
"attachments.partitions.form.s3EndpointHelp": "AWS S3의 경우 비워두세요. MinIO, DigitalOcean Spaces 등에는 필수입니다.",
|
|
141
|
+
"attachments.partitions.form.s3EndpointLabel": "커스텀 엔드포인트",
|
|
142
|
+
"attachments.partitions.form.s3EndpointOverrideLabel": "커스텀 엔드포인트 재정의 (선택 사항)",
|
|
143
|
+
"attachments.partitions.form.s3EndpointOverridePlaceholder": "통합 엔드포인트를 사용하려면 비워 두세요.",
|
|
144
|
+
"attachments.partitions.form.s3ForcePathStyleLabel": "경로 스타일 강제 (MinIO에 필요)",
|
|
145
|
+
"attachments.partitions.form.s3RegionLabel": "리전",
|
|
146
|
+
"attachments.partitions.form.s3RegionOverrideLabel": "리전 재정의 (선택 사항)",
|
|
147
|
+
"attachments.partitions.form.s3RegionOverridePlaceholder": "통합 지역을 사용하려면 비워두세요.",
|
|
148
|
+
"attachments.partitions.form.storageDriverLabel": "저장소 드라이버",
|
|
149
|
+
"attachments.partitions.form.storageDriverS3DisabledHelp": "S3가 비활성화되었습니다. OM_ENABLE_STORAGE_S3=true로 설정하고 다시 시작하여 S3 파티션을 활성화합니다.",
|
|
150
|
+
"attachments.partitions.form.titleLabel": "제목",
|
|
151
|
+
"attachments.partitions.form.titlePlaceholder": "예: 마케팅 자산",
|
|
152
|
+
"attachments.partitions.locked.description": "데모 또는 온보딩 모드가 활성화된 동안 첨부 파일 파티션은 환경 기본값으로 관리됩니다.",
|
|
153
|
+
"attachments.partitions.locked.hint": "앱 내 구성을 다시 활성화하려면 아래 환경 변수를 업데이트하세요.",
|
|
154
|
+
"attachments.partitions.locked.title": "파티션 설정이 잠겨 있습니다",
|
|
155
|
+
"attachments.partitions.messages.created": "파티션이 생성되었습니다.",
|
|
156
|
+
"attachments.partitions.messages.deleted": "파티션이 제거되었습니다.",
|
|
157
|
+
"attachments.partitions.messages.updated": "파티션이 업데이트되었습니다.",
|
|
158
|
+
"attachments.partitions.nav.title": "첨부 파일",
|
|
159
|
+
"attachments.partitions.table.code": "코드",
|
|
160
|
+
"attachments.partitions.table.description": "설명",
|
|
161
|
+
"attachments.partitions.table.empty": "구성된 파티션이 없습니다.",
|
|
162
|
+
"attachments.partitions.table.envKey": "환경 변수",
|
|
163
|
+
"attachments.partitions.table.ocr": "OCR",
|
|
164
|
+
"attachments.partitions.table.private": "비공개",
|
|
165
|
+
"attachments.partitions.table.public": "공개",
|
|
166
|
+
"attachments.partitions.table.search": "파티션 검색…",
|
|
167
|
+
"attachments.partitions.table.storageDriver": "저장소",
|
|
168
|
+
"attachments.partitions.table.title": "제목",
|
|
169
|
+
"attachments.partitions.table.visibility": "공개 범위",
|
|
170
|
+
"attachments.partitions.title": "첨부 파일 파티션",
|
|
171
|
+
"attachments.storage.nav.title": "저장소"
|
|
172
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"audit_logs.access.columns.access": "접근",
|
|
3
|
+
"audit_logs.access.columns.fields": "필드",
|
|
4
|
+
"audit_logs.access.columns.organization": "조직",
|
|
5
|
+
"audit_logs.access.columns.resource": "리소스",
|
|
6
|
+
"audit_logs.access.columns.tenant": "테넌트",
|
|
7
|
+
"audit_logs.access.columns.user": "사용자",
|
|
8
|
+
"audit_logs.access.columns.when": "시간",
|
|
9
|
+
"audit_logs.access.title": "접근 로그",
|
|
10
|
+
"audit_logs.actions.columns.action": "작업",
|
|
11
|
+
"audit_logs.actions.columns.controls": "제어",
|
|
12
|
+
"audit_logs.actions.columns.organization": "조직",
|
|
13
|
+
"audit_logs.actions.columns.resource": "리소스",
|
|
14
|
+
"audit_logs.actions.columns.status": "상태",
|
|
15
|
+
"audit_logs.actions.columns.tenant": "테넌트",
|
|
16
|
+
"audit_logs.actions.columns.user": "사용자",
|
|
17
|
+
"audit_logs.actions.columns.when": "시간",
|
|
18
|
+
"audit_logs.actions.details.after": "이후",
|
|
19
|
+
"audit_logs.actions.details.before": "이전",
|
|
20
|
+
"audit_logs.actions.details.changed_fields": "변경된 필드",
|
|
21
|
+
"audit_logs.actions.details.close": "상세 정보 닫기",
|
|
22
|
+
"audit_logs.actions.details.context": "컨텍스트",
|
|
23
|
+
"audit_logs.actions.details.field": "필드",
|
|
24
|
+
"audit_logs.actions.details.no_changes": "추적된 필드 변경 사항 없음",
|
|
25
|
+
"audit_logs.actions.details.snapshot_after": "변경 후 스냅샷",
|
|
26
|
+
"audit_logs.actions.details.snapshot_before": "변경 전 스냅샷",
|
|
27
|
+
"audit_logs.actions.details.title": "작업 상세 정보",
|
|
28
|
+
"audit_logs.actions.redo": "마지막 작업 다시 실행",
|
|
29
|
+
"audit_logs.actions.title": "작업 로그",
|
|
30
|
+
"audit_logs.actions.undo": "마지막 작업 실행 취소",
|
|
31
|
+
"audit_logs.actions.undoing": "실행 취소 중…",
|
|
32
|
+
"audit_logs.banner.last_operation": "마지막 작업:",
|
|
33
|
+
"audit_logs.banner.undo": "실행 취소",
|
|
34
|
+
"audit_logs.banner.undo_error": "실행 취소 실패",
|
|
35
|
+
"audit_logs.banner.undo_success": "작업이 실행 취소되었습니다",
|
|
36
|
+
"audit_logs.common.loading": "불러오는 중…",
|
|
37
|
+
"audit_logs.common.none": "—",
|
|
38
|
+
"audit_logs.common.refresh": "새로고침",
|
|
39
|
+
"audit_logs.common.refreshing": "새로고침 중…",
|
|
40
|
+
"audit_logs.error.load": "감사 로그를 불러오지 못했습니다",
|
|
41
|
+
"audit_logs.error.redo": "작업을 다시 실행할 수 없습니다",
|
|
42
|
+
"audit_logs.error.undo": "작업을 실행 취소할 수 없습니다",
|
|
43
|
+
"audit_logs.filters.undoable_only": "실행 취소 가능한 항목만",
|
|
44
|
+
"audit_logs.hint.view_self_only": "본인의 변경 사항만 표시됩니다. 더 넓은 범위의 접근이 필요하면 관리자에게 문의하세요.",
|
|
45
|
+
"audit_logs.nav.title": "감사 로그",
|
|
46
|
+
"audit_logs.tabs.label": "감사 로그 보기",
|
|
47
|
+
"audit_logs.version_history.action.redo": "{action} 다시 실행",
|
|
48
|
+
"audit_logs.version_history.action.undo": "{action} 실행 취소",
|
|
49
|
+
"audit_logs.version_history.close": "닫기",
|
|
50
|
+
"audit_logs.version_history.detail.action": "작업",
|
|
51
|
+
"audit_logs.version_history.detail.actor": "변경한 사람",
|
|
52
|
+
"audit_logs.version_history.detail.back": "뒤로",
|
|
53
|
+
"audit_logs.version_history.detail.date": "날짜",
|
|
54
|
+
"audit_logs.version_history.detail.status": "상태",
|
|
55
|
+
"audit_logs.version_history.detail.title": "변경 상세 정보",
|
|
56
|
+
"audit_logs.version_history.empty": "기록된 변경 사항 없음",
|
|
57
|
+
"audit_logs.version_history.error": "버전 기록을 불러오지 못했습니다",
|
|
58
|
+
"audit_logs.version_history.load_more": "더 보기",
|
|
59
|
+
"audit_logs.version_history.loading": "기록을 불러오는 중…",
|
|
60
|
+
"audit_logs.version_history.show_related": "관련 변경 사항 표시",
|
|
61
|
+
"audit_logs.version_history.status.done": "완료",
|
|
62
|
+
"audit_logs.version_history.status.failed": "실패",
|
|
63
|
+
"audit_logs.version_history.status.redone": "다시 실행됨",
|
|
64
|
+
"audit_logs.version_history.status.undone": "실행 취소됨",
|
|
65
|
+
"audit_logs.version_history.title": "버전 기록"
|
|
66
|
+
}
|
|
@@ -65,7 +65,7 @@ export function UserConsentsPanel({ userId }: UserConsentsPanelProps) {
|
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
if (error) {
|
|
68
|
-
return <p className="text-sm text-
|
|
68
|
+
return <p className="text-sm text-status-error-text">{error}</p>
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
if (consents.length === 0) {
|
|
@@ -86,15 +86,15 @@ export function UserConsentsPanel({ userId }: UserConsentsPanelProps) {
|
|
|
86
86
|
<span className="flex items-center gap-1.5">
|
|
87
87
|
{consent.isGranted ? (
|
|
88
88
|
<>
|
|
89
|
-
<ShieldCheck className="size-4 text-
|
|
90
|
-
<span className="text-
|
|
89
|
+
<ShieldCheck className="size-4 text-status-success-icon" />
|
|
90
|
+
<span className="text-status-success-text font-medium">
|
|
91
91
|
{t('auth.users.consents.granted', 'Granted')}
|
|
92
92
|
</span>
|
|
93
93
|
</>
|
|
94
94
|
) : (
|
|
95
95
|
<>
|
|
96
|
-
<ShieldX className="size-4 text-
|
|
97
|
-
<span className="text-
|
|
96
|
+
<ShieldX className="size-4 text-status-error-icon" />
|
|
97
|
+
<span className="text-status-error-text font-medium">
|
|
98
98
|
{t('auth.users.consents.withdrawn', 'Withdrawn')}
|
|
99
99
|
</span>
|
|
100
100
|
</>
|
|
@@ -118,13 +118,13 @@ export function UserConsentsPanel({ userId }: UserConsentsPanelProps) {
|
|
|
118
118
|
<dd className="flex items-center gap-1">
|
|
119
119
|
{consent.integrityValid ? (
|
|
120
120
|
<>
|
|
121
|
-
<ShieldCheck className="size-3 text-
|
|
122
|
-
<span className="text-
|
|
121
|
+
<ShieldCheck className="size-3 text-status-success-icon" />
|
|
122
|
+
<span className="text-status-success-text">{t('auth.users.consents.integrityValid', 'Valid')}</span>
|
|
123
123
|
</>
|
|
124
124
|
) : (
|
|
125
125
|
<>
|
|
126
|
-
<ShieldAlert className="size-3 text-
|
|
127
|
-
<span className="text-
|
|
126
|
+
<ShieldAlert className="size-3 text-status-warning-icon" />
|
|
127
|
+
<span className="text-status-warning-text">{t('auth.users.consents.integrityInvalid', 'Tampered or missing')}</span>
|
|
128
128
|
</>
|
|
129
129
|
)}
|
|
130
130
|
</dd>
|
|
@@ -56,11 +56,11 @@ export default function ResetPage() {
|
|
|
56
56
|
</div>
|
|
57
57
|
) : (
|
|
58
58
|
<form className="grid gap-3" onSubmit={onSubmit} noValidate>
|
|
59
|
-
{error && <div className="text-sm text-
|
|
59
|
+
{error && <div className="text-sm text-status-error-text">{error}</div>}
|
|
60
60
|
<div className="grid gap-1">
|
|
61
61
|
<Label htmlFor="email">{t('auth.email')}</Label>
|
|
62
62
|
<EmailInput id="email" name="email" required aria-invalid={!!fieldError} aria-describedby={fieldError ? 'email-error' : undefined} />
|
|
63
|
-
{fieldError && <p id="email-error" className="text-sm text-
|
|
63
|
+
{fieldError && <p id="email-error" className="text-sm text-status-error-text">{fieldError}</p>}
|
|
64
64
|
</div>
|
|
65
65
|
<Button type="submit" className="mt-2 w-full" disabled={submitting}>
|
|
66
66
|
{submitting ? '...' : t('auth.sendResetLink')}
|