From 4ce12f81d988c1d85d80045a0d7f92238e858cba Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 3 Jul 2025 17:04:34 +0300 Subject: [PATCH 001/240] #7004 Presets: integrate presets into creator Fixes #7004 --- .../src/entries/presets.ts | 1 + .../src/presets/presets-plugin.ts | 23 +++ packages/survey-creator-react/index.html | 1 + packages/survey-creator-react/index.js | 157 ++++----------- packages/survey-creator-react/package.json | 1 + .../src/entries/presets.ts | 1 + .../src/presets/Presets.tsx | 47 +++++ .../tsconfig.presets.json | 13 ++ .../webpack.presets.config.js | 183 ++++++++++++++++++ 9 files changed, 305 insertions(+), 122 deletions(-) create mode 100644 packages/survey-creator-core/src/presets/presets-plugin.ts create mode 100644 packages/survey-creator-react/src/entries/presets.ts create mode 100644 packages/survey-creator-react/src/presets/Presets.tsx create mode 100644 packages/survey-creator-react/tsconfig.presets.json create mode 100644 packages/survey-creator-react/webpack.presets.config.js diff --git a/packages/survey-creator-core/src/entries/presets.ts b/packages/survey-creator-core/src/entries/presets.ts index a97a9f9921..5212e3f288 100644 --- a/packages/survey-creator-core/src/entries/presets.ts +++ b/packages/survey-creator-core/src/entries/presets.ts @@ -3,6 +3,7 @@ // export * from "../presets/presets-toolbox"; export * from "../presets/presets-editable-toolbox"; export * from "../presets/presets-editor"; +export * from "../presets/presets-plugin"; export * from "../presets/presets-editable-languages"; export * from "../presets/presets-editable-tabs"; export * from "../presets/presets-editable-base"; diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts new file mode 100644 index 0000000000..640983bdcc --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -0,0 +1,23 @@ +import { Base, SurveyModel, Action, ComputedUpdater, CurrentPageChangedEvent, PageVisibleChangedEvent, QuestionDropdownModel, ActionContainer } from "survey-core"; +import { ICreatorPlugin, SurveyCreatorModel } from "survey-creator-core"; +import { CreatorPresetEditorModel } from "./presets-editor"; + +export class TabPresetsPlugin implements ICreatorPlugin { + public model: CreatorPresetEditorModel | undefined; + public static iconName = "icon-settings"; + constructor(private creator: SurveyCreatorModel) { + creator.addTab({ name: "presets", plugin: this, iconName: TabPresetsPlugin.iconName }); + } + + public activate(): void { + this.model = new CreatorPresetEditorModel(); + } + + public deactivate(): boolean { + if (this.model) { + this.model.dispose(); + } + this.model = undefined; + return true; + } +} \ No newline at end of file diff --git a/packages/survey-creator-react/index.html b/packages/survey-creator-react/index.html index ffceabd692..d13df18b56 100644 --- a/packages/survey-creator-react/index.html +++ b/packages/survey-creator-react/index.html @@ -22,6 +22,7 @@ + diff --git a/packages/survey-creator-react/index.js b/packages/survey-creator-react/index.js index 14faf74667..83b5714881 100644 --- a/packages/survey-creator-react/index.js +++ b/packages/survey-creator-react/index.js @@ -2,101 +2,41 @@ Survey.ComponentCollection.Instance.add({ name: "newrating", title: "SuperRating Survey.ComponentCollection.Instance.add({ name: "d2", title: "DDD", questionJSON: { "type": "dropdown", "name": "superrating", "title": "1", "isRequired": true, choices: [1, 2, 3] } }); let json = { - completedHtml: - "

Thank you for your feedback.

Your thoughts and ideas will help us to create a great product!
", - completedHtmlOnCondition: [ + "pages": [ { - expression: "{nps_score} > 8", - html: - "

Thank you for your feedback.

We glad that you love our product. Your ideas and suggestions will help us to make our product even better!
" - }, - { - expression: "{nps_score} < 7", - html: - "

Thank you for your feedback.

We are glad that you share with us your ideas.We highly value all suggestions from our customers. We do our best to improve the product and reach your expectation.

" - } - ], - pages: [ - { - name: "page1", - title: "page1 -- title", - description: "page1 -- description", - elements: [ + "name": "page1", + "elements": [ { - type: "rating", - name: "nps_score", - title: - "On a scale of zero to ten, how likely are you to recommend our product to a friend or colleague?", - isRequired: true, - rateMin: 0, - rateMax: 10, - minRateDescription: "(Most unlikely)", - maxRateDescription: "(Most likely)" - }, - { - type: "checkbox", - name: "promoter_features", - visibleIf: "{nps_score} >= 9", - title: "What features do you value the most?", - isRequired: true, - validators: [ + "type": "panel", + "name": "panel1", + "questionTitleWidth": "200px", + "questionTitleLocation": "left", + "elements": [ + { + "type": "rating", + "name": "question1", + "title": "Organization", + "rateType": "stars" + }, + { + "type": "rating", + "name": "question2", + "title": "Service", + "rateType": "stars" + }, + { + "type": "rating", + "name": "question3", + "title": "Ambiance", + "rateType": "stars" + }, { - type: "answercount", - text: "Please select two features maximum.", - maxCount: 2 + "type": "rating", + "name": "question4", + "title": "Concert", + "rateType": "stars" } - ], - hasOther: true, - choices: [ - "Performance", - "Stability", - "User Interface", - "Complete Functionality" - ], - otherText: "Other feature:", - colCount: 2 - }, - { - type: "comment", - name: "passive_experience", - visibleIf: "{nps_score} > 6 and {nps_score} < 9", - title: "What is the primary reason for your score?" - }, - { - type: "comment", - name: "disappointed_experience", - visibleIf: "{nps_score} notempty", - title: - "What do you miss and what was disappointing in your experience with us?" - } - ] - }, - { - name: "page2", - elements: [ - { - type: "checkbox", - name: "question4", - choices: ["item1", "item2", "item3"] - } - ] - }, - { - name: "page3", - elements: [ - { - type: "dropdown", - name: "question5", - choices: ["item1", "item2", "item3"] - } - ] - }, - { - name: "page4", - elements: [ - { - type: "rating", - name: "question6" + ] } ] } @@ -222,6 +162,7 @@ creator.onDefineElementMenuItems.add((_, options) => { } }); }); +creator.JSON = json; function getCompositeInput(question) { return question.contentPanel.getQuestionByName("q1"); @@ -291,37 +232,9 @@ creator.saveSurveyFunc = (no, callback) => { }, 1000); }; -// const editor = new SurveyCreatorCorePresets.CreatorPresetEditorModel(); -// window.editor = editor; -// class PresetsTabComponent extends React.Component { -// render() { -// return ( -// -// ); -// } -// } - -// const presetsPlugin = { -// // Do nothing when the tab is activated or deactivated -// activate: () => { }, -// deactivate: () => { return true; } -// }; - -// SurveyReact.ReactElementFactory.Instance.registerElement( -// "svc-tab-presets", -// (props) => { -// return React.createElement(PresetsTabComponent, props); -// } -// ); -// creator.addTab({ -// name: "presets", -// plugin: presetsPlugin, -// title: "Presets", -// componentName: "svc-tab-presets", -// index: 100 -// }); - - +if(window.SurveyCreatorCorePresets) { + window.editor = new SurveyCreatorCorePresets.TabPresetsPlugin(creator); +} ReactDOM.render( diff --git a/packages/survey-creator-react/package.json b/packages/survey-creator-react/package.json index eb21b7bacf..cbcf02e041 100644 --- a/packages/survey-creator-react/package.json +++ b/packages/survey-creator-react/package.json @@ -31,6 +31,7 @@ "release": "standard-version --message \"Release: %s [azurepipelines skip]\"", "remove-package-lock": "rimraf package-lock.json", "build": "webpack --env buildType=dev --env emitDeclarations --env emitNonSourceFiles && webpack --env buildType=prod && rollup -c", + "build:presets": "webpack --config ./webpack.presets.config.js --env buildType=dev --env emitDeclarations && webpack --config ./webpack.presets.config.js --env buildType=prod", "watch:dev": "concurrently \"webpack --env buildType=dev --watch --env emitDeclarations --env emitStyles\" \"rollup -c -w\" ", "watch:prod": "webpack --env buildType=prod --watch", "lint": "eslint . --max-warnings=0", diff --git a/packages/survey-creator-react/src/entries/presets.ts b/packages/survey-creator-react/src/entries/presets.ts new file mode 100644 index 0000000000..443023257d --- /dev/null +++ b/packages/survey-creator-react/src/entries/presets.ts @@ -0,0 +1 @@ +export { TabPresetsComponent } from "../presets/Presets"; \ No newline at end of file diff --git a/packages/survey-creator-react/src/presets/Presets.tsx b/packages/survey-creator-react/src/presets/Presets.tsx new file mode 100644 index 0000000000..3a49dc3be2 --- /dev/null +++ b/packages/survey-creator-react/src/presets/Presets.tsx @@ -0,0 +1,47 @@ +import * as React from "react"; +import { Base, SurveyModel, PageModel } from "survey-core"; +import { + ReactElementFactory, + Survey, + SurveyElementBase, +} from "survey-react-ui"; +import { SurveyCreatorModel } from "survey-creator-core"; +interface ITabPresetsComponentProps { + data: any; + creator: SurveyCreatorModel; +} + +export class TabPresetsComponent extends SurveyElementBase { + private get model(): SurveyModel { + return this.props.data.model; + } + protected get creator(): SurveyCreatorModel { + return this.props.creator; + } + + protected getStateElements(): Array { + return [this.model, this.creator]; + } + + renderElement(): React.JSX.Element { + const presetsTabClassName = "svc-tab-designer "; + + return ( + +
+ {this.creator.showToolbox ? ReactElementFactory.Instance.createElement("svc-toolbox", { model: this.creator }) : null} +
+
+ +
+
+ ); + } +} + +ReactElementFactory.Instance.registerElement("svc-tab-presets", (props) => { + return React.createElement( + TabPresetsComponent, + props as ITabPresetsComponentProps + ); +}); diff --git a/packages/survey-creator-react/tsconfig.presets.json b/packages/survey-creator-react/tsconfig.presets.json new file mode 100644 index 0000000000..979ad924c8 --- /dev/null +++ b/packages/survey-creator-react/tsconfig.presets.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "paths": { + "survey-creator-core": [ + "./build" + ] + } + }, + "include": [ + "./src/entries/presets.ts" + ] +} \ No newline at end of file diff --git a/packages/survey-creator-react/webpack.presets.config.js b/packages/survey-creator-react/webpack.presets.config.js new file mode 100644 index 0000000000..2777ed093b --- /dev/null +++ b/packages/survey-creator-react/webpack.presets.config.js @@ -0,0 +1,183 @@ +"use strict"; + +const webpack = require("webpack"); +const path = require("path"); +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); +const TsconfigPathsPlugin = require("tsconfig-paths-webpack-plugin"); +const HtmlWebpackPlugin = require("html-webpack-plugin"); +var DashedNamePlugin = require("../../webpack-dashed-name"); +const packageJson = require("./package.json"); +const fs = require("fs"); + +const year = new Date().getFullYear(); +const banner = [ + "SurveyJS Creator Presets React v" + packageJson.version, + "(c) 2015-" + year + " Devsoft Baltic OÜ - http://surveyjs.io/", + "Github: https://github.com/surveyjs/survey-creator", + "License: https://surveyjs.io/Licenses#SurveyCreator" +].join("\n"); + +module.exports = function (options) { + const buildPath = __dirname + "/build/"; + const isProductionBuild = options.buildType === "prod"; + const emitDeclarations = !!options.emitDeclarations; + const emitNonSourceFiles = !!options.emitNonSourceFiles; + + const compilerOptions = emitDeclarations ? {} : { + declaration: false, + declarationDir: null + }; + + const config = { + mode: isProductionBuild ? "production" : "development", + entry: { + "survey-creator-react-presets": path.resolve(__dirname, "./src/entries/presets.ts") + }, + resolve: { + extensions: [".ts", ".js", ".tsx", ".scss"], + plugins: [new TsconfigPathsPlugin({ configFile: "./tsconfig.json" })], + alias: { + tslib: path.join(__dirname, "./src/entries/helpers.ts") + } + }, + optimization: { + minimize: isProductionBuild + }, + module: { + rules: [ + { + test: /\.(ts|tsx)$/, + loader: "ts-loader", + options: { + configFile: options.tsConfigFile || "tsconfig.json", + compilerOptions + } + }, + { + test: /\.s(c|a)ss$/, + use: [ + MiniCssExtractPlugin.loader, + { + loader: "css-loader", + options: { + sourceMap: options.buildType !== "prod" + } + }, + { + loader: "sass-loader", + options: { + sourceMap: options.buildType !== "prod" + } + } + ] + }, + { + test: /\.html$/, + exclude: [/node_modules/, require.resolve("./index.html")], + loader: "html-loader" + }, + { + test: /\.(svg|png)$/, + use: { + loader: "url-loader", + options: {} + } + } + ] + }, + output: { + path: buildPath, + filename: "[name]" + (isProductionBuild ? ".min" : "") + ".js", + library: { + root: options.libraryName || "SurveyCreator", + amd: "[dashedname]", + commonjs: "[dashedname]", + }, + libraryTarget: "umd", + globalObject: "this", + umdNamedDefine: true + }, + externals: { + react: { + root: "React", + commonjs2: "react", + commonjs: "react", + amd: "react" + }, + "react-dom": { + root: "ReactDOM", + commonjs2: "react-dom", + commonjs: "react-dom", + amd: "react-dom" + }, + "survey-core": { + root: "Survey", + commonjs2: "survey-core", + commonjs: "survey-core", + amd: "survey-core" + }, + "survey-react-ui": { + root: "SurveyReact", + commonjs2: "survey-react-ui", + commonjs: "survey-react-ui", + amd: "survey-react-ui" + }, + "survey-creator-core": { + root: "SurveyCreatorCore", + commonjs2: "survey-creator-core", + commonjs: "survey-creator-core", + amd: "survey-creator-core" + }, + "survey-creator-core-presets": { + root: "SurveyCreatorCorePresets", + commonjs2: "survey-creator-core-presets", + commonjs: "survey-creator-core-presets", + amd: "survey-creator-core-presets" + }, + "survey-creator-react": { + root: "SurveyCreatorReact", + commonjs2: "survey-creator-react", + commonjs: "survey-creator-react", + amd: "survey-creator-react" + } + + }, + plugins: [ + new DashedNamePlugin(), + new webpack.DefinePlugin({ + "process.env.ENVIRONMENT": JSON.stringify(options.buildType), + "process.env.VERSION": JSON.stringify(packageJson.version) + }), + new MiniCssExtractPlugin({ + filename: isProductionBuild ? "[name].min.css" : "[name].css" + }), + new webpack.BannerPlugin({ + banner: banner + }) + ] + }; + + if (isProductionBuild) { + config.plugins.push = config.plugins.concat([]); + } else { + config.devtool = "source-map"; + config.plugins = config.plugins.concat([ + new webpack.LoaderOptionsPlugin({ debug: true }), + new HtmlWebpackPlugin({ + filename: "index.html", + inject: "body", + template: "index.html" + }), + ]); + config.devServer = { + static: { + directory: path.join(__dirname, "."), + }, + //host: "0.0.0.0", + compress: false, + port: 8082 + }; + } + + return config; +}; From ce89890ddf8f97c5cb9881a2172818fa3d849f56 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 3 Jul 2025 17:29:36 +0300 Subject: [PATCH 002/240] #7004 - do not recreate creator --- .../survey-creator-core/src/presets/presets-editor.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 360d34d553..a6583b5692 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -253,11 +253,11 @@ preset.apply(creator); } public applyFromSurveyModel(reCreateCretor: boolean = true): boolean { if (!this.validateEditableModel(this.model)) return false; - if (reCreateCretor) { - const json = this.creator?.JSON || {}; - this.creatorValue = this.createCreator({}); - this.creator.JSON = json; - } + // if (reCreateCretor) { + // const json = this.creator?.JSON || {}; + // this.creatorValue = this.createCreator({}); + // this.creator.JSON = json; + // } this.preset.setJson(this.getJsonFromSurveyModel()); this.model.setValue("json_result", JSON.stringify(this.preset.getJson(), null, 2)); this.preset.apply(this.creator); From 47b501256c1d61bcae7f6bc349290896814901c6 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 4 Jul 2025 19:11:44 +0300 Subject: [PATCH 003/240] #7004 Presets: integrate presets into creator Fixes #7004 --- .../src/presets-creator/presets.ts | 4 +++- .../src/presets/presets-editor.ts | 18 ++++++++++++++---- .../src/presets/presets-plugin.ts | 2 +- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/survey-creator-core/src/presets-creator/presets.ts b/packages/survey-creator-core/src/presets-creator/presets.ts index ab22952e27..60dac91f00 100644 --- a/packages/survey-creator-core/src/presets-creator/presets.ts +++ b/packages/survey-creator-core/src/presets-creator/presets.ts @@ -54,7 +54,9 @@ export class CreatorPreset extends CreatorPresetBase { } } protected createPresets(): Array { - return [new CreatorPresetLanguages(), new CreatorPresetTabs(), new CreatorPresetToolbox(), + // return [new CreatorPresetLanguages(), new CreatorPresetTabs(), new CreatorPresetToolbox(), + // new CreatorPresetPropertyGrid()]; + return [new CreatorPresetToolbox(), new CreatorPresetPropertyGrid()]; } } \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index a6583b5692..7e66317e39 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -28,16 +28,15 @@ export class NavigationBar extends ActionContainer { export class CreatorPresetEditorModel extends Base implements ICreatorPresetEditorSetup { private presetValue: CreatorPreset; - private creatorValue: SurveyCreatorModel; private modelValue: SurveyModel; private resultModelValue: SurveyModel; private navigationBarValue: NavigationBar; public locTitle: LocalizableString; - constructor(json?: ICreatorPresetData) { + constructor(json?: ICreatorPresetData, private creatorValue?: SurveyCreatorModel) { super(); editorLocalization.presetStrings = undefined; this.presetValue = new CreatorPreset(json); - this.creatorValue = this.createCreator({}); + if (!this.creatorValue)this.creatorValue = this.createCreator({}); this.modelValue = this.createModel(); this.resultModelValue = this.createResultModel(); this.locTitle = new LocalizableString(undefined, false); @@ -51,7 +50,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit } public dispose(): void { super.dispose(); - this.creator.dispose(); + //this.creator.dispose(); this.disposeModel(); } private disposeModel(): void { @@ -126,6 +125,17 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit model.currentPageNo = 0; } }; + + model.addNavigationItem({ + id: "apply-settings", + title: "Apply", + action: () => { + this.applyFromSurveyModel(); + }, + css: "nav-button", + innerCss: "sd-btn" + }); + editablePresets.forEach(item => item.setupQuestions(model, this)); const json = this.preset.getJson() || {}; editablePresets.forEach(item => item.setupQuestionsValue(model, json[item.path], this.creator)); diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 640983bdcc..7872bd495c 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -10,7 +10,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { } public activate(): void { - this.model = new CreatorPresetEditorModel(); + this.model = new CreatorPresetEditorModel({}, this.creator); } public deactivate(): boolean { From a8fd1e00e5b61e3c22f09d09f3e909e7a58ad256 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 7 Jul 2025 18:17:02 +0300 Subject: [PATCH 004/240] #7004 Presets: integrate presets into creator Fixes #7004 --- .../src/components/tabs/designer-plugin.ts | 263 ++++++++++-------- .../src/presets/presets-plugin.ts | 37 ++- 2 files changed, 175 insertions(+), 125 deletions(-) diff --git a/packages/survey-creator-core/src/components/tabs/designer-plugin.ts b/packages/survey-creator-core/src/components/tabs/designer-plugin.ts index 58a0320c26..a6c240c885 100644 --- a/packages/survey-creator-core/src/components/tabs/designer-plugin.ts +++ b/packages/survey-creator-core/src/components/tabs/designer-plugin.ts @@ -15,12 +15,145 @@ import { CreatorThemeModel } from "../../creator-theme/creator-theme-model"; import { ICreatorTheme, PredefinedCreatorThemes } from "../../creator-theme/creator-themes"; import { getPredefinedBackgoundColorsChoices, getPredefinedColorsItemValues } from "./themes"; -export class TabDesignerPlugin implements ICreatorPlugin { - public model: TabDesignerViewModel; +export class TabDesignerPluginBase implements ICreatorPlugin { + constructor(protected creator: SurveyCreatorModel) { + this.tabControlModel = new TabControlModel(this.creator.sidebar); + this.tabControlModel.onTopToolbarItemCreated = (bar) => { + this.setupPropertyGridTabActions(bar); + }; + this.propertyGrid = new PropertyGridModel(undefined, creator, creator.getPropertyGridDefinition()); + this.showOneCategoryInPropertyGrid = creator.showOneCategoryInPropertyGrid; + this.propertyGrid.showOneCategoryInPropertyGrid = this.showOneCategoryInPropertyGrid; + this.propertyGrid.obj = creator.survey; + this.propertyGridViewModel = new PropertyGridViewModel(this.propertyGrid, creator); + this.propertyGridViewModel.onNewSurveyCreatedCallback = () => { + this.updateTabControlActions(); + }; + + } + activate() {} + model: Base; public propertyGridViewModel: PropertyGridViewModel; - private propertyGrid: PropertyGridModel; - private _showOneCategoryInPropertyGrid: boolean = true; - private propertyGridTab: SidebarPageModel; + protected propertyGrid: PropertyGridModel; + protected _showOneCategoryInPropertyGrid: boolean = true; + protected propertyGridTab: SidebarPageModel; + protected tabControlModel: TabControlModel; + + protected get activePageIsPropertyGrid(): boolean { + return this.creator.sidebar.activePage === this.propertyGridTab.id; + } + protected updateActivePage() { + this.creator.sidebar.activePage = this.propertyGridTab.id; + } + protected updateTabControl() { + if (this.showOneCategoryInPropertyGrid) { + this.creator.sidebar.sideAreaComponentName = "svc-tab-control"; + this.creator.sidebar.sideAreaComponentData = this.tabControlModel; + } else { + this.propertyGridViewModel.objectSelectionAction.tooltip = ""; + this.creator.sidebar.sideAreaComponentName = ""; + this.creator.sidebar.sideAreaComponentData = undefined; + } + } + public get showOneCategoryInPropertyGrid(): boolean { + return this._showOneCategoryInPropertyGrid; + } + public set showOneCategoryInPropertyGrid(newValue) { + if (this._showOneCategoryInPropertyGrid !== newValue) { + this._showOneCategoryInPropertyGrid = newValue; + this.creator.sidebar.hideSideBarVisibilityControlActions = newValue; + this.propertyGrid.showOneCategoryInPropertyGrid = newValue; + this.propertyGrid["setObj"](this.creator.selectedElement); + if (this.creator.activeTab === "designer") { + this.updateActivePage(); + this.updateTabControl(); + } + } + } + protected updateHeaderComponent() { + if (this.showOneCategoryInPropertyGrid) { + this.creator.sidebar.header.componentName = "svc-side-bar-header"; + this.creator.sidebar.header.componentData = this.creator.sidebar.header; + } else { + this.creator.sidebar.header.componentName = ""; + this.creator.sidebar.header.componentData = undefined; + } + } + + protected setActivePage(id: string): void { + this.creator.sidebar.activePage = id; + this.updateHeaderComponent(); + } + + protected setPropertyGridIsActivePage() { + this.setActivePage(this.propertyGridTab.id); + } + protected updateTabControlActions() { + if (this.showOneCategoryInPropertyGrid) { + if (this.tabControlModel.isTopToolbarCreated) { + this.setupPropertyGridTabActions(this.tabControlModel.topToolbar); + } + this.propertyGrid.survey.onCurrentPageChanged.add((sender: SurveyModel, options: CurrentPageChangedEvent) => { + const pgTabs = this.tabControlModel.topToolbar.actions; + pgTabs.forEach(action => { + action.active = action.id === options.newCurrentPage.name; + }); + this.propertyGridViewModel.objectSelectionAction.title = options.newCurrentPage.title; + }); + this.propertyGrid.survey.onPageVisibleChanged.add((sender: SurveyModel, options: PageVisibleChangedEvent) => { + const action = this.tabControlModel.topToolbar.getActionById(options.page.name); + if (!!action) { + action.visible = options.page.isVisible; + } + }); + + this.propertyGridViewModel.objectSelectionAction.title = this.propertyGrid.survey.currentPage?.title; + } + } + protected setupPropertyGridTabActions(topToolbar: ActionContainer) { + const pgTabs = this.getPropertyGridTabActions(); + topToolbar.setItems(pgTabs); + this.propertyGridTab.activateCallback = () => { + if (!this.propertyGrid.survey.currentPage) return; + + pgTabs.forEach(action => { + action.active = action.id === this.propertyGrid.survey.currentPage.name; + }); + }; + this.propertyGridTab.deactivateCallback = () => { + pgTabs.forEach(tab => tab.active = false); + }; + } + protected getPropertyGridTabActions() { + const pgTabs = []; + this.propertyGrid.survey.pages.forEach(p => { + if (p.elements.length === 0) return; + + const action = new MenuButton({ + id: p.name, + tooltip: p.title, + iconName: p["iconName"], + iconSize: "auto", + active: this.activePageIsPropertyGrid && p.name === this.propertyGrid.survey.currentPage.name, + pressed: false, + visible: p.isVisible, + action: () => { + this.creator.sidebar.expandSidebar(); + this.setPropertyGridIsActivePage(); + this.propertyGrid.survey.currentPage = p; + pgTabs.forEach(i => i.active = false); + action.active = true; + } + }); + pgTabs.push(action); + }); + return pgTabs; + } + +} + +export class TabDesignerPlugin extends TabDesignerPluginBase { + public model: TabDesignerViewModel; private toolboxTab: SidebarPageModel; private propertyGridPlaceholderPage: SidebarPageModel; private themeModel: CreatorThemeModel; @@ -31,7 +164,6 @@ export class TabDesignerPlugin implements ICreatorPlugin { public previewAction: Action; private designerAction: Action; public designerStateManager: DesignerStateManager; - private tabControlModel: TabControlModel; private prevActivePage: string; public static iconName = "icon-config"; @@ -45,9 +177,6 @@ export class TabDesignerPlugin implements ICreatorPlugin { this.isSurveySelected, activePage !== this.propertyGridPlaceholderPage.id); } - private get activePageIsPropertyGrid(): boolean { - return this.creator.sidebar.activePage === this.propertyGridTab.id; - } private createSelectedUpdater() { return new ComputedUpdater(() => { return this.isSettingsActive; @@ -58,18 +187,8 @@ export class TabDesignerPlugin implements ICreatorPlugin { return this.creator.activeTab === "designer"; }); } - private updateTabControl() { - if (this.showOneCategoryInPropertyGrid) { - this.creator.sidebar.sideAreaComponentName = "svc-tab-control"; - this.creator.sidebar.sideAreaComponentData = this.tabControlModel; - } else { - this.propertyGridViewModel.objectSelectionAction.tooltip = ""; - this.creator.sidebar.sideAreaComponentName = ""; - this.creator.sidebar.sideAreaComponentData = undefined; - } - } - private updateHeaderComponent() { + protected updateHeaderComponent() { const activePage = this.creator.sidebar.activePage; if (this.showOneCategoryInPropertyGrid && this.activePageIsPropertyGrid) { this.creator.sidebar.header.componentName = "svc-side-bar-property-grid-header"; @@ -85,7 +204,7 @@ export class TabDesignerPlugin implements ICreatorPlugin { } } - private updateActivePage() { + protected updateActivePage() { if (this.showOneCategoryInPropertyGrid) { this.setActivePage(this.creator.survey.pageCount ? this.propertyGridTab.id : this.propertyGridPlaceholderPage.id); } else { @@ -93,31 +212,6 @@ export class TabDesignerPlugin implements ICreatorPlugin { } } - private setPropertyGridIsActivePage() { - this.setActivePage(this.propertyGridTab.id); - } - - private setActivePage(id: string): void { - this.creator.sidebar.activePage = id; - this.updateHeaderComponent(); - } - - public get showOneCategoryInPropertyGrid(): boolean { - return this._showOneCategoryInPropertyGrid; - } - public set showOneCategoryInPropertyGrid(newValue) { - if (this._showOneCategoryInPropertyGrid !== newValue) { - this._showOneCategoryInPropertyGrid = newValue; - this.creator.sidebar.hideSideBarVisibilityControlActions = newValue; - this.propertyGrid.showOneCategoryInPropertyGrid = newValue; - this.propertyGrid["setObj"](this.creator.selectedElement); - if (this.creator.activeTab === "designer") { - this.updateActivePage(); - this.updateTabControl(); - } - } - } - private syncTheme(theme?: ICreatorTheme) { const newTheme = theme || this.themeModel.toJSON(); this.creator.syncTheme(newTheme, this.themeModel.isLight); @@ -205,20 +299,9 @@ export class TabDesignerPlugin implements ICreatorPlugin { this.updatePredefinedColorChoices(); } - constructor(private creator: SurveyCreatorModel) { + constructor(creator: SurveyCreatorModel) { + super(creator); creator.addTab({ name: "designer", plugin: this, iconName: TabDesignerPlugin.iconName }); - this.tabControlModel = new TabControlModel(this.creator.sidebar); - this.tabControlModel.onTopToolbarItemCreated = (bar) => { - this.setupPropertyGridTabActions(bar); - }; - this.propertyGrid = new PropertyGridModel(undefined, creator, creator.getPropertyGridDefinition()); - this.showOneCategoryInPropertyGrid = creator.showOneCategoryInPropertyGrid; - this.propertyGrid.showOneCategoryInPropertyGrid = this.showOneCategoryInPropertyGrid; - this.propertyGrid.obj = creator.survey; - this.propertyGridViewModel = new PropertyGridViewModel(this.propertyGrid, creator); - this.propertyGridViewModel.onNewSurveyCreatedCallback = () => { - this.updateTabControlActions(); - }; this.propertyGridPlaceholderPage = this.creator.sidebar.addPage("propertyGridPlaceholder", "svc-property-grid-placeholder", this.propertyGridViewModel); this.propertyGridPlaceholderPage.caption = editorLocalization.getString("ed.surveySettings"); @@ -283,68 +366,6 @@ export class TabDesignerPlugin implements ICreatorPlugin { }); } - private updateTabControlActions() { - if (this.showOneCategoryInPropertyGrid) { - if (this.tabControlModel.isTopToolbarCreated) { - this.setupPropertyGridTabActions(this.tabControlModel.topToolbar); - } - this.propertyGrid.survey.onCurrentPageChanged.add((sender: SurveyModel, options: CurrentPageChangedEvent) => { - const pgTabs = this.tabControlModel.topToolbar.actions; - pgTabs.forEach(action => { - action.active = action.id === options.newCurrentPage.name; - }); - this.propertyGridViewModel.objectSelectionAction.title = options.newCurrentPage.title; - }); - this.propertyGrid.survey.onPageVisibleChanged.add((sender: SurveyModel, options: PageVisibleChangedEvent) => { - const action = this.tabControlModel.topToolbar.getActionById(options.page.name); - if (!!action) { - action.visible = options.page.isVisible; - } - }); - - this.propertyGridViewModel.objectSelectionAction.title = this.propertyGrid.survey.currentPage?.title; - } - } - private setupPropertyGridTabActions(topToolbar: ActionContainer) { - const pgTabs = this.getPropertyGridTabActions(); - topToolbar.setItems(pgTabs); - this.propertyGridTab.activateCallback = () => { - if (!this.propertyGrid.survey.currentPage) return; - - pgTabs.forEach(action => { - action.active = action.id === this.propertyGrid.survey.currentPage.name; - }); - }; - this.propertyGridTab.deactivateCallback = () => { - pgTabs.forEach(tab => tab.active = false); - }; - } - private getPropertyGridTabActions() { - const pgTabs = []; - this.propertyGrid.survey.pages.forEach(p => { - if (p.elements.length === 0) return; - - const action = new MenuButton({ - id: p.name, - tooltip: p.title, - iconName: p["iconName"], - iconSize: "auto", - active: this.activePageIsPropertyGrid && p.name === this.propertyGrid.survey.currentPage.name, - pressed: false, - visible: p.isVisible, - action: () => { - this.creator.sidebar.expandSidebar(); - this.setPropertyGridIsActivePage(); - this.propertyGrid.survey.currentPage = p; - pgTabs.forEach(i => i.active = false); - action.active = true; - } - }); - pgTabs.push(action); - }); - return pgTabs; - } - public activate(): void { this.model = new TabDesignerViewModel(this.creator); this.model.surfaceScale = this.creator.survey.widthScale; diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 7872bd495c..34cfdc747c 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -1,16 +1,45 @@ -import { Base, SurveyModel, Action, ComputedUpdater, CurrentPageChangedEvent, PageVisibleChangedEvent, QuestionDropdownModel, ActionContainer } from "survey-core"; -import { ICreatorPlugin, SurveyCreatorModel } from "survey-creator-core"; +import { createDropdownActionModel, Base, SurveyModel, Action, ComputedUpdater, CurrentPageChangedEvent, PageVisibleChangedEvent, QuestionDropdownModel, ActionContainer } from "survey-core"; +import { TabDesignerPluginBase, SurveyCreatorModel, listComponentCss, TabControlModel, SidebarPageModel, PropertyGridViewModel, PropertyGridModel } from "survey-creator-core"; import { CreatorPresetEditorModel } from "./presets-editor"; -export class TabPresetsPlugin implements ICreatorPlugin { +export class TabPresetsPlugin extends TabDesignerPluginBase { public model: CreatorPresetEditorModel | undefined; public static iconName = "icon-settings"; - constructor(private creator: SurveyCreatorModel) { + public propertyGridViewModel: PropertyGridViewModel; + constructor(creator: SurveyCreatorModel) { + super(creator); creator.addTab({ name: "presets", plugin: this, iconName: TabPresetsPlugin.iconName }); + this.propertyGridTab = this.creator.sidebar.addPage("propertyGridPresets", "svc-property-grid", this.propertyGridViewModel); + + const settingsAction = createDropdownActionModel({ + id: "presets-menu", + locTooltipName: "ed.creatorPresetsTitle", + iconName: "gear-24x24", + mode: new ComputedUpdater(() => { + return this.creator.isMobileView ? "small" : "large"; + }), + }, { + items: [{ id: "show-all-strings", locTitleName: "ed.translationShowAllStrings" }, { id: "show-used-strings-only", locTitleName: "ed.translationShowUsedStringsOnly" }], + allowSelection: true, + onSelectionChanged: (item: any) => { + // this.model.activeLanguage = item.id; + // this.languageSelectorAction.title = editorLocalization.getLocaleName(item.id); + }, + verticalPosition: "top", + horizontalPosition: "center", + cssClass: "svc-creator-popup", + cssClasses: listComponentCss, + // onHide: () => { this.languageSelectorAction.enabled = true; }, + // onShow: () => { this.languageSelectorAction.enabled = false; } + }, this.creator); + + this.tabControlModel.bottomToolbar.setItems([settingsAction]); } public activate(): void { this.model = new CreatorPresetEditorModel({}, this.creator); + this.updateActivePage(); + this.updateTabControl(); } public deactivate(): boolean { From 4627c189d84c109a8233bc96e6f2679f163541f4 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 8 Jul 2025 17:49:55 +0300 Subject: [PATCH 005/240] work for #7004 --- .../components/side-bar/tab-control-model.ts | 13 ++++ .../src/components/side-bar/tab-control.scss | 2 + .../src/presets/presets-editor.ts | 2 +- .../src/presets/presets-plugin.ts | 66 +++++++++++++------ .../src/side-bar/TabControl.tsx | 4 +- 5 files changed, 65 insertions(+), 22 deletions(-) diff --git a/packages/survey-creator-core/src/components/side-bar/tab-control-model.ts b/packages/survey-creator-core/src/components/side-bar/tab-control-model.ts index eddbcdec15..810797d70b 100644 --- a/packages/survey-creator-core/src/components/side-bar/tab-control-model.ts +++ b/packages/survey-creator-core/src/components/side-bar/tab-control-model.ts @@ -31,6 +31,19 @@ export class TabControlModel extends Base { constructor(public sidePanel: SidebarModel) { super(); + let bottomActionBarCss = { + root: "sv-action-bar", + defaultSizeMode: "", + smallSizeMode: "", + item: "svc-menu-action__button", + itemWithTitle: "", + itemAsIcon: "", + itemActive: "svc-menu-action__button--selected", + itemPressed: "", + itemIcon: "svc-menu-action__icon", + itemTitleWithIcon: "", + }; + this.bottomToolbar.cssClasses = bottomActionBarCss; this.createToggleAction(); this.updateExpandCollapseAction(); this.sidePanel.registerFunctionOnPropertyValueChanged("_visible", () => { diff --git a/packages/survey-creator-core/src/components/side-bar/tab-control.scss b/packages/survey-creator-core/src/components/side-bar/tab-control.scss index 9f5347c04f..d1866f561c 100644 --- a/packages/survey-creator-core/src/components/side-bar/tab-control.scss +++ b/packages/survey-creator-core/src/components/side-bar/tab-control.scss @@ -162,6 +162,8 @@ gap: var(--ctr-menu-toolbar-button-gap, var(--sjs-spacing-x1)); border-radius: var(--ctr-menu-toolbar-button-corner-radius, var(--sjs-corner-radius-x1)); cursor: pointer; + border: unset; + background: unset; } .svc-menu-action__button:hover, .svc-menu-action__button:focus, diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 7e66317e39..b96b360d17 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -356,7 +356,7 @@ preset.apply(creator); return res; } private getEditModelJson(editablePresets: Array): any { - const modelJson = { pages: [], showTOC: true, showQuestionNumbers: false, widthMode: "static", width: "1200px" }; + const modelJson = { pages: [], showQuestionNumbers: false }; editablePresets.forEach(preset => { const pages = preset.createPages(); if (Array.isArray(pages)) { diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 34cfdc747c..845c4fc5f8 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -1,5 +1,5 @@ -import { createDropdownActionModel, Base, SurveyModel, Action, ComputedUpdater, CurrentPageChangedEvent, PageVisibleChangedEvent, QuestionDropdownModel, ActionContainer } from "survey-core"; -import { TabDesignerPluginBase, SurveyCreatorModel, listComponentCss, TabControlModel, SidebarPageModel, PropertyGridViewModel, PropertyGridModel } from "survey-creator-core"; +import { createDropdownActionModel, Base, SurveyModel, Action, ComputedUpdater, CurrentPageChangedEvent, PageVisibleChangedEvent, QuestionDropdownModel, ActionContainer, IAction } from "survey-core"; +import { TabDesignerPluginBase, SurveyCreatorModel, listComponentCss, saveToFileHandler, TabControlModel, SidebarPageModel, PropertyGridViewModel, PropertyGridModel } from "survey-creator-core"; import { CreatorPresetEditorModel } from "./presets-editor"; export class TabPresetsPlugin extends TabDesignerPluginBase { @@ -10,21 +10,55 @@ export class TabPresetsPlugin extends TabDesignerPluginBase { super(creator); creator.addTab({ name: "presets", plugin: this, iconName: TabPresetsPlugin.iconName }); this.propertyGridTab = this.creator.sidebar.addPage("propertyGridPresets", "svc-property-grid", this.propertyGridViewModel); + } + + public saveToFileHandler = saveToFileHandler; + + public exportToFile(fileName: string) { + if (this.model) { + const jsonBlob = new Blob([this.model.jsonText], { type: "application/json" }); + this.saveToFileHandler(fileName, jsonBlob); + } + } + public importFromFile(file: File, callback?: (json: string) => void) { + let fileReader = new FileReader(); + fileReader.onload = (e) => { + const surveyJSONText = fileReader.result as string; + if (this.model) { + try { + this.model.json = JSON.parse(surveyJSONText); + } catch{ } + } + callback && callback(surveyJSONText); + }; + fileReader.readAsText(file); + } + + public activate(): void { + this.model = new CreatorPresetEditorModel({}, this.creator); + this.updateActivePage(); + this.updateTabControl(); - const settingsAction = createDropdownActionModel({ + const presets = this.model?.model.pages.map(p => { id: p.name, title: p.title }); + const tools = [ + { id: "save", title: "Save & Exit", markerIconName: "check-24x24", needSeparator: true }, + { id: "import", title: "Import", markerIconName: "import-24x24" }, + { id: "export", title: "Export", markerIconName: "download-24x24" }, + { id: "reset", title: "Reset all changes", markerIconName: "restore-24x24", needSeparator: true }, + ]; + let settingsAction; + presets.forEach(p => { + p.action = (item)=>{ + settingsAction.popupModel.contentComponentData.model.selectedItem = item; + this.model.model.currentPage = this.model.model.getPageByName(item.id); + }; + }); + settingsAction = createDropdownActionModel({ id: "presets-menu", locTooltipName: "ed.creatorPresetsTitle", - iconName: "gear-24x24", - mode: new ComputedUpdater(() => { - return this.creator.isMobileView ? "small" : "large"; - }), + iconName: "navmenu-24x24" }, { - items: [{ id: "show-all-strings", locTitleName: "ed.translationShowAllStrings" }, { id: "show-used-strings-only", locTitleName: "ed.translationShowUsedStringsOnly" }], - allowSelection: true, - onSelectionChanged: (item: any) => { - // this.model.activeLanguage = item.id; - // this.languageSelectorAction.title = editorLocalization.getLocaleName(item.id); - }, + items: [...presets, ...tools], verticalPosition: "top", horizontalPosition: "center", cssClass: "svc-creator-popup", @@ -36,12 +70,6 @@ export class TabPresetsPlugin extends TabDesignerPluginBase { this.tabControlModel.bottomToolbar.setItems([settingsAction]); } - public activate(): void { - this.model = new CreatorPresetEditorModel({}, this.creator); - this.updateActivePage(); - this.updateTabControl(); - } - public deactivate(): boolean { if (this.model) { this.model.dispose(); diff --git a/packages/survey-creator-react/src/side-bar/TabControl.tsx b/packages/survey-creator-react/src/side-bar/TabControl.tsx index 42a233bd97..10e80ca480 100644 --- a/packages/survey-creator-react/src/side-bar/TabControl.tsx +++ b/packages/survey-creator-react/src/side-bar/TabControl.tsx @@ -1,6 +1,6 @@ import * as React from "react"; import { Action, ActionContainer, Base } from "survey-core"; -import { SurveyElementBase, ReactElementFactory, Scroll } from "survey-react-ui"; +import { SurveyElementBase, ReactElementFactory, Scroll, SurveyActionBar } from "survey-react-ui"; import { MenuButton, TabControlModel } from "survey-creator-core"; import { TabButtonComponent } from "./TabButton"; @@ -39,7 +39,7 @@ class TabControl extends SurveyElementBase {
- +
From b8e6d0ed67791cecfadc391482cba7a89eb41f45 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 9 Jul 2025 18:30:48 +0300 Subject: [PATCH 006/240] #7004 Presets: integrate presets into creator Fixes #7004 --- .../src/presets-creator/presets.ts | 4 +- .../src/presets/presets-editor.ts | 37 ++----------------- .../src/presets/presets-plugin.ts | 26 ++----------- .../src/presets/Presets.tsx | 4 +- 4 files changed, 10 insertions(+), 61 deletions(-) diff --git a/packages/survey-creator-core/src/presets-creator/presets.ts b/packages/survey-creator-core/src/presets-creator/presets.ts index 60dac91f00..ab22952e27 100644 --- a/packages/survey-creator-core/src/presets-creator/presets.ts +++ b/packages/survey-creator-core/src/presets-creator/presets.ts @@ -54,9 +54,7 @@ export class CreatorPreset extends CreatorPresetBase { } } protected createPresets(): Array { - // return [new CreatorPresetLanguages(), new CreatorPresetTabs(), new CreatorPresetToolbox(), - // new CreatorPresetPropertyGrid()]; - return [new CreatorPresetToolbox(), + return [new CreatorPresetLanguages(), new CreatorPresetTabs(), new CreatorPresetToolbox(), new CreatorPresetPropertyGrid()]; } } \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index b96b360d17..b6e3092885 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -43,10 +43,6 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit this.locTitle.text = "Creator Presets"; this.navigationBarValue = new NavigationBar(); const firstTabName = "preset"; - this.addNavigationAction(firstTabName, "Edit Preset"); - this.addNavigationAction("creator", "Preview Survey Creator"); - this.addNavigationAction("results", "View Preset JSON"); - this.activeTab = firstTabName; } public dispose(): void { super.dispose(); @@ -64,18 +60,6 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit this.upldateResultJson(); return this.resultModelValue; } - public get navigationBar(): ActionContainer { return this.navigationBarValue; } - public get activeTab(): string { - return this.getPropertyValue("activeTab"); - } - public set activeTab(val: string) { - this.setPropertyValue("activeTab", val); - } - public setActiveTab(val: string): boolean { - if (this.activeTab === "preset" && !this.model.validate(true, true)) return false; - this.activeTab = val; - return true; - } public getLocale(): string { return this.json?.languages?.creator || "en"; } public get json(): ICreatorPresetData { return this.preset.getJson(); @@ -89,24 +73,10 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit public get jsonText(): string { return JSON.stringify(this.json, null, 2); } - protected onPropertyValueChanged(name: string, oldValue: any, newValue: any): void { - if (name === "activeTab" && oldValue === "preset") { - this.applyFromSurveyModel(); - } - } public createCreator(options: ICreatorOptions): SurveyCreatorModel { return new SurveyCreatorModel(options); } - private addNavigationAction(tabName: string, title: string): void { - const id = "action-preset-" + tabName; - const actionInfo = { - id: id, - title: title, - active: new ComputedUpdater(() => this.activeTab === tabName), - action: () => { this.setActiveTab(tabName); } - }; - this.navigationBar.addAction(actionInfo); - } + protected createModel(): SurveyModel { const editablePresets = this.createEditablePresets(); const model = new SurveyModel(this.getEditModelJson(editablePresets)); @@ -227,7 +197,8 @@ const preset = new CreatorPreset(presetJson); preset.apply(creator); `; } - private downloadJsonFile(text: string): void { + public downloadJsonFile(text?: string): void { + if (!text) text = this.jsonText; const jsonBlob = new Blob([text], { type: "application/json" }); const elem = window.document.createElement("a"); elem.href = window.URL.createObjectURL(jsonBlob); @@ -237,7 +208,7 @@ preset.apply(creator); document.body.removeChild(elem); } inputFileElement: HTMLInputElement; - private loadJsonFile(): void { + public loadJsonFile(): void { if (!this.inputFileElement) { this.inputFileElement = document.createElement("input"); this.inputFileElement.type = "file"; diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 845c4fc5f8..516645ece6 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -14,36 +14,16 @@ export class TabPresetsPlugin extends TabDesignerPluginBase { public saveToFileHandler = saveToFileHandler; - public exportToFile(fileName: string) { - if (this.model) { - const jsonBlob = new Blob([this.model.jsonText], { type: "application/json" }); - this.saveToFileHandler(fileName, jsonBlob); - } - } - public importFromFile(file: File, callback?: (json: string) => void) { - let fileReader = new FileReader(); - fileReader.onload = (e) => { - const surveyJSONText = fileReader.result as string; - if (this.model) { - try { - this.model.json = JSON.parse(surveyJSONText); - } catch{ } - } - callback && callback(surveyJSONText); - }; - fileReader.readAsText(file); - } - public activate(): void { this.model = new CreatorPresetEditorModel({}, this.creator); this.updateActivePage(); this.updateTabControl(); - const presets = this.model?.model.pages.map(p => { id: p.name, title: p.title }); + const presets = this.model?.model.pages.map(p => { id: p.name, title: p.navigationTitle }); const tools = [ { id: "save", title: "Save & Exit", markerIconName: "check-24x24", needSeparator: true }, - { id: "import", title: "Import", markerIconName: "import-24x24" }, - { id: "export", title: "Export", markerIconName: "download-24x24" }, + { id: "import", title: "Import", markerIconName: "import-24x24", action: () => { this.model?.loadJsonFile(); } }, + { id: "export", title: "Export", markerIconName: "download-24x24", action: () => { this.model?.downloadJsonFile(); } }, { id: "reset", title: "Reset all changes", markerIconName: "restore-24x24", needSeparator: true }, ]; let settingsAction; diff --git a/packages/survey-creator-react/src/presets/Presets.tsx b/packages/survey-creator-react/src/presets/Presets.tsx index 3a49dc3be2..5e5ad6d603 100644 --- a/packages/survey-creator-react/src/presets/Presets.tsx +++ b/packages/survey-creator-react/src/presets/Presets.tsx @@ -19,8 +19,8 @@ export class TabPresetsComponent extends SurveyElementBase { - return [this.model, this.creator]; + protected getStateElement(): Base { + return this.model; } renderElement(): React.JSX.Element { From 1a546e6c8c628b452d32efcfbbb5bd3854902c12 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 9 Jul 2025 18:51:24 +0300 Subject: [PATCH 007/240] #7004 - fixing tabs --- .../survey-creator-core/src/creator-base.ts | 6 +++-- .../tests-presets/presets-editor.tests.ts | 22 ++++++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/packages/survey-creator-core/src/creator-base.ts b/packages/survey-creator-core/src/creator-base.ts index 4fa2f9cf4f..cf158eeabc 100644 --- a/packages/survey-creator-core/src/creator-base.ts +++ b/packages/survey-creator-core/src/creator-base.ts @@ -1904,10 +1904,12 @@ export class SurveyCreatorModel extends Base }; } public getAvailableTabs(): Array { - const res = []; + const res = this.tabs.map(t => ({ name: t.id, iconName: t.iconName })); const tabInfo = this.getTabsInfo(); for (let key in tabInfo) { - res.push({ name: key, iconName: tabInfo[key].iconName }); + if (res.filter(t => t.name == key).length == 0) { + res.push({ name: key, iconName: tabInfo[key].iconName }); + } } return res; } diff --git a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts index 83270c0e09..7ef2bff5d9 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts @@ -3,7 +3,7 @@ import { CreatorPresetEditorModel } from "../src/presets/presets-editor"; import { ICreatorPresetData } from "../src/presets-creator/presets"; import { SurveyModel, Question } from "survey-core"; import { QuestionToolbox } from "../src/toolbox"; -import { SurveyCreatorModel } from "../src/creator-base"; +import { CreatorBase, SurveyCreatorModel } from "../src/creator-base"; import { editorLocalization } from "../src/editorLocalization"; //import "survey-creator-core/i18n/german"; //import "survey-creator-core/i18n/italian"; @@ -70,6 +70,26 @@ test("Preset edit model, tabs page with creator, default items", () => { expect(creator.tabs[1].id).toEqual("logic"); expect(creator.activeTab).toBe("logic"); }); + +test("Preset edit model, tabs page with creator, default items with custom", () => { + const creator = new CreatorBase(); + creator.addTab({ name: "custom", plugin: { model: creator, activate: () => { } } }); + const editor = new CreatorPresetEditorModel({}, creator); + const survey = editor.model; + const itemsQuestion = survey.getQuestionByName("tabs_items"); + const defultTabs = JSON.parse(JSON.stringify(itemsQuestion.value)); + expect(defultTabs.map(t => t.name)).toEqual(["designer", "preview", "logic", "json", "custom"]); + + itemsQuestion.value = [{ name: "preview" }, { name: "custom" }]; + const activeTabQuestion = survey.getQuestionByName("tabs_activeTab"); + activeTabQuestion.value = "custom"; + editor.applyFromSurveyModel(); + expect(creator.tabs).toHaveLength(2); + expect(creator.tabs[0].id).toEqual("preview"); + expect(creator.tabs[1].id).toEqual("custom"); + expect(creator.activeTab).toBe("custom"); +}); + test("Preset edit model, tabs page one selected element", () => { const editor = new CreatorPresetEditorModel({}); const survey = editor.model; From 64e5b2fca3657b432596f8dc7fd36ae6ff29396a Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 10 Jul 2025 10:28:33 +0300 Subject: [PATCH 008/240] #7004 fix tabs presets --- .../survey-creator-core/src/creator-base.ts | 6 ++--- .../tests-presets/presets-editor.tests.ts | 26 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/survey-creator-core/src/creator-base.ts b/packages/survey-creator-core/src/creator-base.ts index cf158eeabc..0bdbde93a4 100644 --- a/packages/survey-creator-core/src/creator-base.ts +++ b/packages/survey-creator-core/src/creator-base.ts @@ -1928,9 +1928,9 @@ export class SurveyCreatorModel extends Base public setTabs(tabNames: Array): void { if (!Array.isArray(tabNames)) return; const tabInfo = this.getTabsInfo(); - for (let i = tabNames.length - 1; i >= 0; i--) { - if (!tabInfo[tabNames[i]]) tabNames.splice(i, 1); - } + // for (let i = tabNames.length - 1; i >= 0; i--) { + // if (!tabInfo[tabNames[i]]) tabNames.splice(i, 1); + // } if (tabNames.length === 0) return; for (let i = this.tabs.length - 1; i >= 0; i--) { const tabId = this.tabs[i].id; diff --git a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts index 7ef2bff5d9..e59d015eee 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts @@ -514,19 +514,19 @@ test("Preset edit model, property grid & matrixdropdowncolumn@checkbox", () => { expect(panels[1].elements[0].name).toBe("choices"); expect(panels[1].elements[1].name).toBe("showSelectAllItem"); }); -test("Editor: activeTab & navigationBar", () => { - const editor = new CreatorPresetEditorModel(); - expect(editor.activeTab).toEqual("preset"); - expect(editor.navigationBar.actions[0].active).toBeTruthy(); - const survey = editor.model; - const itemsQuestion = survey.getQuestionByName("tabs_items"); - itemsQuestion.value = [{ name: "designer" }, { name: "translation" }]; - editor.navigationBar.actions[1].action(); - expect(editor.activeTab).toEqual("creator"); - expect(editor.creator.tabs).toHaveLength(2); - expect(editor.creator.tabs[0].id).toEqual("designer"); - expect(editor.creator.tabs[1].id).toEqual("translation"); -}); +// test("Editor: activeTab & navigationBar", () => { +// const editor = new CreatorPresetEditorModel(); +// expect(editor.activeTab).toEqual("preset"); +// expect(editor.navigationBar.actions[0].active).toBeTruthy(); +// const survey = editor.model; +// const itemsQuestion = survey.getQuestionByName("tabs_items"); +// itemsQuestion.value = [{ name: "designer" }, { name: "translation" }]; +// editor.navigationBar.actions[1].action(); +// expect(editor.activeTab).toEqual("creator"); +// expect(editor.creator.tabs).toHaveLength(2); +// expect(editor.creator.tabs[0].id).toEqual("designer"); +// expect(editor.creator.tabs[1].id).toEqual("translation"); +// }); // test("Editor: do not allow to change the activeTab if there is an error", () => { // const editor = new CreatorPresetEditorModel(); // expect(editor.activeTab).toEqual("preset"); From 68cbfa01b33ecea611c32675d03c47fcee3a8eef Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 10 Jul 2025 16:54:42 +0300 Subject: [PATCH 009/240] #7004 Presets: fixed active tab setting --- .../survey-creator-core/src/creator-base.ts | 2 +- .../src/presets-creator/presets-base.ts | 10 ++++---- .../src/presets-creator/presets-tabs.ts | 23 +++++++++++-------- .../src/presets-creator/presets.ts | 4 ++-- .../src/presets/presets-editor.ts | 2 +- .../tests-presets/presets-editor.tests.ts | 7 +++--- 6 files changed, 25 insertions(+), 23 deletions(-) diff --git a/packages/survey-creator-core/src/creator-base.ts b/packages/survey-creator-core/src/creator-base.ts index 0bdbde93a4..d84c135fb9 100644 --- a/packages/survey-creator-core/src/creator-base.ts +++ b/packages/survey-creator-core/src/creator-base.ts @@ -1952,7 +1952,7 @@ export class SurveyCreatorModel extends Base this.tabs.splice(i, 0, item); } } - if (this.tabs.length > 0) { + if (this.tabs.length > 0 && this.tabs.filter(t => t.id == this.activeTab).length == 0) { this.switchTab(this.tabs[0].id); } } diff --git a/packages/survey-creator-core/src/presets-creator/presets-base.ts b/packages/survey-creator-core/src/presets-creator/presets-base.ts index 2bfeaac0e4..ec01756acd 100644 --- a/packages/survey-creator-core/src/presets-creator/presets-base.ts +++ b/packages/survey-creator-core/src/presets-creator/presets-base.ts @@ -3,7 +3,7 @@ import { SurveyCreatorModel } from "../creator-base"; export interface ICreatorPreset { setJson(json: any): void; - apply(creator: SurveyCreatorModel): void; + apply(creator: SurveyCreatorModel, internal?: boolean): void; getPath(): string; } @@ -19,17 +19,17 @@ export abstract class CreatorPresetBase implements ICreatorPreset { this.json = json; this.children.forEach(item => item.setJson(this.json && item.getPath() ? this.json[item.getPath()] : this.json)); } - public apply(creator?: SurveyCreatorModel): void { + public apply(creator: SurveyCreatorModel, internal = false): void { if (!this.json) return; if (!!creator) { - this.applyCore(creator); - this.children.forEach(item => item.apply(creator)); + this.applyCore(creator, internal); + this.children.forEach(item => item.apply(creator, internal)); } this.onApplied.fire(this, {}); } public abstract getPath(): string; protected applyEmptyJson(): boolean { return false; } - protected applyCore(creator: SurveyCreatorModel): void { } + protected applyCore(creator: SurveyCreatorModel, internal: boolean = false): void { } protected createPresets(): Array { return []; } diff --git a/packages/survey-creator-core/src/presets-creator/presets-tabs.ts b/packages/survey-creator-core/src/presets-creator/presets-tabs.ts index 9c121750dc..7a05e1ea34 100644 --- a/packages/survey-creator-core/src/presets-creator/presets-tabs.ts +++ b/packages/survey-creator-core/src/presets-creator/presets-tabs.ts @@ -7,17 +7,20 @@ export interface ICreatorPresetTab { export class CreatorPresetTabs extends CreatorPresetBase { public getPath(): string { return "tabs"; } - protected applyCore(creator: SurveyCreatorModel): void { - super.applyCore(creator); + protected applyCore(creator: SurveyCreatorModel, internal: boolean = false): void { + super.applyCore(creator, internal); const items = this.json["items"] || []; - let tab = this.json.activeTab || (items.length > 0 ? items[0].name : ""); - if (items.length > 0 && items.filter(i => i.name == tab).length == 0) { - tab = items[0].name; - } - if (!!tab && creator.activeTab !== tab) { - const activePlugin = creator.getPlugin(creator.activeTab); - if (!!activePlugin?.deactivate) { - activePlugin.deactivate(); + let tab = null; + if (!internal) { + tab = this.json.activeTab || (items.length > 0 ? items[0].name : ""); + if (items.length > 0 && items.filter(i => i.name == tab).length == 0) { + tab = items[0].name; + } + if (!!tab && creator.activeTab !== tab) { + const activePlugin = creator.getPlugin(creator.activeTab); + if (!!activePlugin?.deactivate) { + activePlugin.deactivate(); + } } } this.applyTabs(creator, items); diff --git a/packages/survey-creator-core/src/presets-creator/presets.ts b/packages/survey-creator-core/src/presets-creator/presets.ts index ab22952e27..d0effb35ca 100644 --- a/packages/survey-creator-core/src/presets-creator/presets.ts +++ b/packages/survey-creator-core/src/presets-creator/presets.ts @@ -38,8 +38,8 @@ export class CreatorPreset extends CreatorPresetBase { public getJson(): ICreatorPresetData { return this.json; } - public apply(creator?: SurveyCreatorModel): void { - super.apply(creator); + public apply(creator: SurveyCreatorModel, internal = false): void { + super.apply(creator, internal); this.applyLocalization(); if (!!creator) { creator.updateLocalizedStrings(); diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index b6e3092885..78b0890179 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -241,7 +241,7 @@ preset.apply(creator); // } this.preset.setJson(this.getJsonFromSurveyModel()); this.model.setValue("json_result", JSON.stringify(this.preset.getJson(), null, 2)); - this.preset.apply(this.creator); + this.preset.apply(this.creator, true); return true; } public getJsonFromSurveyModel(): any { diff --git a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts index e59d015eee..d1f73ceeef 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts @@ -63,8 +63,9 @@ test("Preset edit model, tabs page with creator, default items", () => { itemsQuestion.value = [{ name: "preview" }, { name: "logic" }]; const activeTabQuestion = survey.getQuestionByName("tabs_activeTab"); activeTabQuestion.value = "logic"; - editor.applyFromSurveyModel(); const creator = editor.creator; + creator.activeTab = "logic"; + editor.applyFromSurveyModel(); expect(creator.tabs).toHaveLength(2); expect(creator.tabs[0].id).toEqual("preview"); expect(creator.tabs[1].id).toEqual("logic"); @@ -87,7 +88,7 @@ test("Preset edit model, tabs page with creator, default items with custom", () expect(creator.tabs).toHaveLength(2); expect(creator.tabs[0].id).toEqual("preview"); expect(creator.tabs[1].id).toEqual("custom"); - expect(creator.activeTab).toBe("custom"); + expect(creator.activeTab).toBe("preview"); }); test("Preset edit model, tabs page one selected element", () => { @@ -880,7 +881,6 @@ test("Preset edit model, save creator JSON on applying new preset", () => { }); test("Preset edit model, set json property", () => { const editor = new CreatorPresetEditorModel({}); - editor.activeTab = "results"; const jsonQuestion = editor.resultModel.getQuestionByName("json"); expect(jsonQuestion.value).toBe("{}"); const json = { @@ -895,5 +895,4 @@ test("Preset edit model, set json property", () => { editor.json = json; expect(JSON.parse(jsonQuestion.value)).toMatchObject(json); expect(editor.creator.tabs).toHaveLength(2); - expect(editor.creator.activeTab).toBe("preview"); }); From 8ebc3fb2f79e6fc932b06e2870697005cde9e5df Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 10 Jul 2025 17:57:20 +0300 Subject: [PATCH 010/240] #7004 - fixed presets current page --- packages/survey-creator-core/src/presets/presets-plugin.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 516645ece6..17ee5173dc 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -6,6 +6,7 @@ export class TabPresetsPlugin extends TabDesignerPluginBase { public model: CreatorPresetEditorModel | undefined; public static iconName = "icon-settings"; public propertyGridViewModel: PropertyGridViewModel; + private currentPresetIndex = 0; constructor(creator: SurveyCreatorModel) { super(creator); creator.addTab({ name: "presets", plugin: this, iconName: TabPresetsPlugin.iconName }); @@ -16,6 +17,7 @@ export class TabPresetsPlugin extends TabDesignerPluginBase { public activate(): void { this.model = new CreatorPresetEditorModel({}, this.creator); + this.model.model.currentPageNo = this.currentPresetIndex; this.updateActivePage(); this.updateTabControl(); @@ -51,6 +53,7 @@ export class TabPresetsPlugin extends TabDesignerPluginBase { } public deactivate(): boolean { + this.currentPresetIndex = this.model?.model.currentPageNo || 0; if (this.model) { this.model.dispose(); } From a35febe7dbe6c839464f7bdc8f8b364073001b26 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 10 Jul 2025 18:48:00 +0300 Subject: [PATCH 011/240] #7004 - do not refresh plugin --- packages/survey-creator-core/src/creator-base.ts | 4 ++-- packages/survey-creator-core/src/presets-creator/presets.ts | 2 +- packages/survey-creator-core/src/presets/presets-plugin.ts | 2 -- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/survey-creator-core/src/creator-base.ts b/packages/survey-creator-core/src/creator-base.ts index d84c135fb9..05aa58e5b8 100644 --- a/packages/survey-creator-core/src/creator-base.ts +++ b/packages/survey-creator-core/src/creator-base.ts @@ -1501,9 +1501,9 @@ export class SurveyCreatorModel extends Base this.onLocaleChanded.fire(this, { locale: value }); } public onLocaleChanded: EventBase = this.addCreatorEvent(); - public updateLocalizedStrings(): void { + public updateLocalizedStrings(refreshPlugin: boolean = true): void { this.toolbox.updateTitles(); - this.refreshPlugin(); + if (refreshPlugin)this.refreshPlugin(); const selEl = this.selectedElement; if (!!selEl) { this.selectElement(null); diff --git a/packages/survey-creator-core/src/presets-creator/presets.ts b/packages/survey-creator-core/src/presets-creator/presets.ts index d0effb35ca..86e2396e48 100644 --- a/packages/survey-creator-core/src/presets-creator/presets.ts +++ b/packages/survey-creator-core/src/presets-creator/presets.ts @@ -42,7 +42,7 @@ export class CreatorPreset extends CreatorPresetBase { super.apply(creator, internal); this.applyLocalization(); if (!!creator) { - creator.updateLocalizedStrings(); + creator.updateLocalizedStrings(!internal); } } protected applyLocalization(): void { diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 17ee5173dc..43a0da1e31 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -17,7 +17,6 @@ export class TabPresetsPlugin extends TabDesignerPluginBase { public activate(): void { this.model = new CreatorPresetEditorModel({}, this.creator); - this.model.model.currentPageNo = this.currentPresetIndex; this.updateActivePage(); this.updateTabControl(); @@ -53,7 +52,6 @@ export class TabPresetsPlugin extends TabDesignerPluginBase { } public deactivate(): boolean { - this.currentPresetIndex = this.model?.model.currentPageNo || 0; if (this.model) { this.model.dispose(); } From 961351b59b5a6f8b7eb9094d40f629e7da78830c Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 10 Jul 2025 17:57:20 +0300 Subject: [PATCH 012/240] #7004 - fixed presets current page --- packages/survey-creator-core/src/presets/presets-plugin.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 43a0da1e31..17ee5173dc 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -17,6 +17,7 @@ export class TabPresetsPlugin extends TabDesignerPluginBase { public activate(): void { this.model = new CreatorPresetEditorModel({}, this.creator); + this.model.model.currentPageNo = this.currentPresetIndex; this.updateActivePage(); this.updateTabControl(); @@ -52,6 +53,7 @@ export class TabPresetsPlugin extends TabDesignerPluginBase { } public deactivate(): boolean { + this.currentPresetIndex = this.model?.model.currentPageNo || 0; if (this.model) { this.model.dispose(); } From 3a24121c487624e54af30ecacf601837a81fd5ce Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 11 Jul 2025 16:58:51 +0300 Subject: [PATCH 013/240] preview property grid #7004 --- .../src/presets/presets-editable-properties.ts | 8 ++++++++ .../survey-creator-core/src/presets/presets-plugin.ts | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index a599708a42..346f9e1465 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -55,9 +55,11 @@ export class SurveyQuestionPresetPropertiesDetail { private propertyGridValue: PropertyGridModel; private propertyGridDefaultValue: PropertyGridModel; private allPropertiesNames: Array; + private obj; constructor(private className: string, private currentJson: ISurveyPropertyGridDefinition) { const cls = {}; const obj = this.createObj(); + this.obj = obj; this.properties = new SurveyQuestionPresetProperties(obj, className, currentJson); this.allPropertiesNames = this.properties.getAllVisiblePropertiesNames(true); const objProps = {}; @@ -82,6 +84,9 @@ export class SurveyQuestionPresetPropertiesDetail { this.propertyGridValue = this.createPropertyGrid(obj, this.currentJson); this.propertyGridDefaultValue = this.createPropertyGrid(obj); } + public getObj() { + return this.obj; + } private createPropertyGrid(obj: Base, json?: ISurveyPropertyGridDefinition): PropertyGridModel { const res = new PropertyGridModel(undefined, undefined, json); res.showOneCategoryInPropertyGrid = true; @@ -300,8 +305,10 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare this.updateCurrentJson(model); return { definition: this.currentJson }; } + private propertyGrid: PropertyGridModel; protected setupQuestionsCore(model: SurveyModel, creatorSetup: ICreatorPresetEditorSetup): void { this.getSelector(model).choices = this.getSelectorChoices(creatorSetup.creator); + this.propertyGrid = creatorSetup.creator["designerPropertyGrid"]; const oldSearchValue = settings.propertyGrid.enableSearch; settings.propertyGrid.enableSearch = false; // this.propCreatorValue = creatorSetup.createCreator(options); @@ -373,6 +380,7 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare this.currentClassName = selQuestion.value; if (!this.currentClassName) return; this.currentProperties = new SurveyQuestionPresetPropertiesDetail(this.currentClassName, this.currentJson); + this.propertyGrid["setObj"](this.currentProperties.getObj()); const categories = this.currentProperties.getInitialJson(); this.defaultItems = []; model.setValue(this.nameCategories, categories); diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 17ee5173dc..cf8b502d6b 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -5,12 +5,12 @@ import { CreatorPresetEditorModel } from "./presets-editor"; export class TabPresetsPlugin extends TabDesignerPluginBase { public model: CreatorPresetEditorModel | undefined; public static iconName = "icon-settings"; - public propertyGridViewModel: PropertyGridViewModel; private currentPresetIndex = 0; constructor(creator: SurveyCreatorModel) { super(creator); creator.addTab({ name: "presets", plugin: this, iconName: TabPresetsPlugin.iconName }); - this.propertyGridTab = this.creator.sidebar.addPage("propertyGridPresets", "svc-property-grid", this.propertyGridViewModel); + //this.propertyGridTab = this.creator.sidebar.addPage("propertyGridPresets", "svc-property-grid", this.propertyGridViewModel); + this.propertyGridTab = this.creator.sidebar.getPageById("propertyGrid"); } public saveToFileHandler = saveToFileHandler; From 2412c901fd89a8406e62a6acb0123bff71453633 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 22 Jul 2025 18:17:35 +0300 Subject: [PATCH 014/240] #7004 - integration behaviour --- .../src/components/tabs/designer-plugin.ts | 274 +++++++++--------- .../src/presets/presets-editable-base.ts | 7 +- .../src/presets/presets-editable-languages.ts | 32 +- .../presets/presets-editable-properties.ts | 14 +- .../src/presets/presets-editable-tabs.ts | 6 + .../src/presets/presets-editable-toolbox.ts | 6 + .../src/presets/presets-plugin.ts | 29 +- 7 files changed, 210 insertions(+), 158 deletions(-) diff --git a/packages/survey-creator-core/src/components/tabs/designer-plugin.ts b/packages/survey-creator-core/src/components/tabs/designer-plugin.ts index a6c240c885..940520b3d2 100644 --- a/packages/survey-creator-core/src/components/tabs/designer-plugin.ts +++ b/packages/survey-creator-core/src/components/tabs/designer-plugin.ts @@ -15,145 +15,12 @@ import { CreatorThemeModel } from "../../creator-theme/creator-theme-model"; import { ICreatorTheme, PredefinedCreatorThemes } from "../../creator-theme/creator-themes"; import { getPredefinedBackgoundColorsChoices, getPredefinedColorsItemValues } from "./themes"; -export class TabDesignerPluginBase implements ICreatorPlugin { - constructor(protected creator: SurveyCreatorModel) { - this.tabControlModel = new TabControlModel(this.creator.sidebar); - this.tabControlModel.onTopToolbarItemCreated = (bar) => { - this.setupPropertyGridTabActions(bar); - }; - this.propertyGrid = new PropertyGridModel(undefined, creator, creator.getPropertyGridDefinition()); - this.showOneCategoryInPropertyGrid = creator.showOneCategoryInPropertyGrid; - this.propertyGrid.showOneCategoryInPropertyGrid = this.showOneCategoryInPropertyGrid; - this.propertyGrid.obj = creator.survey; - this.propertyGridViewModel = new PropertyGridViewModel(this.propertyGrid, creator); - this.propertyGridViewModel.onNewSurveyCreatedCallback = () => { - this.updateTabControlActions(); - }; - - } - activate() {} - model: Base; - public propertyGridViewModel: PropertyGridViewModel; - protected propertyGrid: PropertyGridModel; - protected _showOneCategoryInPropertyGrid: boolean = true; - protected propertyGridTab: SidebarPageModel; - protected tabControlModel: TabControlModel; - - protected get activePageIsPropertyGrid(): boolean { - return this.creator.sidebar.activePage === this.propertyGridTab.id; - } - protected updateActivePage() { - this.creator.sidebar.activePage = this.propertyGridTab.id; - } - protected updateTabControl() { - if (this.showOneCategoryInPropertyGrid) { - this.creator.sidebar.sideAreaComponentName = "svc-tab-control"; - this.creator.sidebar.sideAreaComponentData = this.tabControlModel; - } else { - this.propertyGridViewModel.objectSelectionAction.tooltip = ""; - this.creator.sidebar.sideAreaComponentName = ""; - this.creator.sidebar.sideAreaComponentData = undefined; - } - } - public get showOneCategoryInPropertyGrid(): boolean { - return this._showOneCategoryInPropertyGrid; - } - public set showOneCategoryInPropertyGrid(newValue) { - if (this._showOneCategoryInPropertyGrid !== newValue) { - this._showOneCategoryInPropertyGrid = newValue; - this.creator.sidebar.hideSideBarVisibilityControlActions = newValue; - this.propertyGrid.showOneCategoryInPropertyGrid = newValue; - this.propertyGrid["setObj"](this.creator.selectedElement); - if (this.creator.activeTab === "designer") { - this.updateActivePage(); - this.updateTabControl(); - } - } - } - protected updateHeaderComponent() { - if (this.showOneCategoryInPropertyGrid) { - this.creator.sidebar.header.componentName = "svc-side-bar-header"; - this.creator.sidebar.header.componentData = this.creator.sidebar.header; - } else { - this.creator.sidebar.header.componentName = ""; - this.creator.sidebar.header.componentData = undefined; - } - } - - protected setActivePage(id: string): void { - this.creator.sidebar.activePage = id; - this.updateHeaderComponent(); - } - - protected setPropertyGridIsActivePage() { - this.setActivePage(this.propertyGridTab.id); - } - protected updateTabControlActions() { - if (this.showOneCategoryInPropertyGrid) { - if (this.tabControlModel.isTopToolbarCreated) { - this.setupPropertyGridTabActions(this.tabControlModel.topToolbar); - } - this.propertyGrid.survey.onCurrentPageChanged.add((sender: SurveyModel, options: CurrentPageChangedEvent) => { - const pgTabs = this.tabControlModel.topToolbar.actions; - pgTabs.forEach(action => { - action.active = action.id === options.newCurrentPage.name; - }); - this.propertyGridViewModel.objectSelectionAction.title = options.newCurrentPage.title; - }); - this.propertyGrid.survey.onPageVisibleChanged.add((sender: SurveyModel, options: PageVisibleChangedEvent) => { - const action = this.tabControlModel.topToolbar.getActionById(options.page.name); - if (!!action) { - action.visible = options.page.isVisible; - } - }); - - this.propertyGridViewModel.objectSelectionAction.title = this.propertyGrid.survey.currentPage?.title; - } - } - protected setupPropertyGridTabActions(topToolbar: ActionContainer) { - const pgTabs = this.getPropertyGridTabActions(); - topToolbar.setItems(pgTabs); - this.propertyGridTab.activateCallback = () => { - if (!this.propertyGrid.survey.currentPage) return; - - pgTabs.forEach(action => { - action.active = action.id === this.propertyGrid.survey.currentPage.name; - }); - }; - this.propertyGridTab.deactivateCallback = () => { - pgTabs.forEach(tab => tab.active = false); - }; - } - protected getPropertyGridTabActions() { - const pgTabs = []; - this.propertyGrid.survey.pages.forEach(p => { - if (p.elements.length === 0) return; - - const action = new MenuButton({ - id: p.name, - tooltip: p.title, - iconName: p["iconName"], - iconSize: "auto", - active: this.activePageIsPropertyGrid && p.name === this.propertyGrid.survey.currentPage.name, - pressed: false, - visible: p.isVisible, - action: () => { - this.creator.sidebar.expandSidebar(); - this.setPropertyGridIsActivePage(); - this.propertyGrid.survey.currentPage = p; - pgTabs.forEach(i => i.active = false); - action.active = true; - } - }); - pgTabs.push(action); - }); - return pgTabs; - } - -} - -export class TabDesignerPlugin extends TabDesignerPluginBase { +export class TabDesignerPlugin implements ICreatorPlugin { public model: TabDesignerViewModel; + public propertyGridViewModel: PropertyGridViewModel; + private propertyGrid: PropertyGridModel; + private _showOneCategoryInPropertyGrid: boolean = true; + private propertyGridTab: SidebarPageModel; private toolboxTab: SidebarPageModel; private propertyGridPlaceholderPage: SidebarPageModel; private themeModel: CreatorThemeModel; @@ -164,8 +31,13 @@ export class TabDesignerPlugin extends TabDesignerPluginBase { public previewAction: Action; private designerAction: Action; public designerStateManager: DesignerStateManager; + private tabControlModelValue: TabControlModel; private prevActivePage: string; + public get tabControlModel() { + return this.tabControlModelValue; + } + public static iconName = "icon-config"; private get isSurveySelected(): boolean { @@ -177,6 +49,9 @@ export class TabDesignerPlugin extends TabDesignerPluginBase { this.isSurveySelected, activePage !== this.propertyGridPlaceholderPage.id); } + private get activePageIsPropertyGrid(): boolean { + return this.creator.sidebar.activePage === this.propertyGridTab.id; + } private createSelectedUpdater() { return new ComputedUpdater(() => { return this.isSettingsActive; @@ -187,8 +62,18 @@ export class TabDesignerPlugin extends TabDesignerPluginBase { return this.creator.activeTab === "designer"; }); } + private updateTabControl() { + if (this.showOneCategoryInPropertyGrid) { + this.creator.sidebar.sideAreaComponentName = "svc-tab-control"; + this.creator.sidebar.sideAreaComponentData = this.tabControlModel; + } else { + this.propertyGridViewModel.objectSelectionAction.tooltip = ""; + this.creator.sidebar.sideAreaComponentName = ""; + this.creator.sidebar.sideAreaComponentData = undefined; + } + } - protected updateHeaderComponent() { + private updateHeaderComponent() { const activePage = this.creator.sidebar.activePage; if (this.showOneCategoryInPropertyGrid && this.activePageIsPropertyGrid) { this.creator.sidebar.header.componentName = "svc-side-bar-property-grid-header"; @@ -204,14 +89,44 @@ export class TabDesignerPlugin extends TabDesignerPluginBase { } } - protected updateActivePage() { + public activateSidebar() { + this.updateActivePage(false); + this.updateTabControl(); + } + + private updateActivePage(showPlaceholder = true) { if (this.showOneCategoryInPropertyGrid) { - this.setActivePage(this.creator.survey.pageCount ? this.propertyGridTab.id : this.propertyGridPlaceholderPage.id); + this.setActivePage(this.creator.survey.pageCount || !showPlaceholder ? this.propertyGridTab.id : this.propertyGridPlaceholderPage.id); } else { this.setPropertyGridIsActivePage(); } } + private setPropertyGridIsActivePage() { + this.setActivePage(this.propertyGridTab.id); + } + + private setActivePage(id: string): void { + this.creator.sidebar.activePage = id; + this.updateHeaderComponent(); + } + + public get showOneCategoryInPropertyGrid(): boolean { + return this._showOneCategoryInPropertyGrid; + } + public set showOneCategoryInPropertyGrid(newValue) { + if (this._showOneCategoryInPropertyGrid !== newValue) { + this._showOneCategoryInPropertyGrid = newValue; + this.creator.sidebar.hideSideBarVisibilityControlActions = newValue; + this.propertyGrid.showOneCategoryInPropertyGrid = newValue; + this.propertyGrid["setObj"](this.creator.selectedElement); + if (this.creator.activeTab === "designer") { + this.updateActivePage(); + this.updateTabControl(); + } + } + } + private syncTheme(theme?: ICreatorTheme) { const newTheme = theme || this.themeModel.toJSON(); this.creator.syncTheme(newTheme, this.themeModel.isLight); @@ -299,9 +214,20 @@ export class TabDesignerPlugin extends TabDesignerPluginBase { this.updatePredefinedColorChoices(); } - constructor(creator: SurveyCreatorModel) { - super(creator); + constructor(private creator: SurveyCreatorModel) { creator.addTab({ name: "designer", plugin: this, iconName: TabDesignerPlugin.iconName }); + this.tabControlModelValue = new TabControlModel(this.creator.sidebar); + this.tabControlModel.onTopToolbarItemCreated = (bar) => { + this.setupPropertyGridTabActions(bar); + }; + this.propertyGrid = new PropertyGridModel(undefined, creator, creator.getPropertyGridDefinition()); + this.showOneCategoryInPropertyGrid = creator.showOneCategoryInPropertyGrid; + this.propertyGrid.showOneCategoryInPropertyGrid = this.showOneCategoryInPropertyGrid; + this.propertyGrid.obj = creator.survey; + this.propertyGridViewModel = new PropertyGridViewModel(this.propertyGrid, creator); + this.propertyGridViewModel.onNewSurveyCreatedCallback = () => { + this.updateTabControlActions(); + }; this.propertyGridPlaceholderPage = this.creator.sidebar.addPage("propertyGridPlaceholder", "svc-property-grid-placeholder", this.propertyGridViewModel); this.propertyGridPlaceholderPage.caption = editorLocalization.getString("ed.surveySettings"); @@ -366,6 +292,68 @@ export class TabDesignerPlugin extends TabDesignerPluginBase { }); } + private updateTabControlActions() { + if (this.showOneCategoryInPropertyGrid) { + if (this.tabControlModel.isTopToolbarCreated) { + this.setupPropertyGridTabActions(this.tabControlModel.topToolbar); + } + this.propertyGrid.survey.onCurrentPageChanged.add((sender: SurveyModel, options: CurrentPageChangedEvent) => { + const pgTabs = this.tabControlModel.topToolbar.actions; + pgTabs.forEach(action => { + action.active = action.id === options.newCurrentPage.name; + }); + this.propertyGridViewModel.objectSelectionAction.title = options.newCurrentPage.title; + }); + this.propertyGrid.survey.onPageVisibleChanged.add((sender: SurveyModel, options: PageVisibleChangedEvent) => { + const action = this.tabControlModel.topToolbar.getActionById(options.page.name); + if (!!action) { + action.visible = options.page.isVisible; + } + }); + + this.propertyGridViewModel.objectSelectionAction.title = this.propertyGrid.survey.currentPage?.title; + } + } + private setupPropertyGridTabActions(topToolbar: ActionContainer) { + const pgTabs = this.getPropertyGridTabActions(); + topToolbar.setItems(pgTabs); + this.propertyGridTab.activateCallback = () => { + if (!this.propertyGrid.survey.currentPage) return; + + pgTabs.forEach(action => { + action.active = action.id === this.propertyGrid.survey.currentPage.name; + }); + }; + this.propertyGridTab.deactivateCallback = () => { + pgTabs.forEach(tab => tab.active = false); + }; + } + private getPropertyGridTabActions() { + const pgTabs = []; + this.propertyGrid.survey.pages.forEach(p => { + if (p.elements.length === 0) return; + + const action = new MenuButton({ + id: p.name, + tooltip: p.title, + iconName: p["iconName"], + iconSize: "auto", + active: this.activePageIsPropertyGrid && p.name === this.propertyGrid.survey.currentPage.name, + pressed: false, + visible: p.isVisible, + action: () => { + this.creator.sidebar.expandSidebar(); + this.setPropertyGridIsActivePage(); + this.propertyGrid.survey.currentPage = p; + pgTabs.forEach(i => i.active = false); + action.active = true; + } + }); + pgTabs.push(action); + }); + return pgTabs; + } + public activate(): void { this.model = new TabDesignerViewModel(this.creator); this.model.surfaceScale = this.creator.survey.widthScale; diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index 3ee97dca34..375e8d35ac 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -1,5 +1,5 @@ import { Helpers, IDialogOptions, MatrixDynamicRowModel, QuestionMatrixDynamicModel, settings, SurveyModel } from "survey-core"; -import { SurveyCreatorModel, editorLocalization, CreatorPresetBase, ICreatorOptions } from "survey-creator-core"; +import { PropertyGridModel, SurveyCreatorModel, editorLocalization, CreatorPresetBase, ICreatorOptions } from "survey-creator-core"; export interface ICreatorPresetEditorSetup { creator: SurveyCreatorModel; @@ -7,6 +7,7 @@ export interface ICreatorPresetEditorSetup { } export class CreatorPresetEditableBase { + private propertyGrid: PropertyGridModel; public parent: CreatorPresetEditableBase; public children: Array = []; public constructor(public preset: CreatorPresetBase) { @@ -82,7 +83,11 @@ export class CreatorPresetEditableBase { this.disposeCore(); this.children.forEach(item => item.dispose()); } + protected propertyGridSetObj(obj: any) { + this.propertyGrid["setObj"](obj); + } public setupQuestions(model: SurveyModel, creatorSetup: ICreatorPresetEditorSetup): void { + this.propertyGrid = creatorSetup.creator["designerPropertyGrid"]; this.setupQuestionsCore(model, creatorSetup); this.children.forEach(item => { item.setupQuestions(model, creatorSetup); diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index ed37ec0f97..06e27c8966 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -1,7 +1,32 @@ -import { Helpers, ItemValue, QuestionCheckboxBase, QuestionCheckboxModel, surveyLocalization, SurveyModel } from "survey-core"; +import { Base, Serializer, ItemValue, QuestionCheckboxBase, QuestionCheckboxModel, surveyLocalization, SurveyModel } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; import { editorLocalization, SurveyCreatorModel } from "survey-creator-core"; +class LocalizationPreview extends Base { + public get locale(): string { + return this.getPropertyValueWithoutDefault("locale") || surveyLocalization.currentLocale; + } + public set locale(value: string) { + if (value === surveyLocalization.defaultLocale && !surveyLocalization.currentLocale) { + value = ""; + } + this.setPropertyValue("locale", value); + } +} + +Serializer.addClass("localizationPreview", [ + { + name: "locale", + category: "general", + choices: () => { + return surveyLocalization.getLocales(true); + }, + onGetValue: (obj: any): any => { + return obj.locale == surveyLocalization.defaultLocale ? null : obj.locale; + }, + }], ()=> new LocalizationPreview(), "base"); + +const locPreview = Serializer.createClass("localizationPreview"); export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { public createMainPageCore(): any { return { @@ -70,6 +95,11 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { question.selectAll(); } } + protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel): void { + this.propertyGridSetObj(locPreview); + creator.toolbox.forceCompact = true; + creator.setShowSidebar(true); + } protected updateOnValueChangedCore(model: SurveyModel, name: string): void { if (name === this.surveyUseEnglishNames) { this.updateLocaleNames(model); diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 346f9e1465..2c0a7831c4 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -253,6 +253,7 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare { type: "dropdown", name: this.nameSelector, + allowClear: false, clearIfInvisible: "onHidden", title: "Select an element to customize its settings available in the Property Grid" }, @@ -305,10 +306,9 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare this.updateCurrentJson(model); return { definition: this.currentJson }; } - private propertyGrid: PropertyGridModel; + protected setupQuestionsCore(model: SurveyModel, creatorSetup: ICreatorPresetEditorSetup): void { this.getSelector(model).choices = this.getSelectorChoices(creatorSetup.creator); - this.propertyGrid = creatorSetup.creator["designerPropertyGrid"]; const oldSearchValue = settings.propertyGrid.enableSearch; settings.propertyGrid.enableSearch = false; // this.propCreatorValue = creatorSetup.createCreator(options); @@ -329,6 +329,12 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare protected updateJsonLocalizationStringsCore(locStrs: any): void { this.localeStrings = { pe: locStrs.pe || {}, pehelp: locStrs.pehelp || {} }; } + + protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel): void { + creator.toolbox.forceCompact = true; + creator.setShowSidebar(true); + } + // private isPropCreatorChanged: boolean; private firstTimeLoading = false; protected updateOnValueChangedCore(model: SurveyModel, name: string): void { @@ -380,7 +386,7 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare this.currentClassName = selQuestion.value; if (!this.currentClassName) return; this.currentProperties = new SurveyQuestionPresetPropertiesDetail(this.currentClassName, this.currentJson); - this.propertyGrid["setObj"](this.currentProperties.getObj()); + this.propertyGridSetObj(this.currentProperties.getObj()); const categories = this.currentProperties.getInitialJson(); this.defaultItems = []; model.setValue(this.nameCategories, categories); @@ -390,12 +396,14 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare } protected setupQuestionsValueCore(model: SurveyModel, json: any, creator: SurveyCreatorModel): void { + this.getSelector(model).value = "survey"; this.isModified = !!json; if (!json) { json = this.copyJson(defaultPropertyGridDefinition); } this.currentJson = json; this.currentJson.autoGenerateProperties = false; + this.updateOnValueChangedCore(model, this.nameSelector); } private getSelector(model: SurveyModel): QuestionDropdownModel { return model.getQuestionByName(this.nameSelector); } // private getPropertyCreatorQuestion(model: SurveyModel): QuestionEmbeddedCreatorModel { return model.getQuestionByName(this.namePropertyCreator); } diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index d5766b280d..45f0261beb 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -115,6 +115,12 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { private getAllTabs(creator: SurveyCreatorModel) { return creator.getAvailableTabs().map(t => ({ name: t.name, title: editorLocalization.getString("tabs." + t.name), iconName: t.iconName })); } + + protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel): void { + creator.toolbox.forceCompact = false; + creator.setShowSidebar(false); + } + protected setupQuestionsValueCore(model: SurveyModel, json: any, creator: SurveyCreatorModel): void { json = json || {}; let items = json["items"] || []; diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index e3cb7bd85f..857df3c6db 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -220,6 +220,12 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita } super.onMatrixRowRemoving(model, creator, options); } + + protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel): void { + creator.toolbox.forceCompact = false; + creator.setShowSidebar(false); + } + protected setupQuestionsCore(model: SurveyModel, creatorSetup: ICreatorPresetEditorSetup): void { this.setupPageQuestions(model, creatorSetup.creator); } diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index cf8b502d6b..4dd2c19990 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -1,25 +1,28 @@ import { createDropdownActionModel, Base, SurveyModel, Action, ComputedUpdater, CurrentPageChangedEvent, PageVisibleChangedEvent, QuestionDropdownModel, ActionContainer, IAction } from "survey-core"; -import { TabDesignerPluginBase, SurveyCreatorModel, listComponentCss, saveToFileHandler, TabControlModel, SidebarPageModel, PropertyGridViewModel, PropertyGridModel } from "survey-creator-core"; +import { ICreatorPlugin, SurveyCreatorModel, listComponentCss, saveToFileHandler, TabControlModel, SidebarPageModel, PropertyGridViewModel, PropertyGridModel } from "survey-creator-core"; import { CreatorPresetEditorModel } from "./presets-editor"; -export class TabPresetsPlugin extends TabDesignerPluginBase { +export class TabPresetsPlugin implements ICreatorPlugin { public model: CreatorPresetEditorModel | undefined; public static iconName = "icon-settings"; private currentPresetIndex = 0; - constructor(creator: SurveyCreatorModel) { - super(creator); + private currentValue; + private designerPlugin; + + constructor(private creator: SurveyCreatorModel) { creator.addTab({ name: "presets", plugin: this, iconName: TabPresetsPlugin.iconName }); - //this.propertyGridTab = this.creator.sidebar.addPage("propertyGridPresets", "svc-property-grid", this.propertyGridViewModel); - this.propertyGridTab = this.creator.sidebar.getPageById("propertyGrid"); + this.designerPlugin = creator.getPlugin("designer"); } public saveToFileHandler = saveToFileHandler; public activate(): void { this.model = new CreatorPresetEditorModel({}, this.creator); + if (this.currentValue) { + this.model.model.data = this.currentValue; + } this.model.model.currentPageNo = this.currentPresetIndex; - this.updateActivePage(); - this.updateTabControl(); + this.designerPlugin.activateSidebar(); const presets = this.model?.model.pages.map(p => { id: p.name, title: p.navigationTitle }); const tools = [ @@ -32,6 +35,7 @@ export class TabPresetsPlugin extends TabDesignerPluginBase { presets.forEach(p => { p.action = (item)=>{ settingsAction.popupModel.contentComponentData.model.selectedItem = item; + settingsAction.popupModel.show(); this.model.model.currentPage = this.model.model.getPageByName(item.id); }; }); @@ -48,11 +52,16 @@ export class TabPresetsPlugin extends TabDesignerPluginBase { // onHide: () => { this.languageSelectorAction.enabled = true; }, // onShow: () => { this.languageSelectorAction.enabled = false; } }, this.creator); - - this.tabControlModel.bottomToolbar.setItems([settingsAction]); + const bottomActions = this.designerPlugin.tabControlModel.bottomToolbar.actions; + bottomActions.forEach(a => a.visible = false); + bottomActions.unshift(settingsAction); } public deactivate(): boolean { + this.currentValue = this.model?.model.data; + const bottomActions = this.designerPlugin.tabControlModel.bottomToolbar.actions; + bottomActions.forEach(a => a.visible = true); + bottomActions.splice(0, 1); this.currentPresetIndex = this.model?.model.currentPageNo || 0; if (this.model) { this.model.dispose(); From 9d4c58b7b2f66e0fc9d2b1096b1b0cc47b4bfeba Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 23 Jul 2025 12:14:13 +0300 Subject: [PATCH 015/240] 7004 - preview languages --- .../src/presets/presets-editable-languages.ts | 7 +++++-- .../src/presets/presets-editable-properties.ts | 1 + packages/survey-creator-core/src/presets/presets-editor.ts | 1 + packages/survey-creator-core/src/presets/presets-plugin.ts | 3 +++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index 06e27c8966..b34ea2a74d 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -3,6 +3,9 @@ import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets- import { editorLocalization, SurveyCreatorModel } from "survey-creator-core"; class LocalizationPreview extends Base { + public getType(): string { + return "localizationpreview"; + } public get locale(): string { return this.getPropertyValueWithoutDefault("locale") || surveyLocalization.currentLocale; } @@ -14,7 +17,7 @@ class LocalizationPreview extends Base { } } -Serializer.addClass("localizationPreview", [ +Serializer.addClass("localizationpreview", [ { name: "locale", category: "general", @@ -26,7 +29,7 @@ Serializer.addClass("localizationPreview", [ }, }], ()=> new LocalizationPreview(), "base"); -const locPreview = Serializer.createClass("localizationPreview"); +const locPreview = Serializer.createClass("localizationpreview"); export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { public createMainPageCore(): any { return { diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 2c0a7831c4..fab95b3652 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -331,6 +331,7 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare } protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel): void { + this.propertyGridSetObj(this.currentProperties?.getObj()); creator.toolbox.forceCompact = true; creator.setShowSidebar(true); } diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 78b0890179..3a6eb29918 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -110,6 +110,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit const json = this.preset.getJson() || {}; editablePresets.forEach(item => item.setupQuestionsValue(model, json[item.path], this.creator)); this.updateJsonLocalizationStrings(editablePresets); + editablePresets.forEach(item => item.setupOnCurrentPage(model, this.creator)); model.onCurrentPageChanged.add((sender, options) => { editablePresets.forEach(item => item.setupOnCurrentPage(model, this.creator)); }); diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 4dd2c19990..a913bdc770 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -8,10 +8,12 @@ export class TabPresetsPlugin implements ICreatorPlugin { private currentPresetIndex = 0; private currentValue; private designerPlugin; + private toolboxCompact; constructor(private creator: SurveyCreatorModel) { creator.addTab({ name: "presets", plugin: this, iconName: TabPresetsPlugin.iconName }); this.designerPlugin = creator.getPlugin("designer"); + this.toolboxCompact = creator.toolbox.forceCompact; } public saveToFileHandler = saveToFileHandler; @@ -58,6 +60,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { } public deactivate(): boolean { + this.creator.toolbox.forceCompact = this.toolboxCompact; this.currentValue = this.model?.model.data; const bottomActions = this.designerPlugin.tabControlModel.bottomToolbar.actions; bottomActions.forEach(a => a.visible = true); From 2d94983c626fe4492512f1f94594facc52aee362 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 23 Jul 2025 12:50:42 +0300 Subject: [PATCH 016/240] #7004 - plugin title --- packages/survey-creator-core/src/presets/presets-plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index a913bdc770..69ac16eeab 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -11,7 +11,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { private toolboxCompact; constructor(private creator: SurveyCreatorModel) { - creator.addTab({ name: "presets", plugin: this, iconName: TabPresetsPlugin.iconName }); + creator.addTab({ name: "presets", title: "Presets", plugin: this, iconName: TabPresetsPlugin.iconName }); this.designerPlugin = creator.getPlugin("designer"); this.toolboxCompact = creator.toolbox.forceCompact; } From 18bccd607ade5ff5975e57ae2c02d593634b430a Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 23 Jul 2025 14:55:31 +0300 Subject: [PATCH 017/240] #7004 hide expand button --- .../src/components/side-bar/side-bar-model.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/components/side-bar/side-bar-model.ts b/packages/survey-creator-core/src/components/side-bar/side-bar-model.ts index fd38984018..cdfbc4def5 100644 --- a/packages/survey-creator-core/src/components/side-bar/side-bar-model.ts +++ b/packages/survey-creator-core/src/components/side-bar/side-bar-model.ts @@ -157,7 +157,7 @@ export class SidebarModel extends Base { }, locTitleName: "ed.showPanel", visible: new ComputedUpdater(() => { - return notShortCircuitAnd(this.hasVisiblePages, !this.visible, !this.hideSideBarVisibilityControlActions); + return notShortCircuitAnd(!this.creator.showOneCategoryInPropertyGrid, this.hasVisiblePages, !this.visible, !this.hideSideBarVisibilityControlActions); }), showTitle: false }); From b57c3894dded16d8e5e67be29cd82df9c374cdb0 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 23 Jul 2025 18:31:54 +0300 Subject: [PATCH 018/240] #7004 - fixed toolbox category apply --- .../src/presets-creator/presets-toolbox.ts | 21 +++++++------- .../tests/presets.tests.ts | 29 +++++++++++++++++-- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts b/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts index 8d3abbd171..dd168b77ae 100644 --- a/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts +++ b/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts @@ -51,17 +51,16 @@ export class CreatorPresetToolboxConfigurator extends CreatorPresetBase { if (!this.json) return; super.applyCore(creator); creator.toolbox.showCategoryTitles = this.json.showCategoryTitles; - this.applyItems(creator, this.json["definition"]?.map(i => i.name)); - this.applyCategories(creator, this.json["categories"]); - } - private applyItems(creator: SurveyCreatorModel, items: Array): void { - if (!Array.isArray(items)) return; - creator.toolbox.hasCategories = false; - creator.toolbox.defineCategories([{ category: "general", items: items }]); - } - private applyCategories(creator: SurveyCreatorModel, categories: Array): void { - if (!Array.isArray(categories)) return; - creator.toolbox.hasCategories = true; + const items = this.json["definition"]; + const itemNames = items?.map(i => i.name) || []; + let categories = this.json["categories"]; + if (!categories) { + categories = creator.toolbox.categories + .map(c => ({ + category: c.name, + items: c.items.map(i => i.name).filter(name => !itemNames || itemNames.indexOf(name) != -1) + })).filter(c => c.items.length > 0); + } creator.toolbox.defineCategories(categories); } } diff --git a/packages/survey-creator-core/tests/presets.tests.ts b/packages/survey-creator-core/tests/presets.tests.ts index e1a8984cd9..24c361c5a0 100644 --- a/packages/survey-creator-core/tests/presets.tests.ts +++ b/packages/survey-creator-core/tests/presets.tests.ts @@ -77,15 +77,35 @@ test("set toolbox items", () => { const creator = new CreatorTester(); const preset = new CreatorPreset({ toolbox: { - definition: [{ name: "text" }, { name: "dropdown" }, { name: "matrix" }], + definition: [{ name: "text" }, { name: "dropdown" }, { name: "radiogroup" }], } }); preset.apply(creator); const tb = creator.toolbox; tb.flushUpdates(); - expect(tb.categories).toHaveLength(1); + expect(tb.categories).toHaveLength(2); + expect(tb.visibleActions).toHaveLength(3); + expect(tb.hasCategories).toBeTruthy(); +}); +test("set toolbox items and categories", () => { + const creator = new CreatorTester(); + const preset = new CreatorPreset({ + toolbox: { + definition: [{ name: "text", iconName: "i-text" }, { name: "dropdown" }, { name: "matrix" }], + categories: [ + { category: "general", items: ["text", "dropdown"] }, + { category: "matrix", items: ["matrix"] } + ] + } + }); + preset.apply(creator); + const tb = creator.toolbox; + tb.flushUpdates(); + expect(tb.categories).toHaveLength(2); expect(tb.visibleActions).toHaveLength(3); - expect(tb.hasCategories).toBeFalsy(); + expect(tb.hasCategories).toBeTruthy(); + expect(tb.visibleActions[0].name).toBe("text"); + expect(tb.visibleActions[0].iconName).toBe("i-text"); }); test("set toolbox definition", () => { const creator = new CreatorTester(); @@ -96,6 +116,9 @@ test("set toolbox definition", () => { { name: "text-date", title: "Date", json: { type: "text", inputType: "date" } }, { name: "dropdown" }, { name: "matrix" }, + ], + categories: [ + { category: "general", items: ["text-number", "text-date", "dropdown", "matrix"] } ] } }); From bd45a2fd647064bed7c69d92bcfd6c142511f876 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 23 Jul 2025 19:05:48 +0300 Subject: [PATCH 019/240] #7004 - apply on the fly --- .../src/presets/presets-editable-languages.ts | 2 +- packages/survey-creator-core/src/presets/presets-editor.ts | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index b34ea2a74d..a3eedd1601 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -99,7 +99,7 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { } } protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel): void { - this.propertyGridSetObj(locPreview); + //this.propertyGridSetObj(locPreview); creator.toolbox.forceCompact = true; creator.setShowSidebar(true); } diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 3a6eb29918..20d3410b5e 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -32,6 +32,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit private resultModelValue: SurveyModel; private navigationBarValue: NavigationBar; public locTitle: LocalizableString; + private applying = false; constructor(json?: ICreatorPresetData, private creatorValue?: SurveyCreatorModel) { super(); editorLocalization.presetStrings = undefined; @@ -125,6 +126,11 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit editorLocalization.currentLocale = options.value; editablePresets.forEach(item => item.onLocaleChanged(model, json[item.path], this.creator)); } + if (!this.applying) { + this.applying = true; + this.applyFromSurveyModel(); + this.applying = false; + } }); model.onMatrixDetailPanelVisibleChanged.add((sender, options) => { editablePresets.forEach(item => item.updateOnMatrixDetailPanelVisibleChanged(model, this.creator, options)); From ab23eb76433ce520cd5f12ad4291f91cb8c6036e Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 24 Jul 2025 14:26:48 +0300 Subject: [PATCH 020/240] #7004 fixed presets applying --- .../src/presets/presets-editable-languages.ts | 11 +++++++---- .../survey-creator-core/src/presets/presets-editor.ts | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index a3eedd1601..aa1d8fe748 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -2,7 +2,7 @@ import { Base, Serializer, ItemValue, QuestionCheckboxBase, QuestionCheckboxMode import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; import { editorLocalization, SurveyCreatorModel } from "survey-creator-core"; -class LocalizationPreview extends Base { +class LocalizationPreview extends SurveyModel { public getType(): string { return "localizationpreview"; } @@ -27,9 +27,12 @@ Serializer.addClass("localizationpreview", [ onGetValue: (obj: any): any => { return obj.locale == surveyLocalization.defaultLocale ? null : obj.locale; }, - }], ()=> new LocalizationPreview(), "base"); - + }], ()=> new LocalizationPreview(), "survey"); const locPreview = Serializer.createClass("localizationpreview"); +Serializer.getProperties("localizationpreview").forEach(p => { + const property = Serializer.getProperty("localizationpreview", p.name); + property.visible = p.name == "locale"; +}); export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { public createMainPageCore(): any { return { @@ -99,7 +102,7 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { } } protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel): void { - //this.propertyGridSetObj(locPreview); + this.propertyGridSetObj(locPreview); creator.toolbox.forceCompact = true; creator.setShowSidebar(true); } diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 20d3410b5e..44fcc8cd0f 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -129,6 +129,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit if (!this.applying) { this.applying = true; this.applyFromSurveyModel(); + editablePresets.forEach(item => item.setupOnCurrentPage(model, this.creator)); this.applying = false; } }); From 6a9cdc6e120b45b9a3dc0e0f612602381bd97e3f Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 24 Jul 2025 16:45:15 +0300 Subject: [PATCH 021/240] work for #7004 --- .../survey-creator-core/src/presets/presets-editor.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 44fcc8cd0f..dd1140b5e6 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -69,7 +69,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit this.preset.setJson(val); this.modelValue = this.createModel(); this.upldateResultJson(); - this.applyFromSurveyModel(true); + this.applyFromSurveyModel(); } public get jsonText(): string { return JSON.stringify(this.json, null, 2); @@ -117,7 +117,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit }); model.onValueChanging.add((sender, options) => { if (options.name === "languages_creator") { - this.applyFromSurveyModel(true); + this.applyFromSurveyModel(); } }); model.onValueChanged.add((sender, options) => { @@ -128,7 +128,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit } if (!this.applying) { this.applying = true; - this.applyFromSurveyModel(); + this.applyFromSurveyModel(false); editablePresets.forEach(item => item.setupOnCurrentPage(model, this.creator)); this.applying = false; } @@ -240,8 +240,8 @@ preset.apply(creator); private upldateResultJson(): void { this.resultModelValue.getQuestionByName("json").value = this.jsonText; } - public applyFromSurveyModel(reCreateCretor: boolean = true): boolean { - if (!this.validateEditableModel(this.model)) return false; + public applyFromSurveyModel(validate = true): boolean { + if (validate && !this.validateEditableModel(this.model)) return false; // if (reCreateCretor) { // const json = this.creator?.JSON || {}; // this.creatorValue = this.createCreator({}); From 6038315f816342e20c3c59a987c0909405596cf9 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 24 Jul 2025 18:38:06 +0300 Subject: [PATCH 022/240] test for toolbox reorder #7004 --- .../presets-editor-toolbox.tests.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts index 5cef32ef07..b45b15623b 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts @@ -119,6 +119,30 @@ test("Preset edit, toolbox - change item", () => { expect(editor.json.toolbox.definition.filter(i => i.name == "text")[0].tooltip).toEqual("tooltip-test"); }); +test("Preset edit, toolbox - reorder items", () => { + const editor = new CreatorPresetEditorModel(); + expect(editor.applyFromSurveyModel()).toBeTruthy(); + const survey = editor.model; + const categQuestion = survey.getQuestionByName("toolbox_categories"); + const matrixQuestion = survey.getQuestionByName("toolbox_matrix"); + expect(matrixQuestion.visibleRows).toHaveLength(0); + expect(categQuestion.visibleRows).toHaveLength(5); + const row = categQuestion.visibleRows[1]; + row.showDetailPanel(); + const itemsQuestion = row.getQuestionByName("items"); + expect(itemsQuestion.visibleRows.map(r => r.getValue("name"))).toStrictEqual(["text", "comment", "multipletext"]); + const value = itemsQuestion.value; + value.push(value[0]); + value.splice(0, 1); + itemsQuestion.value = value; + expect(editor.applyFromSurveyModel()).toBeTruthy(); + expect(editor.json.toolbox).toBeDefined(); + const length = editor.json.toolbox.definition.length; + expect(editor.json.toolbox.definition.map(i => i.name)).toContain("text"); + expect(editor.json.toolbox.definition.map(i => i.name)).not.toContain("comment"); + expect(editor.json.toolbox.categories[1].items).toStrictEqual(["comment", "multipletext", "text"]); +}); + test("Preset edit, toolbox - change category", () => { const editor = new CreatorPresetEditorModel(); expect(editor.applyFromSurveyModel()).toBeTruthy(); From 0b4cdbab59d387e9b9246d14094cbb34ed644cd8 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 25 Jul 2025 15:44:00 +0300 Subject: [PATCH 023/240] fixing tests #7004 --- .../survey-creator-core/src/creator-base.ts | 9 ++++---- .../src/presets-creator/presets-toolbox.ts | 2 +- .../src/presets/presets-editable-base.ts | 1 + .../presets/presets-editable-categorized.ts | 4 ++++ .../src/presets/presets-editable-languages.ts | 3 +++ .../src/presets/presets-editable-tabs.ts | 10 ++++++-- .../src/presets/presets-editable-toolbox.ts | 9 +++++--- .../src/presets/presets-editor.ts | 12 ++++++---- .../presets-editor-toolbox.tests.ts | 23 ------------------- .../tests-presets/presets-editor.tests.ts | 15 +----------- 10 files changed, 36 insertions(+), 52 deletions(-) diff --git a/packages/survey-creator-core/src/creator-base.ts b/packages/survey-creator-core/src/creator-base.ts index 72a796c795..40ba10cf5e 100644 --- a/packages/survey-creator-core/src/creator-base.ts +++ b/packages/survey-creator-core/src/creator-base.ts @@ -1915,14 +1915,13 @@ export class SurveyCreatorModel extends Base } return res; } - public getTabNames(): Array { - const tabNames = this.getAvailableTabs().map(t => t.name); + public getTabs(): Array { + const tabs = this.getAvailableTabs(); const res = []; this.tabs.forEach(tab => { const name = this.fixPluginName(tab.id); - if (tabNames.indexOf(name) > -1) { - res.push(name); - } + const newtab = tabs.filter(t => t.name === name)[0]; + if (newtab) res.push(newtab); }); return res; } diff --git a/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts b/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts index dd168b77ae..218c3eaa99 100644 --- a/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts +++ b/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts @@ -58,7 +58,7 @@ export class CreatorPresetToolboxConfigurator extends CreatorPresetBase { categories = creator.toolbox.categories .map(c => ({ category: c.name, - items: c.items.map(i => i.name).filter(name => !itemNames || itemNames.indexOf(name) != -1) + items: c.items?.map(i => i.name).filter(name => !itemNames || itemNames.indexOf(name) != -1) })).filter(c => c.items.length > 0); } creator.toolbox.defineCategories(categories); diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index 375e8d35ac..91b3543deb 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -36,6 +36,7 @@ export class CreatorPresetEditableBase { }); return res; } + public get questionNames(): string[] { return []; } public validate(model: SurveyModel): boolean { if (!this.validateCore(model)) return false; for (let i = 0; i < this.children.length; i ++) { diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index d6042249f0..822607f8b3 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -17,6 +17,10 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre //private fillAutoName(question: QuestionMatrixDynamicModel, propName: string) { // question.value?.filter(v =>v.isDefault === false && !v[propName]).forEach(v => v[propName] = this.replaceNonLettersWithDash(v.title)); //} + public get questionNames() { + return [this.nameCategories]; + } + protected updateOnValueChangedCore(model: SurveyModel, name: string) { // if (name == this.nameCategories) { // this.fillAutoName(this.getQuestionCategories(model), "category"); diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index aa1d8fe748..47769749c9 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -114,6 +114,9 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { private get creatorLocaleName() : string { return this.path + "_creator"; } private get surveyLocalesName(): string { return this.path + "_surveyLocales"; } private get surveyUseEnglishNames(): string { return this.path + "_surveyUseEnglishNames"; } + public get questionNames() { + return [this.creatorLocaleName, this.surveyLocalesName, this.surveyUseEnglishNames]; + } private getIsShowInEnglishSelected(model: SurveyModel): boolean { return model.getValue(this.surveyUseEnglishNames) === true; } private getCreatorLocales(): Array { return this.getLocaleItemValues(editorLocalization.getLocales(), false); diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index 45f0261beb..70ce94e0e8 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -66,11 +66,17 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { ] }; } + + public get questionNames() { + return [this.nameItems, this.nameActiveTab]; + } + protected getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel): any { let items = model.getValue(this.nameItems); if (!Array.isArray(items)) return undefined; - let activeTabChoices = items.map(i => ({ name: i.name, iconName: i.iconName })); - if (Helpers.isArraysEqual(activeTabChoices.map(i => i.name), creator.getTabNames(), false)) { + const creatorTabs = creator.getTabs(); + let activeTabChoices = items.map(i => ({ name: i.name, iconName: i.iconName || creatorTabs.filter(t => t.name == i.name)[0]?.iconName })); + if (Helpers.isArraysEqual(activeTabChoices, creatorTabs, false)) { activeTabChoices = undefined; } let activeTab = model.getValue(this.nameActiveTab); diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 857df3c6db..c3fedb844a 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -148,6 +148,9 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita public get nameCategoriesMode() { return this.fullPath + "_mode"; } protected get nameItems() { return this.fullPath + "_items"; } protected get nameShowCategoryTitles() { return this.fullPath + "_showCategoryTitles"; } + public get questionNames() { + return [this.nameCategories, this.nameItems, this.nameShowCategoryTitles]; + } public getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel): any { const res: any = {}; @@ -173,9 +176,9 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita for (let i = 0; i < categories.length; i++) { if (categories[i].category !== toolboxCategories[i].name) return false; if (categories[i].title !== toolboxCategories[i].title) return false; - const toolboxItems = toolboxCategories[i].items.map(item => item.name); + const toolboxItems = toolboxCategories[i].items?.map(item => item.name); const categoryItems = categories[i].items; - if (!Helpers.isTwoValueEquals(categoryItems, toolboxItems, true)) return false; + if (!Helpers.isTwoValueEquals(categoryItems, toolboxItems)) return false; } return true; } @@ -183,7 +186,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita private getCategoriesJson(model: SurveyModel): any { const categories = model.getValue(this.nameCategories); if (!Array.isArray(categories)) return undefined; - return categories.map(c => ({ category: c.category, title: c.title, items: c.items.map(i => i.name) })); + return categories.map(c => ({ category: c.category, title: c.title, items: c.items?.map(i => i.name) })); } private cleanIfNotDiffers(item, defaultItem) { if (!defaultItem) return true; diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index dd1140b5e6..21ae4d486f 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -120,17 +120,16 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit this.applyFromSurveyModel(); } }); + const questionNames = editablePresets.map(preset => preset.questionNames).reduce((acc, current) => acc.concat(current), []); model.onValueChanged.add((sender, options) => { editablePresets.forEach(item => item.updateOnValueChanged(model, options.name)); if (options.name === "languages_creator") { editorLocalization.currentLocale = options.value; editablePresets.forEach(item => item.onLocaleChanged(model, json[item.path], this.creator)); } - if (!this.applying) { - this.applying = true; + if (questionNames.indexOf(options.name) != -1 && !this.applying) { this.applyFromSurveyModel(false); editablePresets.forEach(item => item.setupOnCurrentPage(model, this.creator)); - this.applying = false; } }); model.onMatrixDetailPanelVisibleChanged.add((sender, options) => { @@ -241,7 +240,11 @@ preset.apply(creator); this.resultModelValue.getQuestionByName("json").value = this.jsonText; } public applyFromSurveyModel(validate = true): boolean { - if (validate && !this.validateEditableModel(this.model)) return false; + this.applying = true; + if (validate && !this.validateEditableModel(this.model)) { + this.applying = false; + return false; + } // if (reCreateCretor) { // const json = this.creator?.JSON || {}; // this.creatorValue = this.createCreator({}); @@ -250,6 +253,7 @@ preset.apply(creator); this.preset.setJson(this.getJsonFromSurveyModel()); this.model.setValue("json_result", JSON.stringify(this.preset.getJson(), null, 2)); this.preset.apply(this.creator, true); + this.applying = false; return true; } public getJsonFromSurveyModel(): any { diff --git a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts index b45b15623b..ad1501a0db 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts @@ -13,7 +13,6 @@ import { CreatorPresetEditableCaregorizedListConfigurator } from "../src/presets test("Preset edit, toolbox - remove item from categories", () => { const editor = new CreatorPresetEditorModel(); - expect(editor.applyFromSurveyModel()).toBeTruthy(); const survey = editor.model; const categQuestion = survey.getQuestionByName("toolbox_categories"); const matrixQuestion = survey.getQuestionByName("toolbox_matrix"); @@ -27,21 +26,18 @@ test("Preset edit, toolbox - remove item from categories", () => { expect(itemsQuestion.visibleRows.map(r => r.getValue("name"))).toStrictEqual(["text", "multipletext"]); expect(matrixQuestion.visibleRows).toHaveLength(1); expect(matrixQuestion.visibleRows.map(r => r.getValue("name"))).toStrictEqual(["comment"]); - expect(editor.applyFromSurveyModel()).toBeTruthy(); expect(editor.json.toolbox).toBeDefined(); const length = editor.json.toolbox.definition.length; expect(editor.json.toolbox.definition.map(i => i.name)).toContain("text"); expect(editor.json.toolbox.definition.map(i => i.name)).not.toContain("comment"); expect(editor.json.toolbox.categories[1].items).toStrictEqual(["text", "multipletext"]); itemsQuestion.removeRow(0); - editor.applyFromSurveyModel(); expect(editor.json.toolbox.categories[1].items).toStrictEqual(["multipletext"]); expect(editor.json.toolbox.definition.length).toBe(length - 1); }); test("Preset edit, toolbox - remove whole category from categories", () => { const editor = new CreatorPresetEditorModel(); - expect(editor.applyFromSurveyModel()).toBeTruthy(); const survey = editor.model; const categQuestion = survey.getQuestionByName("toolbox_categories"); const matrixQuestion = survey.getQuestionByName("toolbox_matrix"); @@ -50,14 +46,12 @@ test("Preset edit, toolbox - remove whole category from categories", () => { const row = categQuestion.visibleRows[1]; categQuestion.removeRow(1); expect(matrixQuestion.visibleRows.map(r => r.getValue("name"))).toStrictEqual(["text", "comment", "multipletext"]); - expect(editor.applyFromSurveyModel()).toBeTruthy(); expect(editor.json.toolbox).toBeDefined(); expect(editor.json.toolbox.categories.length).toBe(4); }); test("Preset edit, toolbox - remove item from flat items", () => { const editor = new CreatorPresetEditorModel(); - expect(editor.applyFromSurveyModel()).toBeTruthy(); const survey = editor.model; survey.getQuestionByName("toolbox_mode").value = "items"; const itemsQuestion = survey.getQuestionByName("toolbox_items"); @@ -71,7 +65,6 @@ test("Preset edit, toolbox - remove item from flat items", () => { test("Preset edit, toolbox - remove item from hidden items to flat items", () => { const editor = new CreatorPresetEditorModel(); - expect(editor.applyFromSurveyModel()).toBeTruthy(); const survey = editor.model; survey.getQuestionByName("toolbox_mode").value = "items"; const itemsQuestion = survey.getQuestionByName("toolbox_items"); @@ -86,7 +79,6 @@ test("Preset edit, toolbox - remove item from hidden items to flat items", () => test("Preset edit, toolbox - remove item from hidden items to general category", () => { const editor = new CreatorPresetEditorModel(); - expect(editor.applyFromSurveyModel()).toBeTruthy(); const survey = editor.model; survey.getQuestionByName("toolbox_mode").value = "categories"; const categQuestion = survey.getQuestionByName("toolbox_categories"); @@ -101,7 +93,6 @@ test("Preset edit, toolbox - remove item from hidden items to general category", test("Preset edit, toolbox - change item", () => { const editor = new CreatorPresetEditorModel(); - expect(editor.applyFromSurveyModel()).toBeTruthy(); const survey = editor.model; const categQuestion = survey.getQuestionByName("toolbox_categories"); const row = categQuestion.visibleRows[1]; @@ -109,19 +100,16 @@ test("Preset edit, toolbox - change item", () => { const itemsQuestion = row.getQuestionByName("items"); itemsQuestion.visibleRows[1].showDetailPanel(); itemsQuestion.visibleRows[1].detailPanel.getQuestionByName("iconName").value = "icon-test"; - editor.applyFromSurveyModel(); expect(editor.json.toolbox.definition.filter(i => i.name == "comment")[0].iconName).toEqual("icon-test"); expect(editor.json.toolbox.definition.filter(i => i.name == "text")[0].iconName).toBeUndefined(); expect(editor.json.toolbox.definition.filter(i => i.name == "text")[0].tooltip).toBeUndefined(); itemsQuestion.visibleRows[0].showDetailPanel(); itemsQuestion.visibleRows[0].getQuestionByName("tooltip").value = "tooltip-test"; - editor.applyFromSurveyModel(); expect(editor.json.toolbox.definition.filter(i => i.name == "text")[0].tooltip).toEqual("tooltip-test"); }); test("Preset edit, toolbox - reorder items", () => { const editor = new CreatorPresetEditorModel(); - expect(editor.applyFromSurveyModel()).toBeTruthy(); const survey = editor.model; const categQuestion = survey.getQuestionByName("toolbox_categories"); const matrixQuestion = survey.getQuestionByName("toolbox_matrix"); @@ -135,11 +123,8 @@ test("Preset edit, toolbox - reorder items", () => { value.push(value[0]); value.splice(0, 1); itemsQuestion.value = value; - expect(editor.applyFromSurveyModel()).toBeTruthy(); expect(editor.json.toolbox).toBeDefined(); - const length = editor.json.toolbox.definition.length; expect(editor.json.toolbox.definition.map(i => i.name)).toContain("text"); - expect(editor.json.toolbox.definition.map(i => i.name)).not.toContain("comment"); expect(editor.json.toolbox.categories[1].items).toStrictEqual(["comment", "multipletext", "text"]); }); @@ -166,7 +151,6 @@ test("Preset edit, toolbox - change category", () => { itemsQuestion.value = value; itemsQuestion2.value = value2; - editor.applyFromSurveyModel(); expect(editor.json.toolbox.categories[1].items).toStrictEqual(["text", "comment", "multipletext", "panel"]); expect(editor.json.toolbox.categories[2].items).toStrictEqual(["paneldynamic"]); @@ -174,7 +158,6 @@ test("Preset edit, toolbox - change category", () => { test("Preset edit, toolbox - switch to items mode", () => { const editor = new CreatorPresetEditorModel(); - expect(editor.applyFromSurveyModel()).toBeTruthy(); const survey = editor.model; const categQuestion = survey.getQuestionByName("toolbox_categories"); const row = categQuestion.visibleRows[1]; @@ -191,13 +174,11 @@ test("Preset edit, toolbox - switch to items mode", () => { expect(itemRow.getValue("iconName")).toBe("icon-test"); itemRow.detailPanel.getQuestionByName("iconName").value = "icon-test2"; - editor.applyFromSurveyModel(); expect(editor.json.toolbox.definition.filter(i => i.name == "comment")[0].iconName).toEqual("icon-test2"); }); test("Preset edit, toolbox - switch to categories mode", () => { const editor = new CreatorPresetEditorModel(); - expect(editor.applyFromSurveyModel()).toBeTruthy(); const survey = editor.model; survey.getQuestionByName("toolbox_mode").value = "items"; const allItemsQuestion = survey.getQuestionByName("toolbox_items"); @@ -254,7 +235,6 @@ test("Preset edit, toolbox - reset category", () => { test("Preset edit, toolbox - default names in categories", () => { const editor = new CreatorPresetEditorModel(); - expect(editor.applyFromSurveyModel()).toBeTruthy(); const survey = editor.model; const categoriesQuestion = survey.getQuestionByName("toolbox_categories"); categoriesQuestion.value = categoriesQuestion.value.filter(v => ["text", "containers"].indexOf(v.category) >= 0); @@ -271,7 +251,6 @@ test("Preset edit, toolbox - default names in categories", () => { test("Preset edit, toolbox - default names in items", () => { const editor = new CreatorPresetEditorModel(); - expect(editor.applyFromSurveyModel()).toBeTruthy(); const survey = editor.model; const categoriesQuestion = survey.getQuestionByName("toolbox_categories"); const itemsQuestion = survey.getQuestionByName("toolbox_matrix"); @@ -291,7 +270,6 @@ test("Preset edit, toolbox - default names in items", () => { test("Preset edit, toolbox - edit category", () => { const editor = new CreatorPresetEditorModel(); - expect(editor.applyFromSurveyModel()).toBeTruthy(); const survey = editor.model; const categQuestion = survey.getQuestionByName("toolbox_categories"); @@ -332,7 +310,6 @@ test("Preset edit, toolbox - edit category", () => { test("Preset edit, toolbox - edit item", () => { const editor = new CreatorPresetEditorModel(); - expect(editor.applyFromSurveyModel()).toBeTruthy(); const survey = editor.model; const matrixQuestion = survey.getQuestionByName("toolbox_matrix") as QuestionMatrixDynamicModel; diff --git a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts index d1f73ceeef..57f143abf9 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts @@ -349,6 +349,7 @@ test("Preset edit model, property grid, setup", () => { expect(checkSelectorChoice("empty")).toBeFalsy(); expect(checkSelectorChoice("nonvalue")).toBeFalsy(); expect(checkSelectorChoice("textwithbutton")).toBeFalsy(); + selectorQuestion.value = null; const panel = survey.getPanelByName("propPanel"); expect(panel.isVisible).toBeFalsy(); selectorQuestion.value = "survey"; @@ -565,7 +566,6 @@ test("Change localization strings for tabs", () => { expect(loc.en.tabs.logic).toBeFalsy(); expect(editor.creator.tabs[0].locTitle.text).toEqual("Designer edit"); item.getQuestionByName("title").value = "Designer"; - editor.applyFromSurveyModel(); loc = editor.json.localization; expect(loc).toBeFalsy(); }); @@ -852,19 +852,6 @@ test("Preset edit model, toolbox categories, restore after creator locale change survey.setValue("toolbox_mode", "categories"); expect(matrix.rowCount).toBe(rowCount); }); -test("Preset edit model, tabs page with creator, default items", () => { - const editor = new CreatorPresetEditorModel({}); - const survey = editor.model; - const itemsQuestion = survey.getQuestionByName("tabs_items"); - itemsQuestion.value = ["preview", "logic"]; - const nextBtn = survey.navigationBar.getActionById("sv-nav-next"); - expect(nextBtn.isVisible).toBeTruthy(); - survey.currentPageNo = survey.visiblePages.length - 1; - expect(survey.isLastPage).toBeTruthy(); - expect(nextBtn.isVisible).toBeTruthy(); - nextBtn.action(); - expect(survey.isFirstPage).toBeTruthy(); -}); test("Preset edit model, save creator JSON on applying new preset", () => { const editor = new CreatorPresetEditorModel({}); const survey = editor.model; From 9a809bdaa0ac159427d2123d6f4ba9c131115fa1 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 25 Jul 2025 18:57:20 +0300 Subject: [PATCH 024/240] #7004 - tests --- packages/survey-creator-core/src/creator-base.ts | 2 +- .../src/presets/presets-editable-languages.ts | 2 +- .../survey-creator-core/tests-presets/presets-editor.tests.ts | 3 --- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/survey-creator-core/src/creator-base.ts b/packages/survey-creator-core/src/creator-base.ts index 40ba10cf5e..6c60c9dc9d 100644 --- a/packages/survey-creator-core/src/creator-base.ts +++ b/packages/survey-creator-core/src/creator-base.ts @@ -1915,7 +1915,7 @@ export class SurveyCreatorModel extends Base } return res; } - public getTabs(): Array { + public getTabs(): Array { const tabs = this.getAvailableTabs(); const res = []; this.tabs.forEach(tab => { diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index 47769749c9..f1e2ba8835 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -115,7 +115,7 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { private get surveyLocalesName(): string { return this.path + "_surveyLocales"; } private get surveyUseEnglishNames(): string { return this.path + "_surveyUseEnglishNames"; } public get questionNames() { - return [this.creatorLocaleName, this.surveyLocalesName, this.surveyUseEnglishNames]; + return [this.surveyLocalesName, this.surveyUseEnglishNames]; } private getIsShowInEnglishSelected(model: SurveyModel): boolean { return model.getValue(this.surveyUseEnglishNames) === true; } private getCreatorLocales(): Array { diff --git a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts index 57f143abf9..6eb01e3f2d 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts @@ -244,7 +244,6 @@ test("Preset edit model, toolbox items, default value and apply", () => { expect(question.visibleRows).toHaveLength(defaultItems.length); expect(question.value).toHaveLength(defaultItems.length); question.value = question.value.filter(r => ["boolean", "text", "checkbox"].indexOf(r.name) >= 0).sort((a, b)=>a.name < b.name ? 1 : -1); - expect(editor.applyFromSurveyModel()).toBeTruthy(); const etalon: ICreatorPresetData = { toolbox: { definition: [{ name: "text" }, { name: "checkbox" }, { name: "boolean" }] @@ -559,7 +558,6 @@ test("Change localization strings for tabs", () => { const itemsQuestion = survey.getQuestionByName("tabs_items"); const item = itemsQuestion.visibleRows[0]; item.getQuestionByName("title").value = "Designer edit"; - editor.applyFromSurveyModel(); let loc = editor.json.localization; expect(loc).toBeTruthy(); expect(loc.en.tabs.designer).toEqual("Designer edit"); @@ -610,7 +608,6 @@ test("Change localization strings for toolbox categories", () => { expect(row1.getQuestionByName("title").value).toBe("Choice Questions"); expect(row1.getQuestionByName("title").isReadOnly).toBeFalsy(); row1.getQuestionByName("title").value = "Choice Questions edit"; - editor.applyFromSurveyModel(); const loc = editor.json.localization; expect(loc).toBeTruthy(); expect(loc.en.toolboxCategories.text).toBeFalsy(); From 2140fd488b053ab7d3cae07e378d1ed785cf983e Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Sun, 27 Jul 2025 16:02:25 +0300 Subject: [PATCH 025/240] #7004 - add tests for multiply appy --- .../tests-presets/presets-editor.tests.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts index 6eb01e3f2d..5224d9928e 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts @@ -727,6 +727,19 @@ test("Preset edit model, Change localization strings title&description", () => { const propGridSurvey = creator.propertyGrid; expect(propGridSurvey.getPageByName("general").title).toEqual("General Edit"); }); +test("Change presets multiple times", () => { + const editor = new CreatorPresetEditorModel(); + const survey = editor.model; + let itemsQuestion = survey.getQuestionByName("tabs_items"); + const itemsValue = [...itemsQuestion.value]; + let defaultTabQuestion = survey.getQuestionByName("tabs_activeTab"); + defaultTabQuestion.value = "preview"; + expect(editor.json.tabs.activeTab).toBe("preview"); + itemsValue.splice(itemsValue.length - 1, 1); + itemsQuestion.value = itemsValue; + expect(editor.json.tabs.items.map(t => t.name)).toEqual(["designer", "preview", "logic"]); + expect(editor.json.tabs.activeTab).toBe("preview"); +}); test("Change localization strings and then change locale for tabs", () => { addLocales(); const editor = new CreatorPresetEditorModel({ tabs: { items: [] } }); From 1bceddbed56ce93e121f449379b5c702b2a8a828 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 28 Jul 2025 12:10:41 +0300 Subject: [PATCH 026/240] fix locale test --- .../src/presets/presets-editable-languages.ts | 2 +- packages/survey-creator-core/src/presets/presets-editor.ts | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index f1e2ba8835..bb42609bf5 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -96,7 +96,7 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { const question = model.getQuestionByName(this.surveyLocalesName); const locales = json.surveyLocales; if (Array.isArray(locales) && locales.length > 0) { - question.valule = locales; + question.valule = locales; // TODO: sheck spell } else { question.selectAll(); } diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 21ae4d486f..20979a0110 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -61,7 +61,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit this.upldateResultJson(); return this.resultModelValue; } - public getLocale(): string { return this.json?.languages?.creator || "en"; } + public getLocale(): string { return editorLocalization.currentLocale || "en"; } public get json(): ICreatorPresetData { return this.preset.getJson(); } @@ -115,11 +115,6 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit model.onCurrentPageChanged.add((sender, options) => { editablePresets.forEach(item => item.setupOnCurrentPage(model, this.creator)); }); - model.onValueChanging.add((sender, options) => { - if (options.name === "languages_creator") { - this.applyFromSurveyModel(); - } - }); const questionNames = editablePresets.map(preset => preset.questionNames).reduce((acc, current) => acc.concat(current), []); model.onValueChanged.add((sender, options) => { editablePresets.forEach(item => item.updateOnValueChanged(model, options.name)); From a6c351002f7daa3f0229952382cf603bc8a37bc1 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 28 Jul 2025 14:40:57 +0300 Subject: [PATCH 027/240] #7004 Presets: integrate presets into creator Fixes #7004 --- .../survey-creator-core/src/presets/presets-plugin.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 69ac16eeab..b06df5b06b 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -34,9 +34,10 @@ export class TabPresetsPlugin implements ICreatorPlugin { { id: "reset", title: "Reset all changes", markerIconName: "restore-24x24", needSeparator: true }, ]; let settingsAction; + let presetsList; presets.forEach(p => { p.action = (item)=>{ - settingsAction.popupModel.contentComponentData.model.selectedItem = item; + presetsList.selectedItem = item; settingsAction.popupModel.show(); this.model.model.currentPage = this.model.model.getPageByName(item.id); }; @@ -57,6 +58,11 @@ export class TabPresetsPlugin implements ICreatorPlugin { const bottomActions = this.designerPlugin.tabControlModel.bottomToolbar.actions; bottomActions.forEach(a => a.visible = false); bottomActions.unshift(settingsAction); + presetsList = settingsAction.popupModel.contentComponentData.model; + presetsList.selectedItem = presetsList.actions[0]; + this.model.model.onCurrentPageChanged.add((_, options) => { + presetsList.selectedItem = presetsList.actions[this.model.model.currentPageNo]; + }); } public deactivate(): boolean { From cffec85f4f2cb8aa5f18b86ccf8ae65e3bcec417 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 28 Jul 2025 17:13:58 +0300 Subject: [PATCH 028/240] #7004 - fixed multiple preset apply for tabs --- .../src/presets/presets-editable-base.ts | 12 +++++++++--- .../src/presets/presets-editable-languages.ts | 2 +- .../src/presets/presets-editable-properties.ts | 2 +- .../src/presets/presets-editable-tabs.ts | 14 +++++++++++--- .../src/presets/presets-editable-toolbox.ts | 2 +- .../src/presets/presets-editor.ts | 11 +++++++++-- .../tests-presets/presets-editor.tests.ts | 18 ++++++++++++++++-- 7 files changed, 48 insertions(+), 13 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index 91b3543deb..7a83c85e1c 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -58,9 +58,9 @@ export class CreatorPresetEditableBase { protected getTextVisibleIf(name: string, val: string): string { return "{" + name + "}='" + val + "'"; } protected getNotEmptyVisibleIf(name: string): string { return "{" + name + "} notempty"; } protected createMainPageCore(): any { return undefined; } - public getJsonValue(model: SurveyModel, creator: SurveyCreatorModel): any { + public getJsonValue(model: SurveyModel, creator: SurveyCreatorModel, defaultJson?: any): any { const page = model.getPageByName(this.pageName); - const core = page && page.isVisible ? this.getJsonValueCore(model, creator) : undefined; + const core = page && page.isVisible ? this.getJsonValueCore(model, creator, defaultJson) : undefined; let hasValue = !!core; const res = hasValue ? core : {}; this.children.forEach(item => { @@ -72,6 +72,11 @@ export class CreatorPresetEditableBase { }); return hasValue ? res : undefined; } + public getDefaultJsonValue(creator: SurveyCreatorModel) { + const json = this.getDefaultJsonValueCore(creator); + this.children.forEach(item => json[item.path] = item.getDefaultJsonValueCore(creator)); + return json; + } public setJsonLocalizationStrings(model: SurveyModel, locStrs: any): void { this.setJsonLocalizationStringsCore(model, locStrs); this.children.forEach(item => item.setJsonLocalizationStrings(model, locStrs)); @@ -138,7 +143,8 @@ export class CreatorPresetEditableBase { protected setupQuestionsCore(model: SurveyModel, creatorSetup: ICreatorPresetEditorSetup): void { } protected setupQuestionsValueCore(model: SurveyModel, json: any, creator: SurveyCreatorModel): void {} protected onLocaleChangedCore(model: SurveyModel, json: any, creator: SurveyCreatorModel): void {} - protected getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel): any { return undefined; } + protected getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { return undefined; } + protected getDefaultJsonValueCore(creator: SurveyCreatorModel): any { return {}; } protected setJsonLocalizationStringsCore(model: SurveyModel, locStrs: any): void {} protected updateJsonLocalizationStringsCore(locStrs: any): void {} protected disposeCore(): void {} diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index bb42609bf5..c49e541264 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -70,7 +70,7 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { } ] }; } - protected getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel): any { + protected getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { const creatorLocale = model.getValue(this.creatorLocaleName); const useEnglishNames = model.getValue(this.surveyUseEnglishNames) === true; const question = model.getQuestionByName(this.surveyLocalesName); diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index fab95b3652..8ee61f2288 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -301,7 +301,7 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare }; } - public getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel): any { + public getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { if (!this.isModified) return undefined; this.updateCurrentJson(model); return { definition: this.currentJson }; diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index 70ce94e0e8..ecee1243ec 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -71,16 +71,16 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { return [this.nameItems, this.nameActiveTab]; } - protected getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel): any { + protected getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { let items = model.getValue(this.nameItems); if (!Array.isArray(items)) return undefined; - const creatorTabs = creator.getTabs(); + const creatorTabs = defaultJson?.items || creator.getTabs(); let activeTabChoices = items.map(i => ({ name: i.name, iconName: i.iconName || creatorTabs.filter(t => t.name == i.name)[0]?.iconName })); if (Helpers.isArraysEqual(activeTabChoices, creatorTabs, false)) { activeTabChoices = undefined; } let activeTab = model.getValue(this.nameActiveTab); - if (!activeTabChoices && activeTab === creator.activeTab) { + if (!activeTabChoices && activeTab === (defaultJson?.activeTab || creator.activeTab)) { activeTab = undefined; } if (!activeTabChoices && !activeTab) return undefined; @@ -94,6 +94,14 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { return val; } + protected getDefaultJsonValueCore(creator: SurveyCreatorModel): any { + const creatorTabs = creator.getTabs(); + return { + activeTab: creator.activeTab, + items: creator.getTabs(), + }; + } + private getQuestionItems(model: SurveyModel): QuestionMatrixDynamicModel { return model.getQuestionByName(this.nameItems); } diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index c3fedb844a..02578324cb 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -152,7 +152,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita return [this.nameCategories, this.nameItems, this.nameShowCategoryTitles]; } - public getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel): any { + public getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { const res: any = {}; const definition = this.getJsonItemsDefinition(model); if (definition) { diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 20979a0110..408ab4cd42 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -33,7 +33,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit private navigationBarValue: NavigationBar; public locTitle: LocalizableString; private applying = false; - constructor(json?: ICreatorPresetData, private creatorValue?: SurveyCreatorModel) { + constructor(json?: ICreatorPresetData, private creatorValue?: SurveyCreatorModel, private defaultJsonValue?: ICreatorPresetData) { super(); editorLocalization.presetStrings = undefined; this.presetValue = new CreatorPreset(json); @@ -74,6 +74,9 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit public get jsonText(): string { return JSON.stringify(this.json, null, 2); } + public get defaultJson(): ICreatorPresetData { + return this.defaultJsonValue; + } public createCreator(options: ICreatorOptions): SurveyCreatorModel { return new SurveyCreatorModel(options); } @@ -108,6 +111,10 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit }); editablePresets.forEach(item => item.setupQuestions(model, this)); + if (!this.defaultJsonValue) { + this.defaultJsonValue = {}; + editablePresets.forEach(item => this.defaultJsonValue[item.path] = item.getDefaultJsonValue(this.creator)); + } const json = this.preset.getJson() || {}; editablePresets.forEach(item => item.setupQuestionsValue(model, json[item.path], this.creator)); this.updateJsonLocalizationStrings(editablePresets); @@ -254,7 +261,7 @@ preset.apply(creator); public getJsonFromSurveyModel(): any { const res: ICreatorPresetData = {}; this.model.editablePresets.forEach(preset => { - const val = preset.getJsonValue(this.model, this.creator); + const val = preset.getJsonValue(this.model, this.creator, this.defaultJsonValue?.[preset.path]); if (!!val) { res[preset.path] = val; } diff --git a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts index 5224d9928e..a143caabda 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts @@ -727,18 +727,32 @@ test("Preset edit model, Change localization strings title&description", () => { const propGridSurvey = creator.propertyGrid; expect(propGridSurvey.getPageByName("general").title).toEqual("General Edit"); }); -test("Change presets multiple times", () => { +test("Change tabs presets multiple times", () => { const editor = new CreatorPresetEditorModel(); const survey = editor.model; let itemsQuestion = survey.getQuestionByName("tabs_items"); const itemsValue = [...itemsQuestion.value]; + itemsValue.splice(itemsValue.length - 1, 1); + itemsQuestion.value = itemsValue; + expect(editor.json.tabs.items.map(t => t.name)).toEqual(["designer", "preview", "logic"]); + let defaultTabQuestion = survey.getQuestionByName("tabs_activeTab"); defaultTabQuestion.value = "preview"; expect(editor.json.tabs.activeTab).toBe("preview"); + expect(editor.json.tabs.items.map(t => t.name)).toEqual(["designer", "preview", "logic"]); +}); +test("Use default preset json", () => { + const editor = new CreatorPresetEditorModel(); + const survey = editor.model; + let itemsQuestion = survey.getQuestionByName("tabs_items"); + const itemsValue = [...itemsQuestion.value]; itemsValue.splice(itemsValue.length - 1, 1); itemsQuestion.value = itemsValue; expect(editor.json.tabs.items.map(t => t.name)).toEqual(["designer", "preview", "logic"]); - expect(editor.json.tabs.activeTab).toBe("preview"); + const newDefaultJson = editor.defaultJson; + + const editor2 = new CreatorPresetEditorModel({}, null, newDefaultJson); + expect(editor2.json.tabs).toBeUndefined(); }); test("Change localization strings and then change locale for tabs", () => { addLocales(); From 421ec05eab5474147b86eedae2b077522f305c38 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 28 Jul 2025 21:00:29 +0300 Subject: [PATCH 029/240] fixed toolbox multiple apply #7004 --- .../src/presets/presets-editable-toolbox.ts | 8 +++++++- .../tests-presets/presets-editor.tests.ts | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 02578324cb..9fb9383d0a 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -160,9 +160,10 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita } const mode = model.getValue(this.nameCategoriesMode); const toolbox = creator.toolbox; + const toolboxCategories = defaultJson?.categories; if (mode === "categories") { const categories = this.getCategoriesJson(model); - if (Array.isArray(categories) && categories.length > 0 && (!toolbox.hasCategories || !this.isCategoriesSame(categories, toolbox.categories))) { + if (Array.isArray(categories) && categories.length > 0 && (!toolbox.hasCategories || !this.isCategoriesSame(categories, toolboxCategories))) { res.categories = this.getCategoriesJson(model); } } @@ -171,6 +172,11 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita } return Object.keys(res).length > 0 ? res : undefined; } + protected getDefaultJsonValueCore(creator: SurveyCreatorModel): any { + return { + categories: creator.toolbox.categories.map(c => ({ name: c.name, title: c.title, items: c.items.map(i => i.name) })) + }; + } private isCategoriesSame(categories: any, toolboxCategories: Array): boolean { if (categories.length !== toolboxCategories.length) return false; for (let i = 0; i < categories.length; i++) { diff --git a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts index a143caabda..6b5dd7473e 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts @@ -741,6 +741,20 @@ test("Change tabs presets multiple times", () => { expect(editor.json.tabs.activeTab).toBe("preview"); expect(editor.json.tabs.items.map(t => t.name)).toEqual(["designer", "preview", "logic"]); }); +test("Change toolbox presets multiple times", () => { + const editor = new CreatorPresetEditorModel(); + const survey = editor.model; + let categoriesQuestion = survey.getQuestionByName("toolbox_categories"); + const categoriesValue = [...categoriesQuestion.value]; + categoriesQuestion.value = [categoriesValue[1], categoriesValue[2]]; + expect(editor.json.toolbox.categories.map(t => t.category)).toEqual(["text", "containers"]); + expect(editor.json.toolbox.definition.map(t => t.name)).toEqual(["text", "comment", "multipletext", "panel", "paneldynamic"]); + + let defaultTabQuestion = survey.getQuestionByName("tabs_activeTab"); + defaultTabQuestion.value = "preview"; + expect(editor.json.toolbox.categories.map(t => t.category)).toEqual(["text", "containers"]); + expect(editor.json.toolbox.definition.map(t => t.name)).toEqual(["text", "comment", "multipletext", "panel", "paneldynamic"]); +}); test("Use default preset json", () => { const editor = new CreatorPresetEditorModel(); const survey = editor.model; From 9110018780062556eca1f69646d790a17496ea2c Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 28 Jul 2025 22:12:25 +0300 Subject: [PATCH 030/240] #7004 presets css --- .../rollup.presets.config.js | 8 +- .../src/entries/presets.ts | 2 +- .../src/presets/presets-editor.ts | 2 + .../presets-theme/blocks/sps-action-bar.scss | 101 ++++ .../presets-theme/blocks/sps-buttongroup.scss | 124 +++++ .../presets-theme/blocks/sps-checkbox.scss | 138 ++++++ .../blocks/sps-color-editor.scss | 66 +++ .../presets-theme/blocks/sps-comment.scss | 9 + .../presets-theme/blocks/sps-dropdown.scss | 100 ++++ .../presets-theme/blocks/sps-file-edit.scss | 3 + .../presets-theme/blocks/sps-input.scss | 215 +++++++++ .../presets-theme/blocks/sps-link.scss | 14 + .../blocks/sps-matrixdynamic.scss | 132 ++++++ .../presets-theme/blocks/sps-overriding.scss | 17 + .../presets-theme/blocks/sps-panel.scss | 175 +++++++ .../blocks/sps-question-group.scss | 10 + .../presets-theme/blocks/sps-question.scss | 262 ++++++++++ .../blocks/sps-search-editor.scss | 54 +++ .../presets-theme/blocks/sps-table.scss | 212 +++++++++ .../blocks/sps-theme-builder.scss | 157 ++++++ .../presets-theme/blocks/variables.scss | 28 ++ .../src/presets/presets-theme/presets.scss | 147 ++++++ .../src/presets/presets-theme/presets.ts | 448 ++++++++++++++++++ .../webpack.presets.config.js | 24 + packages/survey-creator-react/index.html | 2 + 25 files changed, 2448 insertions(+), 2 deletions(-) create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-buttongroup.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-checkbox.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-color-editor.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-comment.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-file-edit.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-input.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-link.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-overriding.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question-group.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-search-editor.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-theme-builder.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/variables.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/presets.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/presets.ts diff --git a/packages/survey-creator-core/rollup.presets.config.js b/packages/survey-creator-core/rollup.presets.config.js index 7e36741874..8a5a7527cc 100644 --- a/packages/survey-creator-core/rollup.presets.config.js +++ b/packages/survey-creator-core/rollup.presets.config.js @@ -40,6 +40,12 @@ export default { content: banner, commentStyle: "ignored", } - }) + }), + { + name: "remove-scss-imports", + load: (id) => { + if (id.match(/\.scss$/)) return ""; + } + }, ] }; \ No newline at end of file diff --git a/packages/survey-creator-core/src/entries/presets.ts b/packages/survey-creator-core/src/entries/presets.ts index 5212e3f288..32d20bf391 100644 --- a/packages/survey-creator-core/src/entries/presets.ts +++ b/packages/survey-creator-core/src/entries/presets.ts @@ -13,7 +13,7 @@ export * from "../presets/presets-editable-base"; export * from "../presets/preset-question-ranking"; export * from "../presets/preset-question-json"; import { checkLibraryVersion } from "survey-core"; - +import "../presets/presets-theme/presets.scss"; export let Version: string; // eslint-disable-next-line @typescript-eslint/ban-ts-comment //@ts-ignore diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 408ab4cd42..73b8bc7aec 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -6,6 +6,7 @@ import { CreatorPresetEditableToolboxConfigurator } from "./presets-editable-too import { CreatorPresetEditablePropertyGrid } from "./presets-editable-properties"; import { CreatorPresetEditableTabs } from "./presets-editable-tabs"; import { CreatorPresetEditableLanguages } from "./presets-editable-languages"; +import { presetsCss } from "./presets-theme/presets"; export class NavigationBar extends ActionContainer { constructor() { @@ -84,6 +85,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit protected createModel(): SurveyModel { const editablePresets = this.createEditablePresets(); const model = new SurveyModel(this.getEditModelJson(editablePresets)); + model.css = presetsCss; model.editablePresets = editablePresets; model.keepIncorrectValues = true; model.showPrevButton = false; diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss new file mode 100644 index 0000000000..02b4b53eae --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss @@ -0,0 +1,101 @@ +@use "../../../variables.scss" as *; + +.sps-action-bar { + display: flex; + box-sizing: content-box; + position: relative; + align-items: center; + margin-left: auto; + overflow: hidden; + white-space: nowrap; +} + +.sps-action-button { + @include ctrDefaultBoldFont; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + display: flex; + padding: var(--ctr-actionbar-button-padding-top-large-icon, var(--sjs-spacing-x1)) + var(--ctr-actionbar-button-padding-right-large-icon, var(--sjs-spacing-x1)) + var(--ctr-actionbar-button-padding-bottom-large-icon, var(--sjs-spacing-x1)) + var(--ctr-actionbar-button-padding-left-large-icon, var(--sjs-spacing-x1)); + box-sizing: border-box; + border: none; + color: var(--ctr-actionbar-button-text-color, var(--sjs-primary-background-500, #19b394ff)); + border-radius: var(--ctr-actionbar-button-corner-radius, var(--sjs-corner-radius-x1)); + background-color: transparent; + cursor: pointer; + transition: + background-color $creator-transition-duration, + opacity $creator-transition-duration; + + &:hover, + &:focus { + opacity: 1; + outline: none; + background-color: var( + --ctr-actionbar-button-background-color-hovered, + var(--sjs-layer-1-background-400, #f5f5f5ff) + ); + + use { + fill: var(--ctr-actionbar-button-icon-color-hovered, var(--sjs-layer-1-foreground-75, #000000bf)); + } + } +} + +.sps-action-button--icon { + padding: var(--ctr-actionbar-button-padding-top-large-icon, var(--sjs-spacing-x1)) + var(--ctr-actionbar-button-padding-right-large-icon, var(--sjs-spacing-x1)) + var(--ctr-actionbar-button-padding-bottom-large-icon, var(--sjs-spacing-x1)) + var(--ctr-actionbar-button-padding-left-large-icon, var(--sjs-spacing-x1)); +} +.sps-action-button__icon { + display: block; + width: var(--ctr-actionbar-button-icon-width, var(--sjs-font-size-x3)); + height: var(--ctr-actionbar-button-icon-height, var(--sjs-font-size-x3)); + + use { + fill: var(--ctr-actionbar-button-icon-color, var(--sjs-layer-1-foreground-75, #000000bf)); + transition: fill $creator-transition-duration; + } +} + +.sps-action-button--danger { + color: var(--ctr-library-action-button-text-color-negative, var(--sjs-semantic-red-background-500, #e50a3eff)); + + &:hover, + &:focus { + background-color: var( + --ctr-library-action-button-background-color-negative-hovered, + var(--sjs-semantic-red-background-10, #e50a3e1a) + ); + + use { + fill: var(--ctr-library-action-button-icon-color-negative, var(--sjs-semantic-red-background-500, #e50a3eff)); + } + } +} + +button.sps-action-button--large { + padding: calcSize(0.5) calcSize(2); +} + +.sps-action-button:disabled { + opacity: var(--ctr-actionbar-button-opacity-disabled, 0.25); + pointer-events: none; + cursor: default; +} + +.sps-action-button--muted { + opacity: var(--ctr-actionbar-button-opacity-muted, 0.35); +} + +.sps-action-button:active { + opacity: var(--ctr-actionbar-button-opacity-pressed, 0.5); +} + +.sps-action-button--text { + padding: calcSize(0.5) calcSize(2); +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-buttongroup.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-buttongroup.scss new file mode 100644 index 0000000000..d400d0be53 --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-buttongroup.scss @@ -0,0 +1,124 @@ +@use "../../../variables" as *; + +.sps-button-group { + position: relative; + display: flex; + padding: var(--ctr-button-group-padding, var(--sjs-spacing-x05)); + align-items: center; + align-self: stretch; + box-sizing: border-box; + overflow-x: auto; + + border-radius: var(--ctr-button-group-corner-radius, var(--sjs-corner-radius-x075)); + box-shadow: inset 0 0 0 var(--ctr-button-group-border-width, var(--sjs-stroke-x1)) + var(--ctr-button-group-border-color, var(--sjs-border-10, #dcdcdcff)); + background-color: var(--ctr-button-group-background-color, var(--sjs-layer-3-background-500, #f4f4f4ff)); + + &::after { + content: ""; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border-radius: var(--ctr-button-group-corner-radius, var(--sjs-corner-radius-x075)); + box-shadow: inset 0 0 0 var(--ctr-button-group-border-width-focused, var(--sjs-stroke-x2)) transparent; + pointer-events: none; + transition: box-shadow $creator-transition-duration; + } +} + +.sps-button-group:focus-within::after { + box-shadow: inset 0 0 0 var(--ctr-button-group-border-width-focused, var(--sjs-stroke-x2)) + var(--ctr-button-group-border-color-focused, var(--sjs-primary-background-500, #19b394ff)); +} + +.sps-button-group__item { + @include ctrDefaultFont; + color: var(--ctr-button-group-item-text-color, var(--sjs-layer-3-foreground-100, #000000e6)); + + display: flex; + padding: var(--ctr-button-group-item-padding-vertical, var(--sjs-spacing-x1)) + var(--ctr-button-group-item-padding-horizontal, var(--sjs-spacing-x2)); + justify-content: center; + align-items: center; + align-self: stretch; + flex-basis: 0; + flex-grow: 1; + + border-radius: var(--ctr-button-group-item-corner-radius, var(--sjs-corner-radius-x075)); + box-shadow: inset 0 0 0 var(--ctr-button-group-item-border-width, 0px) + var(--ctr-button-group-item-border-color, var(--sjs-border-10, #dcdcdcff)); + background-color: var(--ctr-button-group-item-background-color, var(--sjs-layer-3-background-500, #f4f4f4ff)); + + transition: + background $creator-transition-duration, + background-color $creator-transition-duration, + color $creator-transition-duration; + + &:not(:last-of-type) { + margin-right: var(--ctr-button-group-gap, var(--sjs-spacing-x05)); + } +} + +.sps-button-group__item--hover:hover { + background-color: var(--ctr-button-group-item-background-color-hovered, var(--sjs-layer-3-background-400, #eaeaeaff)); +} + +.sps-button-group__item-icon { + use { + fill: var(--ctr-button-group-item-icon-color, var(--sjs-layer-3-foreground-75, #000000bf)); + } +} + +.sps-button-group__item--selected { + @include ctrDefaultBoldFont; + color: var(--ctr-button-group-item-text-color-selected, var(--sjs-primary-background-500, #19b394ff)); + box-shadow: inset 0 0 0 var(--ctr-button-group-item-border-width-selected, var(--sjs-stroke-x1)) + var(--ctr-button-group-item-border-color, var(--sjs-border-10, #dcdcdcff)); + background: var(--ctr-button-group-item-background-color-selected, var(--sjs-layer-1-background-500, #ffffffff)); + .sps-button-group__item-icon use { + fill: var(--ctr-button-group-item-icon-color-selected, var(--sjs-primary-background-500, #19b394ff)); + } +} + +.sps-button-group__item-decorator { + display: flex; + align-items: center; + white-space: nowrap; +} + +.sps-button-group__item-caption { + display: block; +} +.sps-question--disabled .sps-button-group { + background: var(--ctr-button-group-background-color-disabled, var(--sjs-layer-1-background-500, #ffffffff)); +} + +.sps-button-group__item--disabled { + color: var(--ctr-button-group-item-text-color-disabled, var(--sjs-layer-3-foreground-100, #000000e6)); + background: var(--ctr-button-group-item-background-color-disabled, var(--sjs-layer-1-background-500, #ffffffff)); + .sps-button-group__item-icon use { + fill: var(--ctr-button-group-item-text-color-disabled, var(--sjs-layer-3-foreground-100, #000000e6)); + } + .sps-button-group__item-caption { + opacity: var(--ctr-button-group-item-text-opacity-disabled, 0.25); + color: var(--ctr-button-group-item-text-color-disabled, var(--sjs-layer-3-foreground-100, #000000e6)); + } + &:hover { + background-color: var( + --ctr-button-group-item-background-color-disabled, + var(--sjs-layer-1-background-500, #ffffffff) + ); + } +} + +.sps-button-group__item--selected.sps-button-group__item--disabled { + @include ctrDefaultFont; + box-shadow: inset 0 0 0 var(--ctr-button-group-item-border-width-selected-disabled, 0px) + var(--ctr-button-group-item-border-color, var(--sjs-border-10, #dcdcdcff)); + background: var( + --ctr-button-group-item-background-color-selected-disabled, + var(--sjs-layer-1-background-400, #f5f5f5ff) + ); +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-checkbox.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-checkbox.scss new file mode 100644 index 0000000000..b7a293b017 --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-checkbox.scss @@ -0,0 +1,138 @@ +@use "../../../variables" as *; + +.sps-checkbox { + cursor: pointer; + margin-top: var(--ctr-checkbox-list-gap-vertical, var(--sjs-spacing-x2)); +} + +.sps-checkbox--disabled { + cursor: default; + + .sps-checkbox { + cursor: default; + } + + .sps-checkbox__caption { + color: var(--ctr-checkbox-text-color-disabled, var(--sjs-layer-1-foreground-100, #000000e6)); + } + + .sps-checkbox__rectangle, + &.sps-checkbox:active .sps-checkbox__rectangle, + &.sps-checkbox__control:focus + .sps-checkbox__rectangle { + border: var(--ctr-checkbox-border-width, var(--sjs-stroke-x1)) solid + var(--ctr-checkbox-border-color-disabled, var(--sjs-border-10, #dcdcdcff)); + background: var(--ctr-checkbox-background-color-disabled, var(--sjs-layer-1-background-500, #ffffffff)); + outline: none; + } +} + +.sps-checkbox__caption { + @include ctrDefaultFont; + color: var(--ctr-checkbox-text-color, var(--sjs-layer-1-foreground-100, #000000e6)); +} + +.sps-checkbox__rectangle { + background: var(--ctr-checkbox-background-color, var(--sjs-layer-3-background-500, #f4f4f4ff)); + border: var(--ctr-checkbox-border-width, var(--sjs-stroke-x1)) solid + var(--ctr-checkbox-border-color, var(--sjs-border-10, #dcdcdcff)); + border-radius: var(--ctr-checkbox-corner-radius, var(--sjs-corner-radius-x05)); + box-sizing: border-box; + width: var(--ctr-checkbox-button-width, var(--sjs-font-size-x3)); + height: var(--ctr-checkbox-button-height, var(--sjs-font-size-x3)); + display: flex; + justify-content: center; + align-items: center; + flex-shrink: 0; + // padding: calcSize(0.5); + padding: 1px 1px; + outline: 2px solid transparent; + display: flex; + justify-content: center; + align-items: center; + transition: + background $creator-transition-duration, + background-color $creator-transition-duration, + outline $creator-transition-duration; +} + +.sps-checkbox:not(.sps-checkbox--checked):hover { + .sps-checkbox__rectangle { + background-color: var(--ctr-checkbox-background-color-hovered, var(--sjs-layer-3-background-400, #eaeaeaff)); + } +} + +.sps-checkbox:active .sps-checkbox__rectangle, +.sps-checkbox__control:focus:not(:disabled) + .sps-checkbox__rectangle { + outline: 2px solid var(--ctr-checkbox-border-color-focused, var(--sjs-primary-background-500, #19b394ff)); + outline-offset: -2px; +} + +.sps-checkbox .sps-checkbox__svg { + display: block; + opacity: 0; + fill: transparent; + width: var(--ctr-checkbox-button-check-mark-width, var(--sjs-font-size-x2)); + height: var(--ctr-checkbox-button-check-mark-height, var(--sjs-font-size-x2)); + background-repeat: no-repeat; + background-size: calcSize(2) calcSize(2); + transition: + opacity $creator-transition-duration, + fill $creator-transition-duration; +} + +.sps-checkbox--checked { + .sps-checkbox__rectangle { + background: var(--ctr-checkbox-background-color-selected, var(--sjs-layer-1-background-500, #ffffffff)); + } + + .sps-checkbox__svg { + opacity: 1; + fill: var(--ctr-checkbox-button-check-mark-color, var(--sjs-primary-background-500, #19b394ff)); + } +} + +.sps-checkbox--disabled.sps-checkbox--checked .sps-checkbox__svg { + fill: var(--ctr-checkbox-button-check-mark-color-disabled, var(--sjs-border-25, #d4d4d4ff)); +} + +.sps-checkbox__control { + position: fixed; + height: 1px; + width: 1px; + overflow: hidden; + clip: rect(1px 1px 1px 1px); + clip: rect(1px, 1px, 1px, 1px); +} + +//todo: need to hide unneeded icons +.sps-checkbox__hidden { + display: none; +} + +.sps-selectbase { + border: none; + padding: 0; + margin: 0; +} + +.sps-selectbase__label { + display: flex; + align-items: flex-start; + gap: var(--ctr-checkbox-gap, var(--sjs-spacing-x1)); + cursor: pointer; +} + +.sps-checkbox { + .sps-question__description { + padding: 0; + padding-top: var(--ctr-checkbox-description-text-margin-top, var(--sjs-spacing-x1)); + padding-inline-start: var(--ctr-checkbox-description-text-margin-left, var(--sjs-font-size-x4)); + color: var(--ctr-checkbox-description-text-color, var(--sjs-layer-1-foreground-50, #00000080)); + } + + .sps-help-action { + use { + pointer-events: none; + } + } +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-color-editor.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-color-editor.scss new file mode 100644 index 0000000000..1008890417 --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-color-editor.scss @@ -0,0 +1,66 @@ +@use "../../../variables" as *; + +.sps-color-editor__color-input { + position: absolute; + height: 1px; + width: 1px; + overflow: hidden; + clip: rect(1px 1px 1px 1px); + /* IE6, IE7 */ + clip: rect(1px, 1px, 1px, 1px); + left: 0; + top: 100%; + transform: translateY(-50%); +} + +.svc-list__item-body { + // display: flex; + // gap: var(--ctr-list-item-gap, var(--sjs-spacing-x2)); + // padding: var(--ctr-list-item-padding-top-with-icon, var(--sjs-spacing-x150)) var(--ctr-list-item-padding-right, var(--sjs-spacing-x6)) + // var(--ctr-list-item-padding-bottom-with-icon, var(--sjs-spacing-x150)) var(--ctr-list-item-padding-left, var(--sjs-spacing-x2)); + + .sps-color-editor__color-swatch { + margin-left: 0; + flex: 0 1 auto; + } +} + +.sps-color-editor__color-swatch { + position: relative; + flex-shrink: 0; + flex-grow: 0; + border-radius: var(--ctr-list-item-color-swatch-corner-radius, var(--sjs-corner-radius-x05)); + width: var(--ctr-list-item-color-swatch-width, var(--sjs-font-size-x4)); + height: var(--ctr-list-item-color-swatch-height, var(--sjs-font-size-x3)); + box-sizing: border-box; + border: 1px solid var(--ctr-list-item-color-swatch-border-color, var(--sjs-border-25-overlay, #00000026)); + margin-left: var(--ctr-editor-color-swatch-margin-left, var(--sjs-spacing-x150)); + + .sv-svg-icon { + position: absolute; + width: var(--ctr-editor-color-swatch-icon-width, var(--sjs-font-size-x2)); + height: var(--ctr-editor-color-swatch-icon-height, var(--sjs-font-size-x2)); + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + fill: var(--ctr-editor-color-swatch-icon-color-stroke, #00000040); + } +} +.sps-question--disabled .sps-color-editor { + background-color: var(--ctr-editor-background-color-disabled, var(--sjs-layer-1-background-500, #ffffffff)); +} +.sps-color-editor__color-swatch--disabled { + .sv-svg-icon { + opacity: 0.25; + } +} + +.sps-color-editor__color-swatch--default { + .sv-svg-icon { + opacity: 1; + } +} + +.sps-color-editor .sps-color-editor__button-wrapper + * { + margin-inline-end: calc(0px - var(--ctr-editor-gap, var(--sjs-spacing-x05))); +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-comment.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-comment.scss new file mode 100644 index 0000000000..7e76246796 --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-comment.scss @@ -0,0 +1,9 @@ +@use "../../../variables" as *; + +.sps-comment { + height: auto; + max-width: 100%; + min-width: calcSize(6); + min-height: calcSize(6); + line-height: calcSize(3); +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss new file mode 100644 index 0000000000..03faa0e5e5 --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss @@ -0,0 +1,100 @@ +@use "../../../variables" as *; + +.sps-dropdown { + display: flex; + + padding-top: calc(var(--ctr-editor-padding-top, var(--sjs-spacing-x05))); + padding-right: calc(var(--ctr-editor-padding-right, var(--sjs-spacing-x05))); + padding-bottom: calc(var(--ctr-editor-padding-bottom, var(--sjs-spacing-x05))); + padding-left: calc( + var(--ctr-editor-padding-left, var(--sjs-spacing-x05)) + + var(--ctr-editor-content-margin-left, var(--sjs-spacing-x150)) + ); +} + +.sps-dropdown__value { + @include ctrDefaultFont; + display: flex; + align-items: center; + width: 100%; + position: relative; + + margin-top: var(--ctr-editor-content-margin-top, var(--sjs-spacing-x1)); + margin-right: var(--ctr-editor-content-margin-right, var(--sjs-spacing-x150)); + margin-bottom: var(--ctr-editor-content-margin-bottom, var(--sjs-spacing-x1)); + margin-left: 0; +} +.sps-dropdown__filter-string-input { + @include ctrDefaultFont; + + color: var(--ctr-editor-content-text-color, var(--sjs-layer-3-foreground-100, #000000e6)); +} + +.sps-dropdown-popup.sv-popup--menu-popup { + height: 0; +} + +.sps-dropdown__clean-button { + --thm-ctr-editor-content-margin-top: var(--ctr-editor-content-margin-top, var(--sjs-spacing-x1)); + --thm-ctr-editor-content-margin-bottom: var(--ctr-editor-content-margin-bottom, var(--sjs-spacing-x1)); + margin-top: calc(-1 * var(--thm-ctr-editor-content-margin-top)); + margin-bottom: calc(-1 * var(--thm-ctr-editor-content-margin-bottom)); + use { + fill: inherit; + } +} + +.sps-dropdown { + .sd-dropdown-action-bar { + margin-inline-start: var(--ctr-editor-gap, var(--sjs-spacing-x05)); + gap: var(--ctr-editor-buttons-gap, var(--sjs-spacing-x05)); + } + + .sd-editor-button-item { + padding-top: var(--ctr-editor-button-padding-top, var(--sjs-spacing-x1)); + padding-right: var(--ctr-editor-button-padding-right, var(--sjs-spacing-x1)); + padding-bottom: var(--ctr-editor-button-padding-bottom, var(--sjs-spacing-x1)); + padding-left: var(--ctr-editor-button-padding-left, var(--sjs-spacing-x1)); + transform: none; + + &:hover, + &:focus { + border-radius: var(--ctr-editor-button-corner-radius, var(--sjs-corner-radius-x05)); + background: var(--ctr-editor-button-background-color-hovered, var(--sjs-layer-3-background-400, #eaeaeaff)); + transition: background $creator-transition-duration; + } + + &.sd-editor-button-item--pressed { + border-radius: var(--ctr-editor-button-corner-radius, var(--sjs-corner-radius-x05)); + opacity: var(--ctr-editor-button-icon-opacity-pressed, 0.5); + background: var(--ctr-editor-button-background-color-hovered, var(--sjs-layer-3-background-400, #eaeaeaff)); + transition-property: opacity, background-color; + transition-duration: $creator-transition-duration; + } + + use { + fill: var(--ctr-editor-button-icon-color, var(--sjs-layer-3-foreground-75, #000000bf)); + } + } + + .sv-editor-button-item__icon { + width: var(--ctr-editor-button-icon-width, var(--sjs-font-size-x3)); + height: var(--ctr-editor-button-icon-height, var(--sjs-font-size-x3)); + } +} + +.sps-dropdown.sd-input--disabled { + opacity: 1; + + .sps-dropdown__value { + opacity: var(--ctr-editor-content-text-opacity-disabled, 0.25); + } + .sd-editor-button-item { + opacity: var(--ctr-editor-button-icon-opacity-disabled, 0.25); + background: transparent; + + svg { + fill: var(--ctr-editor-button-icon-color-disabled, var(--sjs-layer-3-foreground-75, #000000bf)); + } + } +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-file-edit.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-file-edit.scss new file mode 100644 index 0000000000..12624dd53c --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-file-edit.scss @@ -0,0 +1,3 @@ +.sps-file-edit__choose-button { + position: relative; +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-input.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-input.scss new file mode 100644 index 0000000000..4d6e5c83ce --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-input.scss @@ -0,0 +1,215 @@ +@use "../../../variables.scss" as *; + +.sps-input { + @include ctrDefaultFont; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + display: block; + background-color: var(--ctr-editor-background-color, var(--sjs-layer-3-background-500, #f4f4f4ff)); + box-sizing: border-box; + width: 100%; + border: none; + border-radius: var(--ctr-editor-corner-radius, var(--sjs-corner-radius-x075)); + box-shadow: inset 0 0 0 var(--ctr-editor-border-width, var(--sjs-stroke-x1)) + var(--ctr-editor-border-color, var(--sjs-border-10, #dcdcdcff)); + transition: box-shadow $creator-transition-duration; + + padding-top: calc( + var(--ctr-editor-padding-top, var(--sjs-spacing-x05)) + var(--ctr-editor-content-margin-top, var(--sjs-spacing-x1)) + ); + padding-right: calc( + var(--ctr-editor-padding-right, var(--sjs-spacing-x05)) + + var(--ctr-editor-content-margin-right, var(--sjs-spacing-x150)) + ); + padding-bottom: calc( + var(--ctr-editor-padding-bottom, var(--sjs-spacing-x05)) + + var(--ctr-editor-content-margin-bottom, var(--sjs-spacing-x1)) + ); + padding-left: calc( + var(--ctr-editor-padding-left, var(--sjs-spacing-x05)) + + var(--ctr-editor-content-margin-left, var(--sjs-spacing-x150)) + ); + outline: none; + color: var(--ctr-editor-content-text-color, var(--sjs-layer-3-foreground-100, #000000e6)); +} + +.sps-input::placeholder { + color: var(--ctr-editor-content-text-color-placeholder, var(--sjs-layer-3-foreground-50, #00000080)); +} + +.sps-input { + &::-webkit-datetime-edit, + &::-webkit-datetime-edit-fields-wrapper, + &::-webkit-datetime-edit-ampm-field, + &::-webkit-datetime-edit-day-field, + &::-webkit-datetime-edit-hour-field, + &::-webkit-datetime-edit-millisecond-field, + &::-webkit-datetime-edit-minute-field, + &::-webkit-datetime-edit-month-field, + &::-webkit-datetime-edit-second-field, + &::-webkit-datetime-edit-week-field, + &::-webkit-datetime-edit-year-field { + display: flex; + flex-wrap: nowrap; + padding-top: 0; + padding-bottom: 0; + } +} +.sps-input[type="date"], +.sps-input[type="datetime-local"] { + &:empty { + min-height: calc( + var(--ctr-font-default-line-height, var(--sjs-line-height-x3)) + + var(--ctr-editor-padding-top, var(--sjs-spacing-x05)) + + var(--ctr-editor-content-margin-top, var(--sjs-spacing-x1)) + + var(--ctr-editor-padding-bottom, var(--sjs-spacing-x05)) + + var(--ctr-editor-content-margin-bottom, var(--sjs-spacing-x1)) + ); + } +} + +.sps-input:focus:not(:disabled), +.sps-input.sps-dropdown:focus:not(:disabled), +.sps-input.sps-dropdown:focus-within:not(:disabled), +.sps-input-container:focus-within { + box-shadow: inset 0 0 0 var(--ctr-editor-border-width-focused, var(--sjs-stroke-x2)) + var(--ctr-editor-border-color-focused, var(--sjs-primary-background-500, #19b394ff)); +} + +input.sps-input:focus:read-only { + box-shadow: inset 0 0 0 var(--ctr-editor-border-width, var(--sjs-stroke-x1)) + var(--ctr-editor-border-color, var(--sjs-border-10, #dcdcdcff)); +} + +.sps-input:disabled, +.sps-input:disabled::placeholder, +input.sps-input:read-only, +input.sps-input:read-only::placeholder { + color: rgb( + from var(--ctr-editor-content-text-color-disabled, var(--sjs-layer-1-foreground-100, #000000e6)) r g b / + var(--ctr-editor-content-text-opacity-disabled, 0.25) + ); + background-color: var(--ctr-editor-background-color-disabled, var(--sjs-layer-1-background-500, #ffffffff)); +} + +.sps-input[type="color"] { + padding-left: 0; + padding-right: 0; + min-width: calcSize(8); +} + +.sps-input__edit-button { + position: relative; + box-sizing: border-box; + appearance: none; + background: transparent; + border: none; + outline: none; + border-radius: var(--ctr-editor-button-corner-radius, var(--sjs-corner-radius-x05)); + padding: var(--ctr-editor-button-padding-top, var(--sjs-spacing-x1)) + var(--ctr-editor-button-padding-right, var(--sjs-spacing-x1)) + var(--ctr-editor-button-padding-bottom, var(--sjs-spacing-x1)) + var(--ctr-editor-button-padding-left, var(--sjs-spacing-x1)); + line-height: 0; + transition: + background $creator-transition-duration, + opacity $creator-transition-duration; + align-self: stretch; + display: flex; + align-items: center; + justify-content: center; + + &:focus, + &:hover { + background: var(--ctr-editor-button-background-color-hovered, var(--sjs-layer-3-background-400, #eaeaeaff)); + } + + &:active { + opacity: var(--ctr-editor-button-icon-opacity-pressed, 0.5); + } + + svg { + width: var(--ctr-editor-button-icon-width, var(--sjs-font-size-x3)); + height: var(--ctr-editor-button-icon-height, var(--sjs-font-size-x3)); + fill: var(--ctr-editor-button-icon-color, var(--sjs-layer-3-foreground-75, #000000bf)); + } +} + +.sps-input-container--multiline .sps-input__edit-button { + align-self: flex-end; +} + +.sps-input__edit-button--disabled, +.sps-input__edit-button:disabled { + opacity: var(--ctr-editor-button-icon-opacity-disabled, 0.25); + background: transparent; + + svg { + fill: var(--ctr-editor-button-icon-color-disabled, var(--sjs-layer-3-foreground-75, #000000bf)); + } +} + +.sps-input.sps-input--error { + box-shadow: 0 0 0 1px inset var(--ctr-editor-border-color-error, var(--sjs-semantic-red-background-500, #e50a3eff)); +} + +.sps-input-container { + display: flex; + justify-content: space-between; + cursor: default; + padding: var(--ctr-editor-padding-top, var(--sjs-spacing-x05)) var(--ctr-editor-padding-right, var(--sjs-spacing-x05)) + var(--ctr-editor-padding-bottom, var(--sjs-spacing-x05)) var(--ctr-editor-padding-left, var(--sjs-spacing-x05)); + align-items: center; + gap: var(--ctr-editor-gap, var(--sjs-spacing-x05)); + box-shadow: inset 0 0 0 var(--ctr-editor-border-width, var(--sjs-stroke-x1)) + var(--ctr-editor-border-color, var(--sjs-border-10, #dcdcdcff)); +} + +.sps-input-container--multiline { + align-items: end; + flex-direction: column; + gap: 0; + height: auto; + + sv-ng-question-comment { + display: flex; + } + + .sps-input-container__input { + box-sizing: border-box; + resize: none; + } +} + +.sps-input-container__input { + @include ctrDefaultFont; + flex-grow: 1; + width: 100%; + padding: var(--ctr-editor-content-margin-top, var(--sjs-spacing-x1)) + var(--ctr-editor-content-margin-right, var(--sjs-spacing-x150)) + var(--ctr-editor-content-margin-bottom, var(--sjs-spacing-x1)) + var(--ctr-editor-content-margin-left, var(--sjs-spacing-x150)); + + color: var(--ctr-editor-content-text-color, var(--sjs-layer-3-foreground-100, #000000e6)); + outline: none; + border: none; + background-color: transparent; + + &::placeholder { + color: var(--ctr-editor-content-text-color-placeholder, var(--sjs-layer-3-foreground-50, #00000080)); + } +} + +.sps-input-container__input:disabled, +.sps-input-container__input:disabled::placeholder { + opacity: var(--ctr-editor-content-text-opacity-disabled, 0.25); + color: var(--ctr-editor-content-text-color-disabled, var(--sjs-layer-1-foreground-100, #000000e6)); + background-color: var(--ctr-editor-background-color-disabled, var(--sjs-layer-1-background-500, #ffffffff)); +} + +.sps-input-container__buttons-container { + display: flex; + gap: var(--ctr-editor-buttons-gap, var(--sjs-spacing-x05)); + align-self: stretch; +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-link.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-link.scss new file mode 100644 index 0000000000..9caad34a55 --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-link.scss @@ -0,0 +1,14 @@ +@use "../../../variables.scss" as *; + +.sps-link { + display: flex; +} + +.sv-string-viewer { + .sps-link { + display: initial; + color: var(--ctr-survey-action-button-text-color-positive, var(--sjs-primary-background-500, #19b394ff)); + font-weight: 600; + text-decoration-line: underline; + } +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss new file mode 100644 index 0000000000..b0aa6f92d1 --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss @@ -0,0 +1,132 @@ +@use "../../../variables.scss" as *; + +// .sps-matrixdynamic__drag-element { +// padding: calcSize(2); + +// &:hover { +// background-color: $background; +// } + +// &:after { +// content: " "; +// display: block; +// height: calcSize(0.5); +// } +// } + +.sps-drag-element__svg { + width: var(--ctr-data-table-row-drag-area-icon-width, var(--sjs-font-size-x3)); + height: var(--ctr-data-table-row-drag-area-icon-height, var(--sjs-font-size-x3)); + padding-top: var(--ctr-data-table-row-drag-area-padding-top, var(--sjs-spacing-x1)); + padding-inline-end: var(--ctr-data-table-row-drag-area-padding-right, var(--sjs-spacing-x1)); + padding-bottom: var(--ctr-data-table-row-drag-area-padding-bottom, var(--sjs-spacing-x1)); + padding-inline-start: var(--ctr-data-table-row-drag-area-padding-left, var(--sjs-spacing-x1)); + + display: block; + opacity: 0.5; + + use { + fill: var(--ctr-data-table-row-drag-area-icon-color, var(--sjs-layer-1-foreground-50, #00000080)); + } +} + +.sps-matrixdynamic__drag-drop-ghost-position-top, +.sps-matrixdynamic__drag-drop-ghost-position-bottom { + position: relative; +} + +.sps-matrixdynamic__drag-drop-ghost-position-top::after, +.sps-matrixdynamic__drag-drop-ghost-position-bottom::after { + content: ""; + width: 100%; + height: calcSize(0.5); + background-color: var(--sjs-secondary-background-500, #19b394ff); + position: absolute; + left: 0; +} + +.sps-matrixdynamic__drag-drop-ghost-position-top::after { + top: 0; +} + +.sps-matrixdynamic__drag-drop-ghost-position-bottom::after { + bottom: 0; +} + +.sps-matrixdynamic__placeholder { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + background: var(--ctr-property-grid-background-color, var(--sjs-layer-1-background-500, #ffffffff)); + border: 1px solid var(--ctr-survey-placeholder-border-color, var(--sjs-border-25, #d4d4d4ff)); + border-radius: var(--ctr-data-table-placeholder-corner-radius, var(--sjs-corner-radius-x075)); + box-sizing: border-box; + padding: var(--ctr-data-table-placeholder-padding-top, var(--sjs-spacing-x6)) + var(--ctr-data-table-placeholder-padding-right, var(--sjs-spacing-x8)) + var(--ctr-data-table-placeholder-padding-bottom, var(--sjs-spacing-x6)) + var(--ctr-data-table-placeholder-padding-left, var(--sjs-spacing-x8)); + gap: var(--ctr-survey-placeholder-gap, var(--lbr-spacing-x05)); + + .sps-matrixdynamic__add-btn { + display: initial; + margin: 0; + } +} + +.sps-matrixdynamic__placeholder-text { + @include ctrDefaultFont; + color: var(--ctr-survey-placeholder-text-color, var(--sjs-layer-1-foreground-50, #00000080)); + text-align: center; +} + +.sps-matrixdynamic__add-btn { + @include ctrDefaultBoldFont; + display: none; + appearance: none; + border: none; + margin-top: calcSize(0.5); + background: transparent; + color: var(--ctr-survey-action-button-text-color-positive, var(--sjs-primary-background-500, #19b394ff)); +} + +.sps-smiley-icon { + width: calcSize(3); + height: calcSize(3); + margin: calcSize(1); + border-radius: 100px; + border: 1px solid var(--ctr-actionbar-button-icon-color, var(--sjs-layer-1-foreground-75, #000000bf)); + display: flex; + justify-content: center; + align-items: center; + margin-right: calcSize(4); + + svg { + width: calcSize(1.5); + height: calcSize(1.5); + fill: var(--ctr-actionbar-button-icon-color, var(--sjs-layer-1-foreground-75, #000000bf)); + } +} + +.sps-matrixdynamic__dragged-row { + cursor: grabbing; + position: absolute; + z-index: 10000; + + .sps-table__row { + display: flex; + align-items: center; + flex: 1 0 0; + border-radius: var(--ctr-data-table-row-corner-radius-floating, var(--sjs-corner-radius-x05)); + background: var(--ctr-data-table-row-background-color, var(--sjs-layer-1-background-500, #ffffffff)); + box-shadow: + var(--ctr-data-table-row-shadow-floating-1-offset-x, 0px) + var(--ctr-data-table-row-shadow-floating-1-offset-y, 2px) var(--ctr-data-table-row-shadow-floating-1-blur, 8px) + var(--ctr-data-table-row-shadow-floating-1-spread, 0px) + var(--ctr-data-table-row-shadow-floating-1-color, var(--sjs-special-glow, #004c441a)), + var(--ctr-data-table-row-shadow-floating-2-offset-x, 0px) + var(--ctr-data-table-row-shadow-floating-2-offset-y, 16px) + var(--ctr-data-table-row-shadow-floating-2-blur, 32px) var(--ctr-data-table-row-shadow-floating-2-spread, 0px) + var(--ctr-data-table-row-shadow-floating-2-color, var(--sjs-special-glow, #004c441a)); + } +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-overriding.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-overriding.scss new file mode 100644 index 0000000000..94307b63f9 --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-overriding.scss @@ -0,0 +1,17 @@ +.sps-boolean-wrapper--overriding.sps-boolean-wrapper--overriding { + min-width: 0; + flex: 0 0 max-content; +} +.sps-link-wrapper--overriding { + align-self: end; + .svc-action-button { + text-decoration: underline; + padding: 0; + border: none; + margin: 0; + &:focus, + &:hover { + background-color: transparent; + } + } +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss new file mode 100644 index 0000000000..66294f6004 --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss @@ -0,0 +1,175 @@ +@use "../../../variables.scss" as *; +@use "./variables.scss" as *; + +.sps-panel { +} +.sps-panel__title { + @include ctrDefaultFont; + + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + box-sizing: border-box; + width: 100%; + padding: calcSize(2); + border: none; + outline: none; + color: var(--ctr-property-grid-chapter-caption-text-color, var(--sjs-layer-1-foreground-75, #000000bf)); + cursor: pointer; + background-color: var( + --ctr-property-grid-chapter-caption-background-color, + var(--sjs-layer-1-background-500, #ffffffff) + ); + box-shadow: inset 0px -1px 0px var(--ctr-property-grid-chapter-caption-border-color, var(--sjs-border-25, #d4d4d4ff)); + margin: 0; + transition: + color $creator-transition-duration, + background-color $creator-transition-duration, + opacity $creator-transition-duration; +} + +.sps-panel__title:disabled, +.sps-panel__title:disabled:hover { + color: var(--ctr-property-grid-chapter-caption-text-color-disabled, var(--sjs-layer-1-foreground-100, #000000e6)); + opacity: 0.25; + cursor: default; +} + +.sps-panel__title--collapsed:hover { + background-color: var( + --ctr-property-grid-chapter-caption-background-color-hovered, + var(--sjs-layer-1-background-400, #f5f5f5ff) + ); +} + +.sps-panel__title--expandable:focus { + background-color: var( + --ctr-property-grid-chapter-caption-background-color-focused, + var(--sjs-layer-1-background-400, #f5f5f5ff) + ); +} + +.sps-panel__title--expanded { + @include ctrDefaultBoldFont; + color: var(--ctr-property-grid-chapter-caption-text-color-selected, var(--sjs-layer-1-foreground-100, #000000e6)); +} + +.sps-panel__content { + display: flex; + flex-direction: column; + align-items: flex-start; + width: 100%; + padding-top: calc( + var(--ctr-property-grid-form-padding-top, var(--sjs-spacing-x2)) - + var(--ctr-property-grid-form-gap, var(--sjs-spacing-x2)) + ); + padding-inline-end: var(--ctr-property-grid-form-padding-right, var(--sjs-spacing-x4)); + padding-bottom: var(--ctr-property-grid-form-padding-bottom, var(--sjs-spacing-x5)); + padding-inline-start: var(--ctr-property-grid-form-padding-left, var(--sjs-spacing-x4)); + box-sizing: border-box; + background: var(--ctr-property-grid-form-background-color, var(--sjs-layer-1-background-500, #ffffffff)); + box-shadow: inset 0px -1px 0px var(--ctr-property-grid-chapter-caption-border-color, var(--sjs-border-25, #d4d4d4ff)); +} + +.sps-panel__content { + .sps-row { + width: 100%; + margin-top: var(--ctr-property-grid-form-gap, var(--sjs-spacing-x2)); + } + + .sps-row--multiple { + margin-top: var(--ctr-editor-layout-gap, var(--sjs-spacing-x1)); + } +} +.svc-side-bar--mobile { + .sps-panel__content { + padding-inline-end: var(--ctr-property-grid-form-padding-right, var(--sjs-spacing-x4)); + padding-inline-start: var(--ctr-property-grid-form-padding-left, var(--sjs-spacing-x4)); + } +} + +.sps-question__nopadding { + .sps-panel__content { + padding: 0px; + box-shadow: unset; + } +} +.sps-row--enter.sps-row.sps-row.sps-row { + margin-top: 0; +} +.sps-row--enter { + animation-fill-mode: forwards; + animation-name: fadeIn, moveInWithOverflow; + min-height: 0 !important; + opacity: 0; + height: 0; + animation-timing-function: $ease-out; + animation-delay: $sps-row-fade-in-delay, 0s, 0s; + animation-duration: $sps-row-fade-in-duration, $sps-row-move-in-duration, $sps-row-move-in-duration; +} +.sps-row--delayed-enter { + animation-delay: calc(#{$sps-row-fade-in-delay} + #{$sps-row-fade-in-animation-delay}), + $sps-row-fade-in-animation-delay, $sps-row-fade-in-animation-delay; +} + +.sps-row--leave { + animation-name: fadeIn, moveInWithOverflow; + animation-timing-function: $reverse-ease-out; + animation-fill-mode: forwards; + animation-direction: reverse; + min-height: 0 !important; + animation-delay: 0s, $sps-row-move-out-delay, $sps-row-move-out-delay; + animation-duration: $sps-row-fade-out-duration, $sps-row-move-out-duration, $sps-row-move-out-duration; +} + +.sps-panel__content--enter { + animation-name: fadeIn, moveInWithOverflow; + min-height: 0 !important; + opacity: 0; + animation-fill-mode: forwards; + animation-timing-function: $ease-out; + animation-duration: $sps-expand-fade-in-duration, $sps-expand-move-in-duration, $sps-expand-move-in-duration; + animation-delay: $sps-expand-fade-in-delay, 0s, 0s; +} + +.sps-panel__content--leave { + animation-name: fadeIn, moveInWithOverflow; + min-height: 0 !important; + animation-direction: reverse; + animation-fill-mode: forwards; + animation-timing-function: $reverse-ease-out; + animation-duration: $sps-collapse-fade-out-duration, $sps-collapse-move-out-duration, $sps-collapse-move-out-duration; + animation-delay: 0s, $sps-collapse-move-out-delay, $sps-collapse-move-out-delay; +} + +.svc-creator--disable-animations { + .sps-row--enter, + .sps-row--leave, + .sps-panel__content--enter, + .sps-panel__content--leave { + animation: none; + } +} +.sps-panel.sps-panel--group { + & > .sps-panel__content { + padding: 0; + box-shadow: none; + } + .sps-panel__title { + @include ctrDefaultFont; + color: var(--ctr-label-text-color, var(--sjs-layer-1-foreground-50, #00000080)); + box-shadow: none; + background-color: transparent; + padding-top: var(--ctr-label-padding-top, var(--sjs-spacing-x1)); + padding-inline-end: var(--ctr-label-padding-right, 0px); + padding-bottom: var(--ctr-label-padding-bottom, var(--sjs-spacing-x1)); + padding-inline-start: var(--ctr-label-padding-left, 0px); + color: var(--ctr-label-text-color, var(--sjs-layer-1-foreground-50, #00000080)); + } + .sps-row { + margin-top: var(--ctr-editor-layout-gap, var(--sjs-spacing-x1)); + } + .sps-row:first-of-type { + margin-top: 0; + } +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question-group.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question-group.scss new file mode 100644 index 0000000000..6e5cbe13e0 --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question-group.scss @@ -0,0 +1,10 @@ +@use "../../../variables.scss" as *; + +.sps-question-group { + .sps-row { + margin-top: 0; + &:not(:first-of-type) { + margin-top: calcSize(1); + } + } +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss new file mode 100644 index 0000000000..d55c1483aa --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss @@ -0,0 +1,262 @@ +@use "../../../variables.scss" as *; + +.sps-question { + display: flex; + flex-direction: column; + align-items: flex-start; + padding: 0px; + border-radius: var(--ctr-editor-corner-radius, var(--sjs-corner-radius-x075)); +} + +.sps-question.sps-question--disabled { + background-color: var(--ctr-editor-background-color-disabled, var(--sjs-layer-1-background-500, #ffffffff)); +} + +.sps-question__header { + width: 100%; +} + +.sps-question--disabled .sps-question__header { + opacity: var(--ctr-editor-label-opacity-disabled, 0.25); +} + +.sps-question__title { + @include ctrDefaultFont; + width: 100%; + margin: 0; + padding: var(--ctr-label-padding-top, var(--sjs-spacing-x1)) var(--ctr-label-padding-right, 0px) + var(--ctr-label-padding-bottom, var(--sjs-spacing-x1)) var(--ctr-label-padding-left, 0px); + color: var(--ctr-label-text-color, var(--sjs-layer-1-foreground-50, #00000080)); + box-sizing: border-box; +} +.sps-question__title.sd-element__title--disabled { + color: var(--ctr-caption-with-actions-text-color-disabled, var(--sjs-layer-1-foreground-100, #000000e6)); +} + +.sps-question__content { + width: 100%; + cursor: pointer; +} + +.sps-question--disabled .sps-question__content { + cursor: default; +} + +.sps-text__content, +.sps-comment__content { + position: relative; +} + +.sps-question__content:focus-within .sps-remaining-character-counter { + display: flex; +} + +.sps-remaining-character-counter { + @include ctrSmallFont; + display: none; + flex-direction: row; + justify-content: flex-end; + align-items: flex-end; + padding: 0px; + color: var(--ctr-editor-label-color, var(--sjs-layer-3-foreground-50, #00000080)); + position: absolute; + inset-inline-end: calcSize(0.75); + inset-block-end: calcSize(0.5); +} + +.sps-question__description { + @include ctrSmallFont; + color: var(--ctr-caption-with-actions-description-text-color, var(--sjs-layer-1-foreground-50, #00000080)); + padding-bottom: calcSize(2); + white-space: normal; +} + +.sps-question--disabled .sps-question__description { + color: var(--ctr-caption-with-actions-description-text-color, var(--sjs-layer-1-foreground-50, #00000080)); +} + +.sps-row-narrow__question { + --thm-ctr-property-grid-form-gap: var(--ctr-property-grid-form-gap, var(--sjs-spacing-x2)); + margin-top: calc(-1 * var(--thm-ctr-property-grid-form-gap)); +} + +.sps-row--multiple { + & > div > .sps-row-narrow__question { + --thm-ctr-editor-layout-gap: var(--ctr-editor-layout-gap, var(--sjs-spacing-x1)); + margin-top: calc(-1 * var(--thm-ctr-editor-layout-gap)); + } +} + +.sps-question--location--left { + flex-direction: row; + background: var(--ctr-editor-background-color, var(--sjs-layer-3-background-500, #f4f4f4ff)); + box-shadow: inset 0 0 0 var(--ctr-editor-border-width, var(--sjs-stroke-x1)) + var(--ctr-editor-border-color, var(--sjs-border-10, #dcdcdcff)); + line-height: calcSize(6); + vertical-align: middle; + align-items: stretch; + border-radius: var(--ctr-editor-corner-radius, var(--sjs-corner-radius-x075)); + + &:focus-within { + box-shadow: inset 0 0 0 var(--ctr-editor-border-width-focused, var(--sjs-stroke-x2)) + var(--ctr-editor-border-color-focused, var(--sjs-primary-background-500, #19b394ff)); + } +} + +.sps-question--disabled.sps-question--location--left .sps-question__title { + color: var(--ctr-editor-content-text-color-disabled, var(--sjs-layer-1-foreground-100, #000000e6)); +} + +.sps-question__header--location--left { + width: max-content; + box-sizing: border-box; + max-width: 50%; + flex: 0 0; + display: flex; + align-items: center; + padding-inline-start: var(--ctr-editor-padding-left, var(--sjs-spacing-x05)); + + .sps-question__title { + padding: var(--ctr-editor-label-padding-top, var(--sjs-spacing-x1)) + var(--ctr-editor-label-padding-right, var(--sjs-spacing-x2)) + var(--ctr-editor-label-padding-bottom, var(--sjs-spacing-x1)) + var(--ctr-editor-label-padding-left, var(--sjs-spacing-x150)); + border-inline-end: var(--ctr-editor-label-separator-width, var(--sjs-stroke-x1)) solid + var(--ctr-editor-label-separator-color, var(--sjs-border-10, #dcdcdcff)); + display: inline-block; + color: var(--ctr-editor-label-color, var(--sjs-layer-3-foreground-50, #00000080)); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + .sv-string-viewer { + white-space: nowrap; + } + } +} + +.sps-question__content--left { + flex: 2; + + .sps-input.sps-input.sps-input { + background-color: transparent; + box-shadow: none; + border: none; + + &:focus, + &:focus-within { + box-shadow: none; + } + } +} + +.sps-row--multiple { + display: flex; + gap: var(--ctr-editor-layout-gap, var(--sjs-spacing-x1)); + flex-wrap: wrap; + + & > div { + flex-grow: 1; + min-width: calcSize(25.5); + + input { + min-width: calc(max(17 * #{$base-unit}, 100%)); + width: 0; + } + } +} + +.sps-question__erbox { + @include ctrDefaultFont; + width: 100%; + box-sizing: border-box; + padding: var(--ctr-error-message-padding-top, var(--sjs-spacing-x1)) + var(--ctr-error-message-padding-right, var(--sjs-spacing-x150)) + var(--ctr-error-message-padding-bottom, var(--sjs-spacing-x1)) + var(--ctr-error-message-padding-left, var(--sjs-spacing-x150)); + + color: var(--ctr-error-message-text-color, var(--sjs-layer-1-foreground-100, #000000e6)); + background-color: var(--ctr-error-message-background-color, var(--sjs-semantic-red-background-10, #e50a3e1a)); + border-radius: var(--ctr-error-message-corner-radius, var(--sjs-corner-radius-x05)); +} + +.sps-question__erbox, +.sps-question__erbox > svc-question-error, +sv-question-error { + & > div { + display: flex; + gap: var(--ctr-error-message-gap, var(--sjs-spacing-x1)); + } +} + +.sps-question__erbox-icon { + width: var(--ctr-error-message-icon-width, var(--sjs-font-size-x3)); + height: var(--ctr-error-message-icon-height, var(--sjs-font-size-x3)); + + .sv-svg-icon { + vertical-align: top; + width: var(--ctr-error-message-icon-width, var(--sjs-font-size-x3)); + height: var(--ctr-error-message-icon-height, var(--sjs-font-size-x3)); + } + + use { + fill: var(--ctr-error-message-icon-color, var(--sjs-semantic-red-background-500, #e50a3eff)); + } +} + +.sps-question__erbox--below-question { + margin-top: calcSize(1); +} + +.sps-restfull, +.sps-masksettings { + .sps-panel__content { + gap: calcSize(2); + + .sps-row { + margin-top: 0; + } + } +} + +.sps-question--highlighted { + .sps-input, + .sps-input-container, + .sps-question--location--left, + .sps-table__cell:not(.sps-table__cell--detail-panel) .sps-input { + box-shadow: inset 0 0 0 var(--ctr-editor-border-width-highlighed, var(--sjs-stroke-x2)) + var(--ctr-editor-border-color-highlighted, var(--sjs-layer-1-foreground-75, #000000bf)); + } + + .sps-checkbox__control:focus + .sps-checkbox__rectangle, + .sps-matrixdynamic__content.sps-text__content { + outline: var(--ctr-editor-border-width-highlighed, var(--sjs-stroke-x2)) solid + var(--ctr-editor-border-color-highlighted, var(--sjs-layer-1-foreground-75, #000000bf)); + outline-offset: calc(-1 * var(--ctr-editor-border-width-highlighed, var(--sjs-stroke-x2))); + border-radius: var(--ctr-data-table-corner-radius, var(--sjs-corner-radius-x075)); + + .sps-input { + box-shadow: none; + } + } + + .svc-action-button { + border: var(--ctr-actionbar-button-border-width-highlighed, var(--sjs-stroke-x2)) solid + var(--ctr-actionbar-button-border-color-highlighted, var(--sjs-layer-1-foreground-75, #000000bf)); + } + + .sv-button-group { + box-shadow: 0 0 0 1px var(--ctr-editor-border-color-highlighted, var(--sjs-layer-1-foreground-75, #000000bf)); + border-color: var(--ctr-editor-border-color-highlighted, var(--sjs-layer-1-foreground-75, #000000bf)); + } + + .sps-checkbox__control + .sps-checkbox__rectangle { + outline: var(--ctr-editor-border-width-highlighed, var(--sjs-stroke-x2)) solid + var(--ctr-editor-border-color-highlighted, var(--sjs-layer-1-foreground-75, #000000bf)); + outline-offset: calc(-1 * var(--ctr-editor-border-width-highlighed, var(--sjs-stroke-x2))); + } + + .sps-button-group::after { + box-shadow: inset 0 0 0 var(--ctr-button-group-border-width-focused, var(--sjs-stroke-x2)) + var(--ctr-editor-border-color-highlighted, var(--sjs-layer-1-foreground-75, #000000bf)); + } +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-search-editor.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-search-editor.scss new file mode 100644 index 0000000000..63c75a7363 --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-search-editor.scss @@ -0,0 +1,54 @@ +@use "../../../variables.scss" as *; + +.svc-side-bar { + .svc-search { + border-bottom: 1px solid var(--ctr-property-grid-search-border-color, var(--sjs-border-10, #dcdcdcff)); + background: var(--ctr-property-grid-search-background-color, var(--sjs-layer-3-background-500, #f4f4f4ff)); + gap: var(--ctr-property-grid-search-gap, var(--sjs-spacing-x1)); + + padding: var(--ctr-property-grid-search-padding-top, var(--sjs-spacing-x2)) + var(--ctr-property-grid-search-padding-right, var(--sjs-spacing-x2)) + var(--ctr-property-grid-search-padding-bottom, var(--sjs-spacing-x2)) + var(--ctr-property-grid-search-padding-left, var(--sjs-spacing-x2)); + } + + .svc-search__input { + color: var(--ctr-property-grid-search-text-color, var(--sjs-layer-3-foreground-100, #000000e6)); + } + + .svc-search__input::placeholder { + color: var(--ctr-property-grid-search-text-color-placeholder, var(--sjs-layer-3-foreground-50, #00000080)); + } + + .svc-search__bar-item:not(.sv-action-bar-item--pressed) { + &:hover:enabled, + &:focus:enabled { + background-color: var( + --ctr-property-grid-search-button-background-color-hovered, + var(--sjs-layer-3-background-400, #eaeaeaff) + ); + } + } + + .svc-search__toolbar .sv-action-bar-item__icon use { + fill: var(--ctr-property-grid-search-button-icon-color, var(--sjs-layer-3-foreground-50, #00000080)); + } + + .svc-search__toolbar-counter { + color: var(--ctr-property-grid-search-count-text-color, var(--sjs-layer-3-foreground-50, #00000080)); + } + + .svc-search__search-icon { + width: var(--ctr-property-grid-search-icon-width, var(--sjs-font-size-x3)); + height: var(--ctr-property-grid-search-icon-height, var(--sjs-font-size-x3)); + + .sv-svg-icon { + width: var(--ctr-property-grid-search-icon-width, var(--sjs-font-size-x3)); + height: var(--ctr-property-grid-search-icon-height, var(--sjs-font-size-x3)); + + use { + fill: var(--ctr-property-grid-search-icon-color, var(--sjs-layer-3-foreground-50, #00000080)); + } + } + } +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss new file mode 100644 index 0000000000..2b8dad1acb --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -0,0 +1,212 @@ +@use "../../../variables.scss" as *; +@use "./variables.scss" as *; + +.sps-table-wrapper { + border: var(--ctr-data-table-border-width, var(--sjs-stroke-x1)) solid + var(--ctr-data-table-border-color, var(--sjs-border-25, #d4d4d4ff)); + border-radius: var(--ctr-data-table-corner-radius, var(--sjs-corner-radius-x075)); + overflow: hidden; +} + +.sps-table { + width: 100%; + background-color: var(--ctr-data-table-background-color, var(--sjs-layer-1-background-400, #f5f5f5ff)); + border-collapse: collapse; + + tr { + border-bottom: var(--ctr-data-table-row-border-width, var(--sjs-stroke-x1)) solid + var(--ctr-data-table-row-border-color, var(--sjs-border-10, #dcdcdcff)); + background-color: var(--ctr-data-table-row-background-color, var(--sjs-layer-1-background-500, #ffffffff)); + } + tbody > tr:last-of-type { + border-bottom: var(--ctr-data-table-row-border-width-last-row, 0px); + } +} + +.sps-table__cell { + padding: 0; +} + +.sps-table__cell--detail-panel { + background: var(--ctr-data-table-background-color, var(--sjs-layer-1-background-400, #f5f5f5ff)); + + .sps-panel__content { + box-shadow: none; + } +} +.sps-table__cell:where(:not(.sps-table__cell--detail-panel)) { + .sps-checkbox { + margin: 0 calcSize(2); + } +} + +.sps-table__cell:not(.sps-table__cell--detail-panel):not(.sps-table__cell--actions):first-of-type { + padding-left: 8px; +} + +.sps-table__cell:not(.sps-table__cell--detail-panel) { + .sps-input { + appearance: none; + box-shadow: none; + border-radius: var(--ctr-data-table-cell-corner-radius-focused, var(--sjs-corner-radius-x075)); + background-color: var(--ctr-data-table-row-background-color, var(--sjs-layer-1-background-500, #ffffffff)); + height: auto; + padding: var(--ctr-data-table-cell-padding-top, var(--sjs-spacing-x1)) + var(--ctr-data-table-cell-padding-right, var(--sjs-spacing-x1)) + var(--ctr-data-table-cell-padding-bottom, var(--sjs-spacing-x1)) + var(--ctr-data-table-cell-padding-left, var(--sjs-spacing-x1)); + + &[type="color"] { + padding-right: 0; + } + + &:focus, + &:focus-within { + box-shadow: inset 0 0 0 2px + var(--ctr-data-table-cell-border-color-focused, var(--sjs-primary-background-500, #19b394ff)); + } + } + + .sps-dropdown { + width: max-content; + min-height: auto; + } + + .sps-dropdown_chevron-button { + position: static; + } + .sps-dropdown_select-wrapper { + display: flex; + align-items: center; + width: max-content; + max-width: 100%; + } + + .sps-dropdown__value { + margin: 0; + } + + .sd-editor-button-item { + padding: 0; + } + + .sv-editor-button-item__icon { + opacity: var(--ctr-data-table-cell-drop-down-arrow-opacity, 0.5); + + use { + fill: var(--ctr-data-table-cell-drop-down-arrow-color, var(--sjs-layer-1-foreground-50, #00000080)); + } + } +} + +.sps-table__cell:not(.sps-table__cell--detail-panel):first-of-type .sps-text { + padding-left: calcSize(2); +} + +.sps-table__cell--actions:first-of-type { + width: calcSize(5); +} + +.sps-table__cell--actions:last-of-type { + .sps-action-bar { + justify-content: flex-end; + padding-inline-end: var(--ctr-data-table-row-padding-right, var(--sjs-spacing-x05)); + } +} + +// .sps-table__cell--actions > .sps-matrixdynamic__drag-element { +// display: inline-block; +// margin-top: calcSize(0.5); +// cursor: move; +// } + +.sps-table__cell--header { + background: var(--ctr-data-table-row-background-color-header, var(--sjs-layer-3-background-500, #f4f4f4ff)); + text-align: left; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + max-width: 100px; + padding: var(--ctr-data-table-row-padding-top-header, var(--sjs-spacing-x1)) + var(--ctr-data-table-cell-padding-right, var(--sjs-spacing-x1)) + var(--ctr-data-table-row-padding-bottom-header, var(--sjs-spacing-x1)) + var(--ctr-data-table-cell-padding-left, var(--sjs-spacing-x1)); + + @include ctrSmallFont; + color: var(--ctr-data-table-cell-text-color-header, var(--sjs-layer-3-foreground-50, #00000080)); + + span { + display: none; + } + + .sv-string-viewer { + display: inline; + white-space: unset; + } +} +.sps-table__question-wrapper { + box-sizing: border-box; + padding: var(--ctr-data-table-row-padding-top, var(--sjs-spacing-x05)) + var(--ctr-data-table-row-padding-right, var(--sjs-spacing-x05)) + var(--ctr-data-table-row-padding-bottom, var(--sjs-spacing-x05)) var(--ctr-data-table-row-padding-left, 0px); +} + +.sps-table__row--leave, +.sps-table__row--enter { + animation-name: empty; + --move-whole-animation-duration: calc(var(--move-animation-duration) + var(--move-animation-delay)); + --fade-whole-animation-duration: calc(var(--fade-animation-duration) + var(--fade-animation-delay)); + animation-duration: max(var(--fade-whole-animation-duration), var(--move-whole-animation-duration)); + & > td { + & > div { + animation-name: fadeIn, moveInWithOverflow; + opacity: 0; + animation-direction: var(--animation-direction); + animation-timing-function: var(--animation-timing-function); + animation-fill-mode: forwards; + animation-duration: var(--fade-animation-duration), var(--move-animation-duration), var(--move-animation-duration); + animation-delay: var(--fade-animation-delay), var(--move-animation-delay), var(--move-animation-delay); + } + } +} +.sps-table__row--enter { + --move-animation-delay: 0s; + --move-animation-duration: #{$sps-matrix-row-move-in-duration}; + --fade-animation-duration: #{$sps-matrix-row-fade-in-duration}; + --fade-animation-delay: #{$sps-matrix-row-fade-in-delay}; + --animation-direction: normal; + --animation-timing-function: #{$ease-out}; +} +.sps-table__row--leave { + --move-animation-delay: #{$sps-matrix-row-move-out-delay}; + --move-animation-duration: #{$sps-matrix-row-move-out-duration}; + --fade-animation-duration: #{$sps-matrix-row-fade-out-duration}; + --fade-animation-delay: 0s; + --animation-direction: reverse; + --animation-timing-function: #{$reverse-ease-out}; +} +.sps-table__row--detail { + &.sps-table__row--enter { + --move-animation-delay: 0s; + --move-animation-duration: #{$sps-matrix-detail-row-move-in-duration}; + --fade-animation-duration: #{$sps-matrix-detail-row-fade-in-duration}; + --fade-animation-delay: #{$sps-matrix-detail-row-fade-in-delay}; + --animation-direction: normal; + --animation-timing-function: #{$ease-out}; + } + &.sps-table__row--leave { + --move-animation-delay: #{$sps-matrix-detail-row-move-out-delay}; + --move-animation-duration: #{$sps-matrix-detail-row-move-out-duration}; + --fade-animation-duration: #{$sps-matrix-detail-row-fade-out-duration}; + --fade-animation-delay: 0s; + --animation-direction: reverse; + --animation-timing-function: #{$reverse-ease-out}; + } +} + +.svc-creator--disable-animations { + .sps-table__row--enter, + .sps-table__row--leave { + animation: none; + } +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-theme-builder.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-theme-builder.scss new file mode 100644 index 0000000000..c5c7c968f6 --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-theme-builder.scss @@ -0,0 +1,157 @@ +@use "../../../variables.scss" as *; + +.sps-theme-builder-root { + .sv-skeleton-element { + min-height: 50px; + } + + .sps-paneldynamic__separator { + border: none; + margin: 0; + height: calcSize(1); + } + .sps-paneldynamic__footer { + .sps-paneldynamic__separator { + display: none; + } + } + .sps-paneldynamic__buttons-container { + display: flex; + justify-content: center; + .sps-action-bar { + margin: 0; + } + } + + .sps-panel__footer { + justify-content: center; + margin: calcSize(1) 0 0 0; + padding: 0; + } + .sps-panel__content .sps-row.sps-row { + animation: none; + } + + .sps-paneldynamic__add-btn { + margin: 0 auto; + } + + .sps-row--multiple { + .sps-spin-editor { + .sps-input-container__buttons-container { + display: none; + } + } + + & > div { + flex-grow: 1; + flex-shrink: 1; + flex-basis: calc(50% - #{$base-unit} * 0.5); + min-width: auto; + + input { + min-width: 0; + } + + .sps-question--location--left { + box-sizing: border-box; + + .sps-input { + height: auto; + } + } + } + } + + .sv-button-group { + overflow: hidden; + } + + //2 level nested + .sps-panel-by-page, + .sps-nested-panel { + padding-bottom: calcSize(5); + + &::after { + content: " "; + display: block; + position: relative; + left: calcSize(-4); + top: calc(5 * #{$base-unit}); + width: calc(8 * #{$base-unit} + 100%); + height: 1px; + background-color: var(--ctr-editor-border-color, var(--sjs-border-10, #dcdcdcff)); + } + } + + .sps-panel-by-page__content > .sps-row:first-of-type, + .sps-nested-panel__content > .sps-row:first-of-type { + margin-top: 0; + } + + .sps-panel-by-page.sps-panel--hidden-border, + .sps-row:last-of-type > div > .sps-panel-by-page, + .sps-paneldynamic__panel-wrapper > .sps-nested-panel, + .sps-row:last-of-type > div > .sps-nested-panel { + padding-bottom: 0; + + &::after { + content: none; + } + } + + .sps-panel-by-page.sps-panel--padding { + padding-top: calcSize(2); + padding-bottom: calcSize(3); + } + + .sps-theme-group-caption { + @include ctrDefaultBoldFont; + color: var(--ctr-property-grid-group-caption-text-color, var(--sjs-layer-1-foreground-100, #000000e6)); + + position: relative; + top: calc(4 * #{$base-unit}); + padding: calc(1 * #{$base-unit}) 0; + cursor: auto; + } + + .sv-theme-group_title-action .sps-action-button:hover, + .sv-theme-group_title-action .sps-action-button:focus { + background-color: unset; + } + + .sd-panel__header.sd-element__header .sps-action-bar { + pointer-events: none; + } + + .sps-header { + margin-top: calcSize(-2); + } + + .sd-question--title-top .sps-paneldynamic { + --thm-ctr-editor-layout-gap: var(--ctr-editor-layout-gap, var(--sjs-spacing-x1)); + margin-top: calc(-1 * var(--thm-ctr-editor-layout-gap)); + } + + .sps-question.sps-row__question:not(.sd-question--title-top):not(.sps-question--boolean), + .sps-question__content-coloralpha { + --thm-ctr-property-grid-form-gap: var(--ctr-property-grid-form-gap, var(--sjs-spacing-x2)); + --thm-ctr-editor-layout-gap: var(--ctr-editor-layout-gap, var(--sjs-spacing-x1)); + margin-top: calc(var(--thm-ctr-editor-layout-gap) - var(--thm-ctr-property-grid-form-gap)); + } + + .sps-row--multiple .sps-question.sps-row__question:not(.sd-question--title-top) { + margin-top: 0; + } + + .sps-question-composite__content .sps-row:first-of-type { + margin-top: var(--ctr-editor-layout-gap, var(--sjs-spacing-x1)); + } +} + +.svc-side-bar--mobile .sps-theme-builder-root { + .sps-nested-panel__content::after { + width: calc(4 * var(--sjs-base-unit, var(--base-unit, 8px)) + 100%); + left: calc(-2 * var(--sjs-base-unit, var(--base-unit, 8px))); + } +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/variables.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/variables.scss new file mode 100644 index 0000000000..9316f04c27 --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/variables.scss @@ -0,0 +1,28 @@ +$sps-row-fade-in-duration: var(--sjs-sps-row-fade-in-duration, 500ms); +$sps-row-move-in-duration: var(--sjs-sps-move-in-duration, 150ms); +$sps-row-fade-in-delay: var(---sjs-sps-row-fade-in-delay, 150ms); +$sps-row-fade-out-duration: var(--sjs-sps-row-fade-out-duration, 150ms); +$sps-row-move-out-duration: var(--sjs-sps-row-move-out-duration, 250ms); +$sps-row-move-out-delay: var(--sjs-sps-row-move-out-delay, 100ms); +$sps-row-fade-in-animation-delay: var(--sjs-sps-row-fade-in-animation-delay, 400ms); + +$sps-expand-fade-in-duration: var(--sjs-sps-expand-fade-in-duration, 350ms); +$sps-expand-move-in-duration: var(--sjs-sps-expand-move-in-duration, 350ms); +$sps-expand-fade-in-delay: var(--sjs-sps-expand-fade-in-delay, 0ms); +$sps-collapse-fade-out-duration: var(--sjs-sps-collapse-fade-out-duration, 350ms); +$sps-collapse-move-out-duration: var(--sjs-sps-collapse-move-out-duration, 350ms); +$sps-collapse-move-out-delay: var(--sjs-sps-collapse-move-out-delay, 0ms); + +$sps-matrix-row-fade-in-duration: var(--sjs-sps-matrix-row-fade-in-duration, 250ms); +$sps-matrix-row-move-in-duration: var(--sjs-sps-matrix-row-move-in-duration, 150ms); +$sps-matrix-row-fade-in-delay: var(--sjs-sps-matrix-row-fade-in-delay, 150ms); +$sps-matrix-row-fade-out-duration: var(--sjs-sps-matrix-row-fade-out-duration, 100ms); +$sps-matrix-row-move-out-duration: var(--sjs-sps-matrix-row-move-out-duration, 250ms); +$sps-matrix-row-move-out-delay: var(--sjs-sps-matrix-row-move-out-delay, 100ms); + +$sps-matrix-detail-row-fade-in-duration: var(--sjs-sps-matrix-detail-row-fade-in-duration, 500ms); +$sps-matrix-detail-row-move-in-duration: var(--sjs-sps-matrix-detail-row-move-in-duration, 150ms); +$sps-matrix-detail-row-fade-in-delay: var(--sjs-sps-matrix-detail-row-fade-in-delay, 150ms); +$sps-matrix-detail-row-fade-out-duration: var(--sjs-sps-matrix-detail-row-fade-out-duration, 150ms); +$sps-matrix-detail-row-move-out-duration: var(--sjs-sps-matrix-detail-row-move-out-duration, 250ms); +$sps-matrix-detail-row-move-out-delay: var(--sjs-sps-matrix-detail-row-move-out-delay, 100ms); diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss new file mode 100644 index 0000000000..e16ff82136 --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -0,0 +1,147 @@ +@use "../../variables" as *; +@use "blocks/sps-action-bar.scss"; +@use "blocks/sps-question.scss"; +@use "blocks/sps-input.scss"; +@use "blocks/sps-dropdown.scss"; +@use "blocks/sps-comment.scss"; +@use "blocks/sps-panel.scss"; +@use "blocks/sps-checkbox.scss"; +@use "blocks/sps-matrixdynamic.scss"; +@use "blocks/sps-table.scss"; +@use "blocks/sps-question-group.scss"; +@use "blocks/sps-color-editor.scss"; +@use "blocks/sps-file-edit.scss"; +@use "blocks/sps-link"; +@use "blocks/sps-theme-builder.scss"; +@use "blocks/sps-overriding.scss"; +@use "blocks/sps-search-editor.scss"; +@use "blocks/sps-buttongroup.scss"; + +.sps-root-modern { + position: relative; + width: 100%; + border-inline-end: 1px solid transparent; + background: var(--ctr-property-grid-background-color, var(--sjs-layer-1-background-500, #ffffffff)); + box-sizing: border-box; + height: 0; + flex-grow: 1; + /* disable library transition animations */ + --sjs-transition-duration: 0ms; + @include disableLibraryAnimations; +} + +.sps-container { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; +} + +.sps-root-modern.sps-root--one-category { + border-inline-end: unset; + background-color: var(--ctr-property-grid-form-background-color, var(--sjs-layer-1-background-500, #ffffffff)); + + .sps-page.sps-body__page { + box-shadow: unset; + } +} + +.sv-popup--modal-popup { + &.svc-property-editor .sv-popup__container { + .sv-popup_shadow { + background-color: transparent; + } + + .sd-root-modern { + background-color: transparent; + } + + .sd-page { + margin: 0; + padding: 0; + } + + .sv-components-column--expandable { + min-width: calcSize(78); + } + } + + .sv-popup__footer { + padding-bottom: 2px; + } + + .sd-body, + .sl-body { + min-width: calcSize(78); + padding: 0; + } +} + +.sv-popup.svc-property-editor .sd-root-modern { + --sd-mobile-width: 0; +} + +.svc-object-selector .sv-popup__container { + margin-left: calcSize(1); + margin-right: calcSize(1); +} + +.svc-object-selector__content { + position: relative; + height: 100%; + min-height: 0; + display: flex; + flex-direction: column; +} + +.sps-action-title-bar { + margin-inline-end: var(--ctr-data-table-border-width, var(--sjs-stroke-x1)); + padding-inline-end: var(--ctr-caption-with-actions-actionbar-padding-right, calcSize(0.5)); +} + +.sps-body { + width: 100%; +} + +.sps-body--empty { + margin: calcSize(3); +} + +.sps-title-toolbar--single-help-action { + justify-content: flex-start; + padding-left: calcSize(0.5); + + // flex-grow: 0; + // margin-left: 0; + // padding-left: 0; + + .sps-help-action { + margin-inline-end: auto; + + .sps-action-button--icon { + padding: var(--ctr-actionbar-button-padding-top-small-icon, var(--sjs-spacing-x05)) + var(--ctr-actionbar-button-padding-right-small-icon, var(--sjs-spacing-x05)) + var(--ctr-actionbar-button-padding-bottom-small-icon, var(--sjs-spacing-x05)) + var(--ctr-actionbar-button-padding-left-small-icon, var(--sjs-spacing-x05)); + opacity: var(--ctr-actionbar-button-opacity-muted, 0.35); + } + + .sps-action-button--icon:focus, + .sps-action-button--icon:hover { + opacity: 1; + } + + .sps-action-button:active { + opacity: var(--ctr-actionbar-button-opacity-pressed, 0.5); + } + + .sps-action-button__icon { + width: var(--ctr-actionbar-button-icon-width-small, var(--sjs-font-size-x2)); + height: var(--ctr-actionbar-button-icon-height-small, var(--sjs-font-size-x2)); + } + + svg { + fill: var(--ctr-actionbar-button-icon-color, var(--sjs-layer-1-foreground-75, #000000bf)); + } + } +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.ts b/packages/survey-creator-core/src/presets/presets-theme/presets.ts new file mode 100644 index 0000000000..2c08aef57e --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.ts @@ -0,0 +1,448 @@ +//import { listComponentCss } from "../components/list-theme"; + +export var presetsCss = { + root: "sps-root-modern", + container: "sps-container-modern", + header: "sps-title sps-container-modern__title", + body: "sps-body", + bodyEmpty: "sps-body sps-body--empty", + footer: "sps-footer sps-body__footer sps-clearfix", + title: "", + description: "", + logo: "sps-logo", + logoImage: "sps-logo__image", + headerText: "sps-header__text", + navigationButton: "", + completedPage: "sps-completedpage", + navigation: { + complete: "sps-btn sps-footer__complete-btn", + prev: "sps-btn sps-footer__prev-btn", + next: "sps-btn sps-footer__next-btn", + start: "sps-btn sps-footer__start-btn", + preview: "sps-btn sps-footer__preview-btn", + edit: "sps-btn sps-footer__edit-btn" + }, + panel: { + withFrame: "", + nested: "", + expandableAnimating: "", + title: "sps-title sps-panel__title", + titleBar: "sd-action-title-bar sps-action-title-bar", + contentEnter: "sps-panel__content--enter", + contentLeave: "sps-panel__content--leave", + titleExpandable: "sps-panel__title--expandable", + titleExpanded: "sps-panel__title--expanded", + titleCollapsed: "sps-panel__title--collapsed", + titleOnError: "sps-panel__title--error", + description: "sps-description sps-panel__description", + container: "sps-panel sps-row__panel", + content: "sps-panel__content", + icon: "sps-panel__icon", + iconExpanded: "sps-panel__icon--expanded", + footer: "sps-panel__footer", + requiredMark: "sps-panel__required-text" + }, + paneldynamic: { + nested: "", + mainRoot: "sps-question sps-row__question", + root: "sps-paneldynamic", + navigation: "sps-paneldynamic__navigation", + title: "sps-title sps-question__title", + button: "sps-action-button sps-action-button--text", + buttonRemove: "sps-action-button--danger", + buttonAdd: "sps-paneldynamic__add-btn", + panelsContainer: "", + panelWrapper: "sps-paneldynamic__panel-wrapper", + panelWrapperList: "", + progressTop: "sps-paneldynamic__progress sps-paneldynamic__progress--top", + progressBottom: + "sps-paneldynamic__progress sps-paneldynamic__progress--bottom", + buttonPrev: "sps-paneldynamic__prev-btn", + buttonNext: "sps-paneldynamic__next-btn", + progressContainer: "sps-paneldynamic__progress-container", + progress: "sps-progress", + progressBar: "sps-progress__bar", + progressText: "sps-paneldynamic__progress-text", + panelFooter: "sps-panel__footer", + separator: "sps-paneldynamic__separator", + footer: "sps-paneldynamic__footer", + footerButtonsContainer: "sps-paneldynamic__buttons-container", + }, + progress: "sps-progress sps-body__progress", + progressBar: "sps-progress__bar", + progressText: "sps-progress__text", + progressTextInBar: "sps-hidden", + page: { + root: "sps-page sps-body__page", + title: "sps-title sps-page__title", + description: "sps-description sps-page__description" + }, + pageTitle: "sps-title sps-page__title", + pageDescription: "sps-description sps-page__description", + row: "sps-row sps-clearfix", + rowEnter: "sps-row--enter", + rowLeave: "sps-row--leave", + rowDelayedEnter: "sps-row--delayed-fade-in", + rowMultiple: "sps-row--multiple", + question: { + withFrame: "", + nested: "", + mainRoot: "sps-question sps-row__question", + flowRoot: "sps-question sps-row__question sps-row__question--flow", + asCell: "sps-table__cell", + header: "sps-question__header", + headerLeft: "sps-question__header--location--left", + headerTop: "sps-question__header--location--top", + headerBottom: "sps-question__header--location--bottom", + content: "sps-question__content", + contentLeft: "sps-question__content--left", + titleLeftRoot: "sps-question--location--left", + titleOnAnswer: "sps-question__title--answer", + titleOnError: "sps-question__title--error", + title: "sps-title sps-question__title", + titleBar: "sd-action-title-bar sps-action-title-bar", + requiredMark: "sps-question__required-text", + number: "sps-question__num", + description: "sps-description sps-question__description", + descriptionUnderInput: "sps-description sps-question__description", + comment: "sps-comment", + required: "sps-question--required", + titleRequired: "sps-question__title--required", + indent: 0, + footer: "sps-question__footer", + formGroup: "sps-question__form-group", + hasError: "", + readOnly: "sd-question--readonly sps-question--disabled", + confirmDialog: "sps-popup--confirm sv-popup--confirm svc-creator-popup", + errorsContainerBottom: "sps-question__erbox--below-question", + }, + image: { root: "sps-image", image: "sv_image_image" }, + error: { + root: "sps-question__erbox", + icon: "sps-question__erbox-icon", + item: "", + locationTop: "sps-question__erbox--location--top", + locationBottom: "sps-question__erbox--location--bottom" + }, + checkbox: { + root: "sps-selectbase", + item: "sps-item sps-checkbox sps-selectbase__item", + itemSelectAll: "sps-checkbox--selectall", + itemNone: "sps-checkbox--none", + itemReadOnly: "sps-item--disabled sps-checkbox--disabled", + itemChecked: "sps-checkbox--checked", + itemHover: "sps-checkbox--allowhover", + itemInline: "sps-selectbase__item--inline", + label: "sps-selectbase__label", + // label: "sps-checkbox", + itemSvgIconId: "#icon-v2check", + labelChecked: "", + //itemControl: "sps-visuallyhidden sps-item__control", + itemControl: "sps-checkbox__control", + itemDecorator: "sps-checkbox__svg", + //itemDecorator: "sps-checkbox__hidden", + //controlLabel: "sps-item__control-label", + controlLabel: "sps-checkbox__caption", + materialDecorator: "sps-checkbox__rectangle", + //materialDecorator: "sps-item__decorator sps-checkbox__decorator", + other: "sps-comment sps-question__other", + column: "sps-selectbase__column" + }, + radiogroup: { + root: "sps-selectbase", + item: "sps-item sps-radio sps-selectbase__item", + itemInline: "sps-selectbase__item--inline", + label: "sps-selectbase__label", + labelChecked: "", + itemReadOnly: "sps-item--disabled sps-radio--disabled", + itemChecked: "sps-radio--checked", + itemHover: "sps-radio--allowhover", + itemControl: "sps-visuallyhidden sps-item__control", + itemDecorator: "sps-item__svg sps-radio__svg", + controlLabel: "sps-item__control-label", + materialDecorator: "sps-item__decorator sps-radio__decorator", + other: "sps-comment sps-question__other", + clearButton: "sps-btn sps-selectbase__clear-btn", + column: "sps-selectbase__column" + }, + boolean: { + mainRoot: "sps-question sps-row__question sps-question--boolean", + rootCheckbox: "sps-selectbase", + checkboxItem: "sps-checkbox", + checkboxItemChecked: "sps-checkbox--checked", + checkboxitemIndeterminate: "sps-checkbox--indeterminate", + checkboxItemReadOnly: "sps-checkbox--disabled", + svgIconId: "#icon-v2check", + checkboxLabel: "sps-selectbase__label", + controlCheckbox: "sps-checkbox__control", + checkboxControlLabel: "sps-checkbox__caption", + checkboxItemDecorator: "sps-checkbox__svg", + checkboxMaterialDecorator: "sps-checkbox__rectangle" + }, + text: { + root: "sps-input sps-text", + small: "sps-row__question--small", + content: "sps-question__content sps-text__content", + remainingCharacterCounter: "sps-remaining-character-counter", + onError: "sps-input--error" + }, + multipletext: { + root: "sps-multipletext", + item: "sps-multipletext__item", + itemTitle: "sps-multipletext__item-title", + content: "sps-multipletext__content sps-text__content", + row: "sps-multipletext__row", + cell: "sps-multipletext__cell" + }, + dropdown: { + root: "sps-selectbase", + popup: "sps-dropdown-popup svc-creator-popup", + small: "sps-row__question--small sd-row__question--small", + control: "sps-input sps-dropdown sd-input sd-dropdown", + controlEmpty: "sps-dropdown--empty sd-dropdown--empty", + controlValue: "sps-dropdown__value", + filterStringInput: "sd-dropdown__filter-string-input sps-dropdown__filter-string-input", + other: "sps-comment sps-question__other", + onError: "sps-input--error", + selectWrapper: "sv-dropdown_select-wrapper sps-dropdown_select-wrapper", + chevronButtonIconId: "icon-chevron", + cleanButton: "sps-dropdown__clean-button sps-input__edit-button", + controlReadOnly: "sd-input--disabled sd-input--readonly" + }, + buttongroup: { + root: "sd-button-group-scrollable-container sps-button-group", + item: "sps-button-group__item", + itemIcon: "sps-button-group__item-icon", + itemDecorator: "sps-button-group__item-decorator", + itemCaption: "sps-button-group__item-caption", + itemHover: "sps-button-group__item--hover", + itemSelected: "sps-button-group__item--selected", + itemDisabled: "sps-button-group__item--disabled", + itemControl: "sv-visuallyhidden", + readOnly: "sps-question--disabled", + + rootDropdown: "sd-button-group-scrollable-container sd-scrollable-container--compact sd-selectbase", + selectWrapper: "sv-dropdown_select-wrapper sps-dropdown_select-wrapper", + control: "sps-input sps-dropdown sd-input sd-dropdown", + controlEmpty: "sps-dropdown--empty sd-dropdown--empty", + controlValue: "sps-dropdown__value", + controlDisabled: "sps-input--disabled sd-input--disabled", + controlReadOnly: "sps-input--readonly sd-input--readonly", + controlPreview: "sps-input--preview sd-input--preview", + filterStringInput: "sd-dropdown__filter-string-input sps-dropdown__filter-string-input", + chevronButton: "sd-dropdown_chevron-button sps-dropdown_chevron-button", + chevronButtonSvg: "sd-dropdown_chevron-button-svg sps-dropdown_chevron-button-svg", + chevronButtonIconId: "icon-chevron", + popup: "sps-dropdown-popup svc-creator-popup", + }, + imagepicker: { + root: "sps-imagepicker", + item: "sps-imagepicker__item", + itemInline: "sps-imagepicker__item--inline", + itemChecked: "sps-imagepicker__item--checked", + itemReadOnly: "sps-imagepicker__item--disabled", + itemHover: "sps-imagepicker__item--allowhover", + label: "sps-imagepicker__label", + itemControl: "sps-imagepicker__control", + image: "sps-imagepicker__image", + itemText: "sps-imagepicker__text", + clearButton: "sps-btn", + other: "sps-comment sps-question__other" + }, + matrix: { + tableWrapper: "sps-matrix sps-table-wrapper", + root: "sps-table", + rowError: "sps-matrix__row--error", + cell: "sps-table__cell sps-matrix__cell", + headerCell: "sps-table__cell sps-table__cell--header", + label: "sps-item sps-radio sps-matrix__label", + itemValue: "sps-visuallyhidden sps-item__control sps-radio__control", + itemChecked: "sps-radio--checked", + itemReadOnly: "sps-item--disabled sps-radio--disabled", + itemHover: "sps-radio--allowhover", + materialDecorator: "sps-item__decorator sps-radio__decorator", + itemDecorator: "sps-item__svg sps-radio__svg", + cellText: "sps-matrix__text", + cellTextSelected: "sps-matrix__text--checked", + cellTextReadOnly: "sps-matrix__text--disabled", + }, + matrixdropdown: { + tableWrapper: "sps-table-wrapper", + root: "sps-table", + cell: "sps-table__cell", + headerCell: "sps-table__cell sps-table__cell--header", + emptyCell: "sps-table__cell--empty", + rowEnter: "sps-table__row--enter", + rowLeave: "sps-table__row--leave", + }, + matrixdynamic: { + tableWrapper: "sps-table-wrapper", + root: "sps-table sps-matrixdynamic", + content: "sps-matrixdynamic__content sps-text__content", + cell: "sps-table__cell", + row: "sps-table__row", + rowDisabled: "sps-table__row-disabled", + rowReadOnly: "sps-table__row-readonly", + headerCell: "sps-table__cell sps-table__cell--header", + button: "sps-btn", + detailRow: "sps-table__row sps-table__row--detail", + detailButton: "sps-table__cell--detail-button sps-action-button", + detailButtonExpanded: "sps-table__cell--detail-button--expanded", + detailIcon: "sps-detail-panel__icon sps-action-button__icon", + detailIconExpanded: "sps-detail-panel__icon--expanded", + detailPanelCell: "sps-table__cell sps-table__cell--detail-panel", + actionsCell: "sps-table__cell sps-table__cell--actions", + buttonAdd: "sps-matrixdynamic__add-btn sps-action-button sps-action-button--large", + buttonRemove: "sps-matrixdynamic__remove-btn", + iconAdd: "", + iconRemove: "", + dragElementDecorator: "sps-drag-element__svg", + iconDragElement: "#icon-drag-24x24", + iconDrag: "sps-matrixdynamic__drag-element", + footer: "", + dragDropGhostPositionTop: "sps-matrixdynamic__drag-drop-ghost-position-top", + dragDropGhostPositionBottom: "sps-matrixdynamic__drag-drop-ghost-position-bottom", + noRowsSection: "sps-matrixdynamic__placeholder", + noRowsText: "sps-matrixdynamic__placeholder-text", + cellQuestionWrapper: "sps-table__question-wrapper", + draggedRow: "sps-matrixdynamic__dragged-row", + emptyCell: "sps-table__cell--empty", + rowEnter: "sps-table__row--enter", + rowLeave: "sps-table__row--leave", + }, + rating: { + root: "sps-rating", + item: "sps-rating__item", + selected: "sps-rating__item--selected", + minText: "sps-rating__min-text", + itemText: "sps-rating__item-text", + maxText: "sps-rating__max-text", + readOnly: "sps-rating--disabled" + }, + comment: { + root: "sps-input sps-comment", + content: "sps-question__content sps-comment__content", + remainingCharacterCounter: "sps-remaining-character-counter", + small: "sps-row__question--small", + onError: "sps-input--error" + }, + expression: "", + file: { + root: "sps-file", + other: "sps-comment sps-question__other", + placeholderInput: "sps-visuallyhidden", + preview: "sps-file__preview", + fileSign: "sps-hidden", + fileSignBottom: "sps-file__sign", + fileDecorator: "sps-file__decorator", + fileInput: "sps-visuallyhidden", + noFileChosen: "sps-description sps-file__no-file-chosen", + chooseFile: "sps-btn sps-file__choose-btn", + readOnly: "sps-file__choose-btn--disabled", + removeButton: "sps-hidden", + removeButtonBottom: "sps-btn sps-file__clean-btn", + removeFile: "sps-hidden", + removeFileSvg: "sps-file__remove-svg", + wrapper: "sps-file__wrapper" + }, + signaturepad: { + root: "sps-signaturepad sjs_sp_container", + small: "sps-row__question--small", + controls: "sjs_sp_controls", + clearButton: "sjs_sp_clear" + }, + propertygrid_bindings: { + content: "sps-question__content sps-question__nopadding sps-question-group" + }, + propertygrid_restfull: { + content: "sps-question__content sps-question__nopadding sps-restfull" + }, + propertygrid_masksettings: { + content: "sps-question__content sps-question__nopadding sps-masksettings" + }, + propertygrid_header: { + mainRoot: "sps-header", + content: "sps-question__content sps-question__nopadding" + }, + coloralpha: { + content: "sps-question__content sps-question__nopadding sps-question__content-coloralpha" + }, + font: { + content: "sps-question__content sps-question__nopadding sps-question-composite__content" + }, + backgroundcornerradius: { + content: "sps-question__content sps-question__nopadding sps-question-composite__content" + }, + saveData: { + root: "", + saving: "", + error: "", + success: "", + saveAgainButton: "" + }, + window: { + root: "sv_window", + body: "sv_window_content", + header: { + root: "sv_window_title", + title: "", + button: "", + buttonExpanded: "", + buttonCollapsed: "" + } + }, + //list: JSON.parse(JSON.stringify(listComponentCss)), + actionBar: { + root: "sps-action-bar", + item: "sps-action-button", + itemPressed: "sps-action-button--pressed", + itemAsIcon: "sps-action-button--icon", + itemIcon: "sps-action-button__icon", + itemTitle: "sps-action-button__title", + }, + spinedit: { + root: "sps-input sps-spin-editor sps-input-container", + control: "sps-spin-editor__input sps-input-container__input", + buttonsContainer: "sps-input-container__buttons-container", + arrowButton: "sps-input__edit-button", + increaseButtonIcon: "icon-arrow-up", + decreaseButtonIcon: "icon-arrow-down" + }, + color: { + root: "sps-input sps-color-editor sps-input-container", + swatch: "sps-color-editor__color-swatch", + swatchDefault: "sps-color-editor__color-swatch--default", + swatchDisabled: "sps-color-editor__color-swatch--disabled", + colorInput: "sps-color-editor__color-input", + control: "sps-color-editor__input sps-input-container__input", + colorDropdown: "sps-input__edit-button", + colorDropdownIcon: "icon-drop-down-arrow", + swatchIcon: "icon-color-picker", + choicesButtonWrapper: "sps-color-editor__button-wrapper" + }, + textwithreset: { + root: "sps-input sps-input-container", + rootMultiline: "sps-input-container--multiline", + control: "sps-input-container__input", + controlMultiline: "sps-input-container__input sps-comment", + resetButton: "sps-input__edit-button", + resetButtonIcon: "icon-reset", + content: "sps-question__content sps-text__content", + remainingCharacterCounter: "sps-remaining-character-counter", + onError: "sps-input--error" + }, + fileedit: { + root: "sps-input sps-input-container sps-file-edit", + control: "sps-input-container__input", + buttonsContainer: "sps-input-container__buttons-container", + chooseButtonIcon: "icon-choosefile", + clearButtonIcon: "icon-cancel-24x24", + fileInput: "sd-visuallyhidden", + clearButton: "sps-input__edit-button", + chooseButton: "sps-input__edit-button sps-file-edit__choose-button", + chooseButtonDisabled: "sps-input__edit-button--disabled" + }, + linkvalue: { + content: "sps-link" + } +}; diff --git a/packages/survey-creator-core/webpack.presets.config.js b/packages/survey-creator-core/webpack.presets.config.js index 7e43232d03..87550a5e53 100644 --- a/packages/survey-creator-core/webpack.presets.config.js +++ b/packages/survey-creator-core/webpack.presets.config.js @@ -7,6 +7,7 @@ const RemoveEmptyScriptsPlugin = require("webpack-remove-empty-scripts"); module.exports = (env) => { const isProd = env.buildType === "prod"; const emitDeclarations = !!env.emitDeclarations; + const emitStyles = !!env.emitStyles; const compilerOptions = emitDeclarations ? {} : { declaration: false, declarationDir: null @@ -61,6 +62,25 @@ module.exports = (env) => { ], exclude: /node_modules/ }, + { + test: /\.s(c|a)ss$/, + use: [ + MiniCssExtractPlugin.loader, + { + loader: "css-loader", + options: { + sourceMap: env.buildType !== "prod", + }, + }, + { + loader: "sass-loader", + options: { + api: "modern", + sourceMap: env.buildType !== "prod", + }, + }, + ], + }, { test: /\.svg$/, use: ["svg-inline-loader"] @@ -71,6 +91,10 @@ module.exports = (env) => { new webpack.DefinePlugin({ "process.env.VERSION": JSON.stringify(require("./package.json").version), "process.env.NODE_ENV": JSON.stringify(isProd ? "production" : "development") + }), + new RemoveEmptyScriptsPlugin(), + new MiniCssExtractPlugin({ + filename: isProd ? "[name].min.css" : "[name].css" }) ] }; diff --git a/packages/survey-creator-react/index.html b/packages/survey-creator-react/index.html index d13df18b56..fa8c1d5117 100644 --- a/packages/survey-creator-react/index.html +++ b/packages/survey-creator-react/index.html @@ -23,6 +23,8 @@ + + From df6ab76d7aabea26d7fe04b8899c55224821deab Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 29 Jul 2025 18:27:49 +0300 Subject: [PATCH 031/240] #7004 - first preset styles --- .../src/presets/presets-editable-base.ts | 1 + .../src/presets/presets-editable-languages.ts | 56 ++-- .../src/presets/presets-editor.ts | 9 + .../presets-theme/blocks/sps-checkbox.scss | 6 + .../presets-theme/blocks/sps-dropdown.scss | 73 ++--- .../presets-theme/blocks/sps-question.scss | 260 ++---------------- .../src/presets/presets-theme/fonts.scss | 24 ++ .../src/presets/presets-theme/presets.scss | 135 +++------ .../src/presets/presets-theme/presets.ts | 2 +- 9 files changed, 169 insertions(+), 397 deletions(-) create mode 100644 packages/survey-creator-core/src/presets/presets-theme/fonts.scss diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index 7a83c85e1c..360ae70c51 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -58,6 +58,7 @@ export class CreatorPresetEditableBase { protected getTextVisibleIf(name: string, val: string): string { return "{" + name + "}='" + val + "'"; } protected getNotEmptyVisibleIf(name: string): string { return "{" + name + "} notempty"; } protected createMainPageCore(): any { return undefined; } + public getMainElementName() : any { return undefined; } public getJsonValue(model: SurveyModel, creator: SurveyCreatorModel, defaultJson?: any): any { const page = model.getPageByName(this.pageName); const core = page && page.isVisible ? this.getJsonValueCore(model, creator, defaultJson) : undefined; diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index c49e541264..9f96a71832 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -37,39 +37,37 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { public createMainPageCore(): any { return { title: "Select Languages", + description: "Select the language of the Survey Creator UI and target languages for the survey being configured.", navigationTitle: "Languages", elements: [ - { type: "panel", name: "languages_main_panel", - description: "Select the language of the Survey Creator UI and target languages for the survey being configured.", - elements: [ - { - type: "dropdown", - titleLocation: "left", - title: " UI language:", - placeholder: editorLocalization.getLocaleName(""), - name: this.creatorLocaleName, - choices: this.getCreatorLocales() - }, - { - type: "boolean", - name: this.surveyUseEnglishNames, - title: "Translate Survey language names to Engish", - titleLocation: "hidden", - renderAs: "checkbox" - }, - { - type: "checkbox", - name: this.surveyLocalesName, - title: "Survey languages", - minSelectedChoices: 1, - colCount: 3, - showSelectAllItem: true, - choices: this.getSurveyLocales() - } - ] - } + { + type: "dropdown", + title: "Creator UI language", + placeholder: editorLocalization.getLocaleName(""), + name: this.creatorLocaleName, + searchEnabled: false, + choices: this.getCreatorLocales() + }, + { + type: "checkbox", + name: this.surveyLocalesName, + title: "Survey languages", + minSelectedChoices: 1, + colCount: 3, + showSelectAllItem: true, + choices: this.getSurveyLocales() + }, + { + type: "boolean", + name: this.surveyUseEnglishNames, + title: "Translate Survey language names to Engish", + titleLocation: "hidden", + renderAs: "checkbox" + }, ] }; } + public getMainElementName() : any { return this.surveyLocalesName; } + protected getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { const creatorLocale = model.getValue(this.creatorLocaleName); const useEnglishNames = model.getValue(this.surveyUseEnglishNames) === true; diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 73b8bc7aec..c336278d8d 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -90,6 +90,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit model.keepIncorrectValues = true; model.showPrevButton = false; model.showCompleteButton = false; + model.fitToContainer = false; model.registerFunctionOnPropertyValueChanged("isShowNextButton", () => { model.setPropertyValue("isShowNextButton", true); }); @@ -151,6 +152,14 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit model.onMatrixRowAdded.add((sender, options) => { editablePresets.forEach(item => item.onMatrixRowAdded(model, this.creator, options)); }); + model.onUpdateQuestionCssClasses.add(function(_, options) { + editablePresets.forEach(item => { + if (options.question.name === item.getMainElementName()) { + options.cssClasses.content += " sps-question__content--main"; + } + }); + }); + return model; } protected createResultModel(): SurveyModel { diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-checkbox.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-checkbox.scss index b7a293b017..d7146c79d2 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-checkbox.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-checkbox.scss @@ -113,6 +113,12 @@ border: none; padding: 0; margin: 0; + align-self: stretch; + display: flex; +} + +.sps-selectbase__column { + flex-grow: 1; } .sps-selectbase__label { diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss index 03faa0e5e5..2735b2f81d 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss @@ -1,39 +1,41 @@ @use "../../../variables" as *; .sps-dropdown { - display: flex; - padding-top: calc(var(--ctr-editor-padding-top, var(--sjs-spacing-x05))); - padding-right: calc(var(--ctr-editor-padding-right, var(--sjs-spacing-x05))); - padding-bottom: calc(var(--ctr-editor-padding-bottom, var(--sjs-spacing-x05))); - padding-left: calc( - var(--ctr-editor-padding-left, var(--sjs-spacing-x05)) + - var(--ctr-editor-content-margin-left, var(--sjs-spacing-x150)) - ); + display: flex; + padding: var(--sjs2-layout-control-formbox-medium-vertical, 4px) var(--sjs2-layout-control-formbox-medium-horizontal, 4px); + align-items: flex-start; + gap: var(--sjs2-layout-control-formbox-medium-gap, 4px); + align-self: stretch; + + border-radius: var(--sjs2-radius-semantic-form, 8px); + background: var(--sjs2-color-control-formbox-default-bg, rgba(28, 27, 32, 0.05)); + + /* sjs2/shadow/inner */ + box-shadow: var(--sjs2-shadow-size-inner-offset-x, 0) var(--sjs2-shadow-size-inner-offset-y, 0) var(--sjs2-shadow-size-inner-blur, 0) var(--sjs2-shadow-size-inner-spread, 1px) var(--sjs2-shadow-color-inner, #D4D4D4) inset; + + .sps-dropdown__filter-string-input { + display: flex; + padding: var(--sjs2-layout-control-input-medium-content-vertical, 8px) var(--sjs2-layout-control-input-medium-content-horizontal, 12px); + align-items: flex-start; + flex: 1 0 0; + } } .sps-dropdown__value { - @include ctrDefaultFont; display: flex; - align-items: center; - width: 100%; - position: relative; - - margin-top: var(--ctr-editor-content-margin-top, var(--sjs-spacing-x1)); - margin-right: var(--ctr-editor-content-margin-right, var(--sjs-spacing-x150)); - margin-bottom: var(--ctr-editor-content-margin-bottom, var(--sjs-spacing-x1)); - margin-left: 0; -} -.sps-dropdown__filter-string-input { - @include ctrDefaultFont; - - color: var(--ctr-editor-content-text-color, var(--sjs-layer-3-foreground-100, #000000e6)); + padding: var(--sjs2-layout-control-input-medium-content-vertical, 8px) var(--sjs2-layout-control-input-medium-content-horizontal, 12px); + align-items: flex-start; + flex: 1 0 0; } .sps-dropdown-popup.sv-popup--menu-popup { height: 0; } +.sps-dropdown_select-wrapper { + flex-grow: 1; +} .sps-dropdown__clean-button { --thm-ctr-editor-content-margin-top: var(--ctr-editor-content-margin-top, var(--sjs-spacing-x1)); --thm-ctr-editor-content-margin-bottom: var(--ctr-editor-content-margin-bottom, var(--sjs-spacing-x1)); @@ -46,16 +48,21 @@ .sps-dropdown { .sd-dropdown-action-bar { - margin-inline-start: var(--ctr-editor-gap, var(--sjs-spacing-x05)); - gap: var(--ctr-editor-buttons-gap, var(--sjs-spacing-x05)); + display: flex; + align-items: flex-start; + gap: var(--sjs2-layout-control-input-medium-group-gap, 4px); + align-self: stretch; } .sd-editor-button-item { - padding-top: var(--ctr-editor-button-padding-top, var(--sjs-spacing-x1)); - padding-right: var(--ctr-editor-button-padding-right, var(--sjs-spacing-x1)); - padding-bottom: var(--ctr-editor-button-padding-bottom, var(--sjs-spacing-x1)); - padding-left: var(--ctr-editor-button-padding-left, var(--sjs-spacing-x1)); - transform: none; + display: flex; + padding: var(--sjs2-layout-control-action-small-box-vertical, 8px) var(--sjs2-layout-control-action-small-box-horizontal, 8px); + justify-content: center; + align-items: center; + gap: var(--sjs2-layout-control-action-small-box-gap, 0); + + border-radius: var(--sjs2-radius-semantic-form-item, 4px); + background: var(--sjs2-color-bg-neutral-tertiary, rgba(28, 27, 32, 0.00)); &:hover, &:focus { @@ -78,8 +85,12 @@ } .sv-editor-button-item__icon { - width: var(--ctr-editor-button-icon-width, var(--sjs-font-size-x3)); - height: var(--ctr-editor-button-icon-height, var(--sjs-font-size-x3)); + display: flex; + width: var(--sjs2-size-icon-medium, 24px); + height: var(--sjs2-size-icon-medium, 24px); + padding: var(--sjs2-layout-control-action-small-icon-vertical, 0) var(--sjs2-layout-control-action-small-icon-horizontal, 0); + justify-content: center; + align-items: center; } } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss index d55c1483aa..8eec6f205c 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss @@ -1,262 +1,34 @@ @use "../../../variables.scss" as *; +@use "../fonts" as *; .sps-question { - display: flex; - flex-direction: column; - align-items: flex-start; - padding: 0px; - border-radius: var(--ctr-editor-corner-radius, var(--sjs-corner-radius-x075)); -} - -.sps-question.sps-question--disabled { - background-color: var(--ctr-editor-background-color-disabled, var(--sjs-layer-1-background-500, #ffffffff)); + border-radius: var(--sjs2-radius-x250, 20px); + border: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #D4D4D4); + background: var(--sjs2-color-bg-basic-primary, #FFF); } .sps-question__header { width: 100%; -} - -.sps-question--disabled .sps-question__header { - opacity: var(--ctr-editor-label-opacity-disabled, 0.25); + display: flex; + padding: var(--sjs2-spacing-x250, 20px) var(--sjs2-spacing-x250, 20px) 0 var(--sjs2-spacing-x250, 20px); + align-items: flex-start; + align-self: stretch; } .sps-question__title { - @include ctrDefaultFont; - width: 100%; - margin: 0; - padding: var(--ctr-label-padding-top, var(--sjs-spacing-x1)) var(--ctr-label-padding-right, 0px) - var(--ctr-label-padding-bottom, var(--sjs-spacing-x1)) var(--ctr-label-padding-left, 0px); - color: var(--ctr-label-text-color, var(--sjs-layer-1-foreground-50, #00000080)); - box-sizing: border-box; -} -.sps-question__title.sd-element__title--disabled { - color: var(--ctr-caption-with-actions-text-color-disabled, var(--sjs-layer-1-foreground-100, #000000e6)); -} - -.sps-question__content { - width: 100%; - cursor: pointer; -} - -.sps-question--disabled .sps-question__content { - cursor: default; -} + color: var(--sjs2-color-fg-basic-primary, #1C1B20); -.sps-text__content, -.sps-comment__content { - position: relative; + @include sjs2--typography--default-strong; } -.sps-question__content:focus-within .sps-remaining-character-counter { +.sps-question__content { display: flex; -} - -.sps-remaining-character-counter { - @include ctrSmallFont; - display: none; - flex-direction: row; - justify-content: flex-end; - align-items: flex-end; - padding: 0px; - color: var(--ctr-editor-label-color, var(--sjs-layer-3-foreground-50, #00000080)); - position: absolute; - inset-inline-end: calcSize(0.75); - inset-block-end: calcSize(0.5); + padding: var(--sjs2-spacing-x150, 12px) var(--sjs2-spacing-x250, 20px) var(--sjs2-spacing-x250, 20px) var(--sjs2-spacing-x250, 20px); + flex-direction: column; + align-items: flex-start; + align-self: stretch; } .sps-question__description { - @include ctrSmallFont; - color: var(--ctr-caption-with-actions-description-text-color, var(--sjs-layer-1-foreground-50, #00000080)); - padding-bottom: calcSize(2); white-space: normal; -} - -.sps-question--disabled .sps-question__description { - color: var(--ctr-caption-with-actions-description-text-color, var(--sjs-layer-1-foreground-50, #00000080)); -} - -.sps-row-narrow__question { - --thm-ctr-property-grid-form-gap: var(--ctr-property-grid-form-gap, var(--sjs-spacing-x2)); - margin-top: calc(-1 * var(--thm-ctr-property-grid-form-gap)); -} - -.sps-row--multiple { - & > div > .sps-row-narrow__question { - --thm-ctr-editor-layout-gap: var(--ctr-editor-layout-gap, var(--sjs-spacing-x1)); - margin-top: calc(-1 * var(--thm-ctr-editor-layout-gap)); - } -} - -.sps-question--location--left { - flex-direction: row; - background: var(--ctr-editor-background-color, var(--sjs-layer-3-background-500, #f4f4f4ff)); - box-shadow: inset 0 0 0 var(--ctr-editor-border-width, var(--sjs-stroke-x1)) - var(--ctr-editor-border-color, var(--sjs-border-10, #dcdcdcff)); - line-height: calcSize(6); - vertical-align: middle; - align-items: stretch; - border-radius: var(--ctr-editor-corner-radius, var(--sjs-corner-radius-x075)); - - &:focus-within { - box-shadow: inset 0 0 0 var(--ctr-editor-border-width-focused, var(--sjs-stroke-x2)) - var(--ctr-editor-border-color-focused, var(--sjs-primary-background-500, #19b394ff)); - } -} - -.sps-question--disabled.sps-question--location--left .sps-question__title { - color: var(--ctr-editor-content-text-color-disabled, var(--sjs-layer-1-foreground-100, #000000e6)); -} - -.sps-question__header--location--left { - width: max-content; - box-sizing: border-box; - max-width: 50%; - flex: 0 0; - display: flex; - align-items: center; - padding-inline-start: var(--ctr-editor-padding-left, var(--sjs-spacing-x05)); - - .sps-question__title { - padding: var(--ctr-editor-label-padding-top, var(--sjs-spacing-x1)) - var(--ctr-editor-label-padding-right, var(--sjs-spacing-x2)) - var(--ctr-editor-label-padding-bottom, var(--sjs-spacing-x1)) - var(--ctr-editor-label-padding-left, var(--sjs-spacing-x150)); - border-inline-end: var(--ctr-editor-label-separator-width, var(--sjs-stroke-x1)) solid - var(--ctr-editor-label-separator-color, var(--sjs-border-10, #dcdcdcff)); - display: inline-block; - color: var(--ctr-editor-label-color, var(--sjs-layer-3-foreground-50, #00000080)); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - .sv-string-viewer { - white-space: nowrap; - } - } -} - -.sps-question__content--left { - flex: 2; - - .sps-input.sps-input.sps-input { - background-color: transparent; - box-shadow: none; - border: none; - - &:focus, - &:focus-within { - box-shadow: none; - } - } -} - -.sps-row--multiple { - display: flex; - gap: var(--ctr-editor-layout-gap, var(--sjs-spacing-x1)); - flex-wrap: wrap; - - & > div { - flex-grow: 1; - min-width: calcSize(25.5); - - input { - min-width: calc(max(17 * #{$base-unit}, 100%)); - width: 0; - } - } -} - -.sps-question__erbox { - @include ctrDefaultFont; - width: 100%; - box-sizing: border-box; - padding: var(--ctr-error-message-padding-top, var(--sjs-spacing-x1)) - var(--ctr-error-message-padding-right, var(--sjs-spacing-x150)) - var(--ctr-error-message-padding-bottom, var(--sjs-spacing-x1)) - var(--ctr-error-message-padding-left, var(--sjs-spacing-x150)); - - color: var(--ctr-error-message-text-color, var(--sjs-layer-1-foreground-100, #000000e6)); - background-color: var(--ctr-error-message-background-color, var(--sjs-semantic-red-background-10, #e50a3e1a)); - border-radius: var(--ctr-error-message-corner-radius, var(--sjs-corner-radius-x05)); -} - -.sps-question__erbox, -.sps-question__erbox > svc-question-error, -sv-question-error { - & > div { - display: flex; - gap: var(--ctr-error-message-gap, var(--sjs-spacing-x1)); - } -} - -.sps-question__erbox-icon { - width: var(--ctr-error-message-icon-width, var(--sjs-font-size-x3)); - height: var(--ctr-error-message-icon-height, var(--sjs-font-size-x3)); - - .sv-svg-icon { - vertical-align: top; - width: var(--ctr-error-message-icon-width, var(--sjs-font-size-x3)); - height: var(--ctr-error-message-icon-height, var(--sjs-font-size-x3)); - } - - use { - fill: var(--ctr-error-message-icon-color, var(--sjs-semantic-red-background-500, #e50a3eff)); - } -} - -.sps-question__erbox--below-question { - margin-top: calcSize(1); -} - -.sps-restfull, -.sps-masksettings { - .sps-panel__content { - gap: calcSize(2); - - .sps-row { - margin-top: 0; - } - } -} - -.sps-question--highlighted { - .sps-input, - .sps-input-container, - .sps-question--location--left, - .sps-table__cell:not(.sps-table__cell--detail-panel) .sps-input { - box-shadow: inset 0 0 0 var(--ctr-editor-border-width-highlighed, var(--sjs-stroke-x2)) - var(--ctr-editor-border-color-highlighted, var(--sjs-layer-1-foreground-75, #000000bf)); - } - - .sps-checkbox__control:focus + .sps-checkbox__rectangle, - .sps-matrixdynamic__content.sps-text__content { - outline: var(--ctr-editor-border-width-highlighed, var(--sjs-stroke-x2)) solid - var(--ctr-editor-border-color-highlighted, var(--sjs-layer-1-foreground-75, #000000bf)); - outline-offset: calc(-1 * var(--ctr-editor-border-width-highlighed, var(--sjs-stroke-x2))); - border-radius: var(--ctr-data-table-corner-radius, var(--sjs-corner-radius-x075)); - - .sps-input { - box-shadow: none; - } - } - - .svc-action-button { - border: var(--ctr-actionbar-button-border-width-highlighed, var(--sjs-stroke-x2)) solid - var(--ctr-actionbar-button-border-color-highlighted, var(--sjs-layer-1-foreground-75, #000000bf)); - } - - .sv-button-group { - box-shadow: 0 0 0 1px var(--ctr-editor-border-color-highlighted, var(--sjs-layer-1-foreground-75, #000000bf)); - border-color: var(--ctr-editor-border-color-highlighted, var(--sjs-layer-1-foreground-75, #000000bf)); - } - - .sps-checkbox__control + .sps-checkbox__rectangle { - outline: var(--ctr-editor-border-width-highlighed, var(--sjs-stroke-x2)) solid - var(--ctr-editor-border-color-highlighted, var(--sjs-layer-1-foreground-75, #000000bf)); - outline-offset: calc(-1 * var(--ctr-editor-border-width-highlighed, var(--sjs-stroke-x2))); - } - - .sps-button-group::after { - box-shadow: inset 0 0 0 var(--ctr-button-group-border-width-focused, var(--sjs-stroke-x2)) - var(--ctr-editor-border-color-highlighted, var(--sjs-layer-1-foreground-75, #000000bf)); - } -} +} \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/presets-theme/fonts.scss b/packages/survey-creator-core/src/presets/presets-theme/fonts.scss new file mode 100644 index 0000000000..be0f9e9ef2 --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/fonts.scss @@ -0,0 +1,24 @@ +@mixin sjs2--typography--medium-strong { + /* sjs2/typography/medium-strong */ + font-family: var(--sjs2-font-family-semantic-default, "Open Sans"); + font-size: var(--sjs2-font-size-semantic-medium, 24px); + font-style: normal; + font-weight: 600; + line-height: var(--sjs2-line-height-semantic-medium, 32px); /* 133.333% */ +} +@mixin sjs2--typography--default { + /* sjs2/typography/default */ + font-family: var(--sjs2-font-family-semantic-default, "Open Sans"); + font-size: var(--sjs2-font-size-semantic-default, 16px); + font-style: normal; + font-weight: 400; + line-height: var(--sjs2-line-height-semantic-default, 24px); /* 150% */ +} +@mixin sjs2--typography--default-strong { + /* sjs2/typography/default-strong */ + font-family: var(--sjs2-font-family-semantic-default, "Open Sans"); + font-size: var(--sjs2-font-size-semantic-default, 16px); + font-style: normal; + font-weight: 600; + line-height: var(--sjs2-line-height-semantic-default, 24px); /* 150% */ +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index e16ff82136..6588fb794d 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -1,4 +1,5 @@ @use "../../variables" as *; +@use "./fonts" as *; @use "blocks/sps-action-bar.scss"; @use "blocks/sps-question.scss"; @use "blocks/sps-input.scss"; @@ -20,14 +21,33 @@ .sps-root-modern { position: relative; width: 100%; - border-inline-end: 1px solid transparent; - background: var(--ctr-property-grid-background-color, var(--sjs-layer-1-background-500, #ffffffff)); box-sizing: border-box; height: 0; flex-grow: 1; /* disable library transition animations */ --sjs-transition-duration: 0ms; + background: white; @include disableLibraryAnimations; + display: flex; + flex-direction: column; + + :has(.sps-question__content--main) { + max-height: 100%; + height: 0; + flex-grow: 1; + display: flex; + flex-direction: column; + align-self: stretch; + align-items: stretch; + height: 0; + flex-grow: 1; + .sv-components-row > .sv-components-column--expandable { + width: 100%; + } + } +} +.sps-question__content--main { + overflow: auto; } .sps-container { @@ -37,61 +57,29 @@ flex-direction: column; } -.sps-root-modern.sps-root--one-category { - border-inline-end: unset; - background-color: var(--ctr-property-grid-form-background-color, var(--sjs-layer-1-background-500, #ffffffff)); - - .sps-page.sps-body__page { - box-shadow: unset; - } +.sps-page { + display: flex; + padding: var(--sjs2-spacing-x400, 32px); + flex-direction: column; + align-items: stretch; + flex: 1 0 0; + align-self: stretch; + gap: var(--sjs2-spacing-x150, 12px); + background: var(--sjs2-color-utility-plain, rgba(28, 27, 32, 0.05)); } -.sv-popup--modal-popup { - &.svc-property-editor .sv-popup__container { - .sv-popup_shadow { - background-color: transparent; - } - - .sd-root-modern { - background-color: transparent; - } - - .sd-page { - margin: 0; - padding: 0; - } +.sps-page__title { + color: var(--sjs2-color-fg-basic-primary, #1C1B20); - .sv-components-column--expandable { - min-width: calcSize(78); - } - } - - .sv-popup__footer { - padding-bottom: 2px; - } - - .sd-body, - .sl-body { - min-width: calcSize(78); - padding: 0; - } + @include sjs2--typography--medium-strong; } -.sv-popup.svc-property-editor .sd-root-modern { - --sd-mobile-width: 0; -} +.sps-page__description { + color: var(--sjs2-color-fg-basic-primary, #1C1B20); -.svc-object-selector .sv-popup__container { - margin-left: calcSize(1); - margin-right: calcSize(1); -} + @include sjs2--typography--default; -.svc-object-selector__content { - position: relative; - height: 100%; - min-height: 0; - display: flex; - flex-direction: column; + padding-bottom: var(--sjs2-spacing-x150, 12px); } .sps-action-title-bar { @@ -101,47 +89,10 @@ .sps-body { width: 100%; -} - -.sps-body--empty { - margin: calcSize(3); -} - -.sps-title-toolbar--single-help-action { - justify-content: flex-start; - padding-left: calcSize(0.5); - - // flex-grow: 0; - // margin-left: 0; - // padding-left: 0; - - .sps-help-action { - margin-inline-end: auto; - .sps-action-button--icon { - padding: var(--ctr-actionbar-button-padding-top-small-icon, var(--sjs-spacing-x05)) - var(--ctr-actionbar-button-padding-right-small-icon, var(--sjs-spacing-x05)) - var(--ctr-actionbar-button-padding-bottom-small-icon, var(--sjs-spacing-x05)) - var(--ctr-actionbar-button-padding-left-small-icon, var(--sjs-spacing-x05)); - opacity: var(--ctr-actionbar-button-opacity-muted, 0.35); - } - - .sps-action-button--icon:focus, - .sps-action-button--icon:hover { - opacity: 1; - } - - .sps-action-button:active { - opacity: var(--ctr-actionbar-button-opacity-pressed, 0.5); - } - - .sps-action-button__icon { - width: var(--ctr-actionbar-button-icon-width-small, var(--sjs-font-size-x2)); - height: var(--ctr-actionbar-button-icon-height-small, var(--sjs-font-size-x2)); - } - - svg { - fill: var(--ctr-actionbar-button-icon-color, var(--sjs-layer-1-foreground-75, #000000bf)); - } + .sv-components-container-contentBottom { + position: absolute; + bottom: 0; + right: 0; } -} +} \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.ts b/packages/survey-creator-core/src/presets/presets-theme/presets.ts index 2c08aef57e..77dc67c9ab 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.ts +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.ts @@ -198,7 +198,7 @@ export var presetsCss = { root: "sps-selectbase", popup: "sps-dropdown-popup svc-creator-popup", small: "sps-row__question--small sd-row__question--small", - control: "sps-input sps-dropdown sd-input sd-dropdown", + control: "sps-input sps-dropdown", controlEmpty: "sps-dropdown--empty sd-dropdown--empty", controlValue: "sps-dropdown__value", filterStringInput: "sd-dropdown__filter-string-input sps-dropdown__filter-string-input", From 884fb16f349fc050ae9839f33f536bfd3bcffdd3 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 29 Jul 2025 18:40:57 +0300 Subject: [PATCH 032/240] #7004 - fix preset reinit --- packages/survey-creator-core/src/presets/presets-editor.ts | 1 + packages/survey-creator-core/src/presets/presets-plugin.ts | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index c336278d8d..4279eb6b9e 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -45,6 +45,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit this.locTitle.text = "Creator Presets"; this.navigationBarValue = new NavigationBar(); const firstTabName = "preset"; + this.preset.setJson(this.getJsonFromSurveyModel()); } public dispose(): void { super.dispose(); diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index b06df5b06b..735982eaef 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -9,6 +9,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { private currentValue; private designerPlugin; private toolboxCompact; + private defaultJson; constructor(private creator: SurveyCreatorModel) { creator.addTab({ name: "presets", title: "Presets", plugin: this, iconName: TabPresetsPlugin.iconName }); @@ -19,7 +20,8 @@ export class TabPresetsPlugin implements ICreatorPlugin { public saveToFileHandler = saveToFileHandler; public activate(): void { - this.model = new CreatorPresetEditorModel({}, this.creator); + this.model = new CreatorPresetEditorModel({}, this.creator, this.defaultJson); + this.defaultJson = { ...this.model.defaultJson }; if (this.currentValue) { this.model.model.data = this.currentValue; } From c6aa65e1c30b885caaa2cef1e5b661b6db9a66b9 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 30 Jul 2025 17:05:43 +0300 Subject: [PATCH 033/240] #7004 add search to survey languages --- .../src/presets/presets-editable-languages.ts | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index 9f96a71832..7186eb11bd 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -1,7 +1,17 @@ import { Base, Serializer, ItemValue, QuestionCheckboxBase, QuestionCheckboxModel, surveyLocalization, SurveyModel } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; import { editorLocalization, SurveyCreatorModel } from "survey-creator-core"; - +function searchItem(params) { + const questionInstance = this.survey.getQuestionByName(params[0]); + let itemvalue = params[1]; + let text = params[2]; + if (!text) return true; + const item = questionInstance.choices.filter(c => c.value == itemvalue)[0]; + if (!item) return true; + return item.text.toUpperCase().indexOf(text.toUpperCase()) != -1; +} +import { FunctionFactory } from "survey-core"; +FunctionFactory.Instance.register("searchItem", searchItem); class LocalizationPreview extends SurveyModel { public getType(): string { return "localizationpreview"; @@ -49,13 +59,24 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { choices: this.getCreatorLocales() }, { - type: "checkbox", - name: this.surveyLocalesName, + type: "panel", title: "Survey languages", - minSelectedChoices: 1, - colCount: 3, - showSelectAllItem: true, - choices: this.getSurveyLocales() + elements: [ + { + type: "text", + name: this.searchLocalesName, + titleLocation: "hidden", + textUpdateMode: "onTyping" + }, { + type: "checkbox", + name: this.surveyLocalesName, + titleLocation: "hidden", + minSelectedChoices: 1, + colCount: 3, + showSelectAllItem: true, + choices: this.getSurveyLocales(), + choicesVisibleIf: "searchItem('" + this.surveyLocalesName + "', {item}, {" + this.searchLocalesName + "}" + }] }, { type: "boolean", @@ -111,6 +132,7 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { } private get creatorLocaleName() : string { return this.path + "_creator"; } private get surveyLocalesName(): string { return this.path + "_surveyLocales"; } + private get searchLocalesName(): string { return this.path + "_searchLocales"; } private get surveyUseEnglishNames(): string { return this.path + "_surveyUseEnglishNames"; } public get questionNames() { return [this.surveyLocalesName, this.surveyUseEnglishNames]; From a8112337d5a794af09d49713599f689bdc030205 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 30 Jul 2025 18:38:33 +0300 Subject: [PATCH 034/240] #7004 - search in checkboxes --- .../src/presets/presets-editable-languages.ts | 1 + .../presets-theme/blocks/sps-panel.scss | 177 ++---------------- .../presets-theme/blocks/sps-question.scss | 6 +- .../src/presets/presets-theme/presets.ts | 5 +- 4 files changed, 28 insertions(+), 161 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index 7186eb11bd..f74b700f85 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -65,6 +65,7 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { { type: "text", name: this.searchLocalesName, + placeholder: "Type to search...", titleLocation: "hidden", textUpdateMode: "onTyping" }, { diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss index 66294f6004..155b97ef19 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss @@ -1,175 +1,36 @@ @use "../../../variables.scss" as *; @use "./variables.scss" as *; +@use "../fonts" as *; .sps-panel { -} -.sps-panel__title { - @include ctrDefaultFont; - - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - box-sizing: border-box; - width: 100%; - padding: calcSize(2); - border: none; - outline: none; - color: var(--ctr-property-grid-chapter-caption-text-color, var(--sjs-layer-1-foreground-75, #000000bf)); - cursor: pointer; - background-color: var( - --ctr-property-grid-chapter-caption-background-color, - var(--sjs-layer-1-background-500, #ffffffff) - ); - box-shadow: inset 0px -1px 0px var(--ctr-property-grid-chapter-caption-border-color, var(--sjs-border-25, #d4d4d4ff)); - margin: 0; - transition: - color $creator-transition-duration, - background-color $creator-transition-duration, - opacity $creator-transition-duration; -} - -.sps-panel__title:disabled, -.sps-panel__title:disabled:hover { - color: var(--ctr-property-grid-chapter-caption-text-color-disabled, var(--sjs-layer-1-foreground-100, #000000e6)); - opacity: 0.25; - cursor: default; -} - -.sps-panel__title--collapsed:hover { - background-color: var( - --ctr-property-grid-chapter-caption-background-color-hovered, - var(--sjs-layer-1-background-400, #f5f5f5ff) - ); -} - -.sps-panel__title--expandable:focus { - background-color: var( - --ctr-property-grid-chapter-caption-background-color-focused, - var(--sjs-layer-1-background-400, #f5f5f5ff) - ); -} + border-radius: var(--sjs2-radius-x250, 20px); + border: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #D4D4D4); + background: var(--sjs2-color-bg-basic-primary, #FFF); + overflow: hidden; -.sps-panel__title--expanded { - @include ctrDefaultBoldFont; - color: var(--ctr-property-grid-chapter-caption-text-color-selected, var(--sjs-layer-1-foreground-100, #000000e6)); + .sps-row { + border-bottom: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #D4D4D4); + &:last-child { + border-bottom: none; + } + } } -.sps-panel__content { +.sps-panel__header { + width: 100%; display: flex; - flex-direction: column; + padding: var(--sjs2-spacing-x250, 20px) var(--sjs2-spacing-x250, 20px) 0 var(--sjs2-spacing-x250, 20px); align-items: flex-start; - width: 100%; - padding-top: calc( - var(--ctr-property-grid-form-padding-top, var(--sjs-spacing-x2)) - - var(--ctr-property-grid-form-gap, var(--sjs-spacing-x2)) - ); - padding-inline-end: var(--ctr-property-grid-form-padding-right, var(--sjs-spacing-x4)); - padding-bottom: var(--ctr-property-grid-form-padding-bottom, var(--sjs-spacing-x5)); - padding-inline-start: var(--ctr-property-grid-form-padding-left, var(--sjs-spacing-x4)); - box-sizing: border-box; - background: var(--ctr-property-grid-form-background-color, var(--sjs-layer-1-background-500, #ffffffff)); - box-shadow: inset 0px -1px 0px var(--ctr-property-grid-chapter-caption-border-color, var(--sjs-border-25, #d4d4d4ff)); + align-self: stretch; } -.sps-panel__content { - .sps-row { - width: 100%; - margin-top: var(--ctr-property-grid-form-gap, var(--sjs-spacing-x2)); - } - - .sps-row--multiple { - margin-top: var(--ctr-editor-layout-gap, var(--sjs-spacing-x1)); - } -} -.svc-side-bar--mobile { - .sps-panel__content { - padding-inline-end: var(--ctr-property-grid-form-padding-right, var(--sjs-spacing-x4)); - padding-inline-start: var(--ctr-property-grid-form-padding-left, var(--sjs-spacing-x4)); - } -} - -.sps-question__nopadding { - .sps-panel__content { - padding: 0px; - box-shadow: unset; - } -} -.sps-row--enter.sps-row.sps-row.sps-row { - margin-top: 0; -} -.sps-row--enter { - animation-fill-mode: forwards; - animation-name: fadeIn, moveInWithOverflow; - min-height: 0 !important; - opacity: 0; - height: 0; - animation-timing-function: $ease-out; - animation-delay: $sps-row-fade-in-delay, 0s, 0s; - animation-duration: $sps-row-fade-in-duration, $sps-row-move-in-duration, $sps-row-move-in-duration; -} -.sps-row--delayed-enter { - animation-delay: calc(#{$sps-row-fade-in-delay} + #{$sps-row-fade-in-animation-delay}), - $sps-row-fade-in-animation-delay, $sps-row-fade-in-animation-delay; -} +.sps-panel__title { + color: var(--sjs2-color-fg-basic-primary, #1C1B20); -.sps-row--leave { - animation-name: fadeIn, moveInWithOverflow; - animation-timing-function: $reverse-ease-out; - animation-fill-mode: forwards; - animation-direction: reverse; - min-height: 0 !important; - animation-delay: 0s, $sps-row-move-out-delay, $sps-row-move-out-delay; - animation-duration: $sps-row-fade-out-duration, $sps-row-move-out-duration, $sps-row-move-out-duration; + @include sjs2--typography--default-strong; } -.sps-panel__content--enter { - animation-name: fadeIn, moveInWithOverflow; - min-height: 0 !important; - opacity: 0; - animation-fill-mode: forwards; - animation-timing-function: $ease-out; - animation-duration: $sps-expand-fade-in-duration, $sps-expand-move-in-duration, $sps-expand-move-in-duration; - animation-delay: $sps-expand-fade-in-delay, 0s, 0s; -} -.sps-panel__content--leave { - animation-name: fadeIn, moveInWithOverflow; - min-height: 0 !important; - animation-direction: reverse; - animation-fill-mode: forwards; - animation-timing-function: $reverse-ease-out; - animation-duration: $sps-collapse-fade-out-duration, $sps-collapse-move-out-duration, $sps-collapse-move-out-duration; - animation-delay: 0s, $sps-collapse-move-out-delay, $sps-collapse-move-out-delay; -} +.sps-panel__content { -.svc-creator--disable-animations { - .sps-row--enter, - .sps-row--leave, - .sps-panel__content--enter, - .sps-panel__content--leave { - animation: none; - } -} -.sps-panel.sps-panel--group { - & > .sps-panel__content { - padding: 0; - box-shadow: none; - } - .sps-panel__title { - @include ctrDefaultFont; - color: var(--ctr-label-text-color, var(--sjs-layer-1-foreground-50, #00000080)); - box-shadow: none; - background-color: transparent; - padding-top: var(--ctr-label-padding-top, var(--sjs-spacing-x1)); - padding-inline-end: var(--ctr-label-padding-right, 0px); - padding-bottom: var(--ctr-label-padding-bottom, var(--sjs-spacing-x1)); - padding-inline-start: var(--ctr-label-padding-left, 0px); - color: var(--ctr-label-text-color, var(--sjs-layer-1-foreground-50, #00000080)); - } - .sps-row { - margin-top: var(--ctr-editor-layout-gap, var(--sjs-spacing-x1)); - } - .sps-row:first-of-type { - margin-top: 0; - } } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss index 8eec6f205c..2947b2f3bc 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss @@ -2,9 +2,13 @@ @use "../fonts" as *; .sps-question { + background: var(--sjs2-color-bg-basic-primary, #FFF); +} + +.sps-question--with-frame { border-radius: var(--sjs2-radius-x250, 20px); border: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #D4D4D4); - background: var(--sjs2-color-bg-basic-primary, #FFF); + overflow: hidden; } .sps-question__header { diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.ts b/packages/survey-creator-core/src/presets/presets-theme/presets.ts index 77dc67c9ab..bcd8bfb1b9 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.ts +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.ts @@ -26,6 +26,7 @@ export var presetsCss = { withFrame: "", nested: "", expandableAnimating: "", + header: "sps-panel__header", title: "sps-title sps-panel__title", titleBar: "sd-action-title-bar sps-action-title-bar", contentEnter: "sps-panel__content--enter", @@ -85,8 +86,8 @@ export var presetsCss = { rowDelayedEnter: "sps-row--delayed-fade-in", rowMultiple: "sps-row--multiple", question: { - withFrame: "", - nested: "", + withFrame: "sps-question--with-frame", + nested: "sps-question--nested", mainRoot: "sps-question sps-row__question", flowRoot: "sps-question sps-row__question sps-row__question--flow", asCell: "sps-table__cell", From 95da3c6a714a7509c25240bc9b7616653c9dca07 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 30 Jul 2025 19:27:29 +0300 Subject: [PATCH 035/240] #7004 - navigation --- .../src/presets/presets-editable-base.ts | 1 + .../src/presets/presets-editable-languages.ts | 1 + .../src/presets/presets-editor.ts | 19 ++++++------- .../presets-theme/blocks/sps-action-bar.scss | 27 +++++++++++++++++++ .../src/presets/presets-theme/fonts.scss | 8 ++++++ .../src/presets/presets-theme/presets.ts | 1 + 6 files changed, 46 insertions(+), 11 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index 360ae70c51..fe8e9e9f87 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -59,6 +59,7 @@ export class CreatorPresetEditableBase { protected getNotEmptyVisibleIf(name: string): string { return "{" + name + "} notempty"; } protected createMainPageCore(): any { return undefined; } public getMainElementName() : any { return undefined; } + public getNavigationElementName() : any { return undefined; } public getJsonValue(model: SurveyModel, creator: SurveyCreatorModel, defaultJson?: any): any { const page = model.getPageByName(this.pageName); const core = page && page.isVisible ? this.getJsonValueCore(model, creator, defaultJson) : undefined; diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index f74b700f85..76b798f85c 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -89,6 +89,7 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { ] }; } public getMainElementName() : any { return this.surveyLocalesName; } + public getNavigationElementName() : any { return this.surveyUseEnglishNames; } protected getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { const creatorLocale = model.getValue(this.creatorLocaleName); diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 4279eb6b9e..3de905a924 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -90,7 +90,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit model.editablePresets = editablePresets; model.keepIncorrectValues = true; model.showPrevButton = false; - model.showCompleteButton = false; + model.showNavigationButtons = false; model.fitToContainer = false; model.registerFunctionOnPropertyValueChanged("isShowNextButton", () => { model.setPropertyValue("isShowNextButton", true); @@ -104,16 +104,6 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit } }; - model.addNavigationItem({ - id: "apply-settings", - title: "Apply", - action: () => { - this.applyFromSurveyModel(); - }, - css: "nav-button", - innerCss: "sd-btn" - }); - editablePresets.forEach(item => item.setupQuestions(model, this)); if (!this.defaultJsonValue) { this.defaultJsonValue = {}; @@ -138,6 +128,13 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit editablePresets.forEach(item => item.setupOnCurrentPage(model, this.creator)); } }); + model.onGetQuestionTitleActions.add((_, options) => { + editablePresets.forEach(item => { + if (options.question.name == item.getNavigationElementName()) { + options.actions = model.navigationBar.actions; + } + }); + }); model.onMatrixDetailPanelVisibleChanged.add((sender, options) => { editablePresets.forEach(item => item.updateOnMatrixDetailPanelVisibleChanged(model, this.creator, options)); }); diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss index 02b4b53eae..c088b81e2f 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss @@ -1,4 +1,5 @@ @use "../../../variables.scss" as *; +@use "../fonts.scss" as *; .sps-action-bar { display: flex; @@ -10,6 +11,32 @@ white-space: nowrap; } +.sps-btn { + appearance: none; + border: none; + display: flex; + padding: var(--sjs2-layout-control-action-medium-box-vertical, 12px) var(--sjs2-layout-control-action-medium-box-horizontal, 12px); + justify-content: center; + align-items: center; + gap: var(--sjs2-layout-control-action-medium-box-gap, 0); + margin: var(--sjs2-layout-control-action-medium-label-vertical, 0) var(--sjs2-layout-control-action-medium-label-horizontal, 12px); + border-radius: var(--sjs2-radius-control-button, 8px); + background: var(--sjs2-color-bg-brand-primary, #19B394); + + color: var(--sjs2-color-fg-static-main-primary, #FFF); + text-align: center; + + @include sjs2--typography--default-strong; + + &:hover { + background: var(--sjs2-color-bg-brand-primary-dim, #15987E); + } + &:active { + background: var(--sjs2-color-bg-brand-primary, #19B394); + } + +} + .sps-action-button { @include ctrDefaultBoldFont; -webkit-appearance: none; diff --git a/packages/survey-creator-core/src/presets/presets-theme/fonts.scss b/packages/survey-creator-core/src/presets/presets-theme/fonts.scss index be0f9e9ef2..8e597cdc08 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/fonts.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/fonts.scss @@ -14,6 +14,14 @@ font-weight: 400; line-height: var(--sjs2-line-height-semantic-default, 24px); /* 150% */ } +@mixin sjs2--typography--default-strong { + /* sjs2/typography/default */ + font-family: var(--sjs2-font-family-semantic-default, "Open Sans"); + font-size: var(--sjs2-font-size-semantic-default, 16px); + font-style: normal; + font-weight: 600; + line-height: var(--sjs2-line-height-semantic-default, 24px); /* 150% */ +} @mixin sjs2--typography--default-strong { /* sjs2/typography/default-strong */ font-family: var(--sjs2-font-family-semantic-default, "Open Sans"); diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.ts b/packages/survey-creator-core/src/presets/presets-theme/presets.ts index bcd8bfb1b9..3fb370f56c 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.ts +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.ts @@ -13,6 +13,7 @@ export var presetsCss = { logoImage: "sps-logo__image", headerText: "sps-header__text", navigationButton: "", + bodyNavigationButton: "", completedPage: "sps-completedpage", navigation: { complete: "sps-btn sps-footer__complete-btn", From 05364aa0369eeaa99bba501a99123d240f614d23 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 31 Jul 2025 00:47:14 +0300 Subject: [PATCH 036/240] #7004 - fix navigation --- .../src/presets/presets-editable-languages.ts | 20 ++++++++++++------- .../src/presets/presets-editor.ts | 14 +++++++++++++ .../presets-theme/blocks/sps-action-bar.scss | 1 - .../presets-theme/blocks/sps-panel.scss | 9 ++++++++- 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index 76b798f85c..e4462f141a 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -80,16 +80,21 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { }] }, { - type: "boolean", - name: this.surveyUseEnglishNames, - title: "Translate Survey language names to Engish", - titleLocation: "hidden", - renderAs: "checkbox" - }, + type: "panel", + title: " ", + name: this.navigationPanelName, + elements: [ + { + type: "boolean", + name: this.surveyUseEnglishNames, + title: "Translate Survey language names to Engish", + titleLocation: "hidden", + renderAs: "checkbox" + }] } ] }; } public getMainElementName() : any { return this.surveyLocalesName; } - public getNavigationElementName() : any { return this.surveyUseEnglishNames; } + public getNavigationElementName() : any { return this.navigationPanelName; } protected getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { const creatorLocale = model.getValue(this.creatorLocaleName); @@ -136,6 +141,7 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { private get surveyLocalesName(): string { return this.path + "_surveyLocales"; } private get searchLocalesName(): string { return this.path + "_searchLocales"; } private get surveyUseEnglishNames(): string { return this.path + "_surveyUseEnglishNames"; } + private get navigationPanelName(): string { return this.path + "_navigation"; } public get questionNames() { return [this.surveyLocalesName, this.surveyUseEnglishNames]; } diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 3de905a924..f5ba61ae29 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -135,6 +135,13 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit } }); }); + model.onGetPanelTitleActions.add((_, options) => { + editablePresets.forEach(item => { + if (options.panel.name == item.getNavigationElementName()) { + options.actions = model.navigationBar.actions; + } + }); + }); model.onMatrixDetailPanelVisibleChanged.add((sender, options) => { editablePresets.forEach(item => item.updateOnMatrixDetailPanelVisibleChanged(model, this.creator, options)); }); @@ -157,6 +164,13 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit } }); }); + model.onUpdatePanelCssClasses.add(function(_, options) { + editablePresets.forEach(item => { + if (options.panel.name === item.getNavigationElementName()) { + options.cssClasses.panel.container += " sps-panel--navigation"; + } + }); + }); return model; } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss index c088b81e2f..cf125bd8b4 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss @@ -19,7 +19,6 @@ justify-content: center; align-items: center; gap: var(--sjs2-layout-control-action-medium-box-gap, 0); - margin: var(--sjs2-layout-control-action-medium-label-vertical, 0) var(--sjs2-layout-control-action-medium-label-horizontal, 12px); border-radius: var(--sjs2-radius-control-button, 8px); background: var(--sjs2-color-bg-brand-primary, #19B394); diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss index 155b97ef19..439583a337 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss @@ -15,7 +15,14 @@ } } } - +.sps-panel--navigation { + position: relative; + .sps-panel__header { + width: auto; + position: absolute; + right: 0; + } +} .sps-panel__header { width: 100%; display: flex; From f8ad73205acbfac0cc525e6f205ddbbaf101b532 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 31 Jul 2025 18:12:20 +0300 Subject: [PATCH 037/240] #7004 - navigation panel styling --- .../src/presets/presets-editable-base.ts | 3 ++- .../src/presets/presets-editable-languages.ts | 5 ++--- .../src/presets/presets-editable-tabs.ts | 14 ++++++++++++-- .../presets/presets-theme/blocks/sps-panel.scss | 16 +++++++++++++--- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index fe8e9e9f87..d6afa5f35a 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -9,6 +9,7 @@ export interface ICreatorPresetEditorSetup { export class CreatorPresetEditableBase { private propertyGrid: PropertyGridModel; public parent: CreatorPresetEditableBase; + protected get navigationPanelName(): string { return this.path + "_navigation"; } public children: Array = []; public constructor(public preset: CreatorPresetBase) { } @@ -59,7 +60,7 @@ export class CreatorPresetEditableBase { protected getNotEmptyVisibleIf(name: string): string { return "{" + name + "} notempty"; } protected createMainPageCore(): any { return undefined; } public getMainElementName() : any { return undefined; } - public getNavigationElementName() : any { return undefined; } + public getNavigationElementName() : any { return this.navigationPanelName; } public getJsonValue(model: SurveyModel, creator: SurveyCreatorModel, defaultJson?: any): any { const page = model.getPageByName(this.pageName); const core = page && page.isVisible ? this.getJsonValueCore(model, creator, defaultJson) : undefined; diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index e4462f141a..14962d32a4 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -89,12 +89,11 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { name: this.surveyUseEnglishNames, title: "Translate Survey language names to Engish", titleLocation: "hidden", - renderAs: "checkbox" + renderAs: "switch" }] } ] }; } public getMainElementName() : any { return this.surveyLocalesName; } - public getNavigationElementName() : any { return this.navigationPanelName; } protected getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { const creatorLocale = model.getValue(this.creatorLocaleName); @@ -141,7 +140,7 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { private get surveyLocalesName(): string { return this.path + "_surveyLocales"; } private get searchLocalesName(): string { return this.path + "_searchLocales"; } private get surveyUseEnglishNames(): string { return this.path + "_surveyUseEnglishNames"; } - private get navigationPanelName(): string { return this.path + "_navigation"; } + public get questionNames() { return [this.surveyLocalesName, this.surveyUseEnglishNames]; } diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index ecee1243ec..29472e694b 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -58,8 +58,18 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { { type: "dropdown", name: this.nameActiveTab, - title: "Default tab", - startWithNewLine: false + title: "Default tab" + } + ] + }, + { + type: "panel", + title: " ", + name: this.navigationPanelName, + elements: [ + { + type: "html", + html: " " } ] } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss index 439583a337..c64b657d66 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss @@ -17,10 +17,20 @@ } .sps-panel--navigation { position: relative; + display: flex; + flex-direction: row-reverse; + padding: var(--sjs2-spacing-x250, 20px); + align-items: center; + gap: var(--sjs2-spacing-x150, 12px); .sps-panel__header { - width: auto; - position: absolute; - right: 0; + width: auto; + flex-grow: 1; + padding: 0; + display: flex; + justify-content: flex-end; + } + .sps-question__content { + padding: 0; } } .sps-panel__header { From ac04a8427517b1946353fef9853ad80cbf329ae3 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 1 Aug 2025 18:04:50 +0300 Subject: [PATCH 038/240] #7004 import themes --- packages/survey-creator-core/package.json | 3 ++- .../survey-creator-core/src/creator-theme/creator-themes.ts | 5 +++++ packages/survey-creator-core/src/presets/presets-plugin.ts | 4 +++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/survey-creator-core/package.json b/packages/survey-creator-core/package.json index ffde674586..eb134d22ae 100644 --- a/packages/survey-creator-core/package.json +++ b/packages/survey-creator-core/package.json @@ -29,7 +29,8 @@ "lint:fix": "eslint . --max-warnings=0 --fix" }, "dependencies": { - "survey-core": "../../../survey-library/packages/survey-core/build" + "survey-core": "../../../survey-library/packages/survey-core/build", + "sjs-design-tokens": "../../../sjs-design-tokens/build" }, "devDependencies": { "@rollup/plugin-commonjs": "^28.0.2", diff --git a/packages/survey-creator-core/src/creator-theme/creator-themes.ts b/packages/survey-creator-core/src/creator-theme/creator-themes.ts index 5646d36d22..f9d914d603 100644 --- a/packages/survey-creator-core/src/creator-theme/creator-themes.ts +++ b/packages/survey-creator-core/src/creator-theme/creator-themes.ts @@ -21,6 +21,11 @@ export function registerCreatorTheme(...themes: Array sortDefaultThemes(defaultCreatorThemesOrder, importedThemeNames, PredefinedCreatorThemes); } +export function extendCreatorTheme(theme: ICreatorTheme) { + const curTheme = CreatorThemes[theme.themeName]; + curTheme.cssVariables = { ...curTheme.cssVariables, ...theme.cssVariables }; +} + const defaultVariables = { "--sjs-special-background": "#EDF9F7", "--sjs-primary-background-500": "#19B394", diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 735982eaef..f47ed936ce 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -1,6 +1,7 @@ import { createDropdownActionModel, Base, SurveyModel, Action, ComputedUpdater, CurrentPageChangedEvent, PageVisibleChangedEvent, QuestionDropdownModel, ActionContainer, IAction } from "survey-core"; -import { ICreatorPlugin, SurveyCreatorModel, listComponentCss, saveToFileHandler, TabControlModel, SidebarPageModel, PropertyGridViewModel, PropertyGridModel } from "survey-creator-core"; +import { ICreatorPlugin, SurveyCreatorModel, listComponentCss, saveToFileHandler, extendCreatorTheme } from "survey-creator-core"; import { CreatorPresetEditorModel } from "./presets-editor"; +import { darkTheme } from "sjs-design-tokens"; export class TabPresetsPlugin implements ICreatorPlugin { public model: CreatorPresetEditorModel | undefined; @@ -20,6 +21,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { public saveToFileHandler = saveToFileHandler; public activate(): void { + extendCreatorTheme(darkTheme); this.model = new CreatorPresetEditorModel({}, this.creator, this.defaultJson); this.defaultJson = { ...this.model.defaultJson }; if (this.currentValue) { From 8e523c580c6b037f8383c525abf99dd6b348473c Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 4 Aug 2025 19:02:05 +0300 Subject: [PATCH 039/240] #7004 Presets: integrate presets into creator Fixes #7004 --- .../presets-theme/blocks/sps-checkbox.scss | 30 +++++++++++-------- .../src/presets/presets-theme/presets.ts | 2 +- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-checkbox.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-checkbox.scss index d7146c79d2..27e46fa00d 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-checkbox.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-checkbox.scss @@ -27,18 +27,21 @@ } .sps-checkbox__caption { - @include ctrDefaultFont; - color: var(--ctr-checkbox-text-color, var(--sjs-layer-1-foreground-100, #000000e6)); + @include sjs2--typography--default; + color: var(--sjs2-color-fg-basic-primary, #1C1B20); } .sps-checkbox__rectangle { - background: var(--ctr-checkbox-background-color, var(--sjs-layer-3-background-500, #f4f4f4ff)); - border: var(--ctr-checkbox-border-width, var(--sjs-stroke-x1)) solid - var(--ctr-checkbox-border-color, var(--sjs-border-10, #dcdcdcff)); - border-radius: var(--ctr-checkbox-corner-radius, var(--sjs-corner-radius-x05)); + border-radius: var(--sjs2-radius-control-checkbox, 4px); + border: var(--sjs2-border-width-default, 1px) solid var(--sjs2-color-control-check-false-default-border, #D4D4D4); + background: var(--sjs2-color-control-check-false-default-bg, rgba(28, 27, 32, 0.05)); + + /* sjs2/shadow/inner */ + //box-shadow: var(--sjs2-shadow-size-inner-offset-x, 0) var(--sjs2-shadow-size-inner-offset-y, 0) var(--sjs2-shadow-size-inner-blur, 0) var(--sjs2-shadow-size-inner-spread, 1px) var(--sjs2-shadow-color-inner, #D4D4D4) inset; box-sizing: border-box; - width: var(--ctr-checkbox-button-width, var(--sjs-font-size-x3)); - height: var(--ctr-checkbox-button-height, var(--sjs-font-size-x3)); + width: var(--sjs2-size-x300, 24px); + height: var(--sjs2-size-x300, 24px); + display: flex; justify-content: center; align-items: center; @@ -57,7 +60,7 @@ .sps-checkbox:not(.sps-checkbox--checked):hover { .sps-checkbox__rectangle { - background-color: var(--ctr-checkbox-background-color-hovered, var(--sjs-layer-3-background-400, #eaeaeaff)); + background: var(--sjs2-color-control-check-true-hovered-bg, #15987E); } } @@ -71,8 +74,8 @@ display: block; opacity: 0; fill: transparent; - width: var(--ctr-checkbox-button-check-mark-width, var(--sjs-font-size-x2)); - height: var(--ctr-checkbox-button-check-mark-height, var(--sjs-font-size-x2)); + width: var(--ctr-checkbox-button-check-mark-width, 16px); + height: var(--ctr-checkbox-button-check-mark-height, 16px); background-repeat: no-repeat; background-size: calcSize(2) calcSize(2); transition: @@ -82,12 +85,13 @@ .sps-checkbox--checked { .sps-checkbox__rectangle { - background: var(--ctr-checkbox-background-color-selected, var(--sjs-layer-1-background-500, #ffffffff)); + background: var(--sjs2-color-control-check-true-default-bg, #19B394); + border: var(--sjs2-border-width-default, 1px) solid var(--sjs2-color-control-check-true-default-border, #19B394); } .sps-checkbox__svg { opacity: 1; - fill: var(--ctr-checkbox-button-check-mark-color, var(--sjs-primary-background-500, #19b394ff)); + fill: var(--sjs2-color-control-check-true-default-icon, #ffffff); } } diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.ts b/packages/survey-creator-core/src/presets/presets-theme/presets.ts index 3fb370f56c..2f0bdb5f99 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.ts +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.ts @@ -137,7 +137,7 @@ export var presetsCss = { itemInline: "sps-selectbase__item--inline", label: "sps-selectbase__label", // label: "sps-checkbox", - itemSvgIconId: "#icon-v2check", + itemSvgIconId: "#icon-check-16x16", labelChecked: "", //itemControl: "sps-visuallyhidden sps-item__control", itemControl: "sps-checkbox__control", From 0cf1d9c31c6c9413e9e907ee5959c0c245e42d8b Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 5 Aug 2025 17:49:26 +0300 Subject: [PATCH 040/240] #7004 Presets: integrate presets into creator Fixes #7004 --- .../presets-theme/blocks/sps-checkbox.scss | 9 ++- .../presets-theme/blocks/sps-dropdown.scss | 6 +- .../presets-theme/blocks/sps-input.scss | 31 +++------ .../presets-theme/blocks/sps-list.scss | 69 +++++++++++++++++++ .../src/presets/presets-theme/presets.scss | 1 + .../src/presets/presets-theme/presets.ts | 11 ++- 6 files changed, 97 insertions(+), 30 deletions(-) create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-checkbox.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-checkbox.scss index 27e46fa00d..d709693a00 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-checkbox.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-checkbox.scss @@ -1,4 +1,5 @@ @use "../../../variables" as *; +@use "../fonts" as *; .sps-checkbox { cursor: pointer; @@ -58,7 +59,13 @@ outline $creator-transition-duration; } -.sps-checkbox:not(.sps-checkbox--checked):hover { +.sps-checkbox:hover { + .sps-checkbox__rectangle { + background: var(--sjs2-color-control-check-false-hovered-bg, rgba(28, 27, 32, 0.10)); + } +} + +.sps-checkbox.sps-checkbox--checked:hover { .sps-checkbox__rectangle { background: var(--sjs2-color-control-check-true-hovered-bg, #15987E); } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss index 2735b2f81d..e8265ea421 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss @@ -9,16 +9,14 @@ align-self: stretch; border-radius: var(--sjs2-radius-semantic-form, 8px); - background: var(--sjs2-color-control-formbox-default-bg, rgba(28, 27, 32, 0.05)); - - /* sjs2/shadow/inner */ - box-shadow: var(--sjs2-shadow-size-inner-offset-x, 0) var(--sjs2-shadow-size-inner-offset-y, 0) var(--sjs2-shadow-size-inner-blur, 0) var(--sjs2-shadow-size-inner-spread, 1px) var(--sjs2-shadow-color-inner, #D4D4D4) inset; .sps-dropdown__filter-string-input { display: flex; padding: var(--sjs2-layout-control-input-medium-content-vertical, 8px) var(--sjs2-layout-control-input-medium-content-horizontal, 12px); align-items: flex-start; flex: 1 0 0; + box-shadow: none; + border: none; } } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-input.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-input.scss index 4d6e5c83ce..86af473c84 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-input.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-input.scss @@ -6,28 +6,28 @@ -moz-appearance: none; appearance: none; display: block; - background-color: var(--ctr-editor-background-color, var(--sjs-layer-3-background-500, #f4f4f4ff)); box-sizing: border-box; width: 100%; border: none; - border-radius: var(--ctr-editor-corner-radius, var(--sjs-corner-radius-x075)); - box-shadow: inset 0 0 0 var(--ctr-editor-border-width, var(--sjs-stroke-x1)) - var(--ctr-editor-border-color, var(--sjs-border-10, #dcdcdcff)); + border-radius: var(--sjs2-radius-semantic-form, 8px); + background: var(--sjs2-color-control-formbox-default-bg, rgba(28, 27, 32, 0.05)); + box-shadow: inset 0 0 0 var(--sjs2-border-width-default, 1px) + var(--sjs2-color-control-formbox-default-border, #D4D4D4); transition: box-shadow $creator-transition-duration; padding-top: calc( - var(--ctr-editor-padding-top, var(--sjs-spacing-x05)) + var(--ctr-editor-content-margin-top, var(--sjs-spacing-x1)) + var(--sjs2-layout-form-box-medium-vertical, 4px) + var(--ctr-editor-content-margin-top, var(--sjs-spacing-x1)) ); padding-right: calc( - var(--ctr-editor-padding-right, var(--sjs-spacing-x05)) + + var(--sjs2-layout-form-box-medium-horizontal, 4px) + var(--ctr-editor-content-margin-right, var(--sjs-spacing-x150)) ); padding-bottom: calc( - var(--ctr-editor-padding-bottom, var(--sjs-spacing-x05)) + + var(--sjs2-layout-form-box-medium-vertical, 4px) + var(--ctr-editor-content-margin-bottom, var(--sjs-spacing-x1)) ); padding-left: calc( - var(--ctr-editor-padding-left, var(--sjs-spacing-x05)) + + var(--sjs2-layout-form-box-medium-horizontal, 4px) + var(--ctr-editor-content-margin-left, var(--sjs-spacing-x150)) ); outline: none; @@ -77,21 +77,6 @@ var(--ctr-editor-border-color-focused, var(--sjs-primary-background-500, #19b394ff)); } -input.sps-input:focus:read-only { - box-shadow: inset 0 0 0 var(--ctr-editor-border-width, var(--sjs-stroke-x1)) - var(--ctr-editor-border-color, var(--sjs-border-10, #dcdcdcff)); -} - -.sps-input:disabled, -.sps-input:disabled::placeholder, -input.sps-input:read-only, -input.sps-input:read-only::placeholder { - color: rgb( - from var(--ctr-editor-content-text-color-disabled, var(--sjs-layer-1-foreground-100, #000000e6)) r g b / - var(--ctr-editor-content-text-opacity-disabled, 0.25) - ); - background-color: var(--ctr-editor-background-color-disabled, var(--sjs-layer-1-background-500, #ffffffff)); -} .sps-input[type="color"] { padding-left: 0; diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss new file mode 100644 index 0000000000..3990a38acf --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss @@ -0,0 +1,69 @@ +@use "../../../variables" as *; +@use "../fonts" as *; + +.sps-list { + width: 100%; + padding: var(--sjs2-layout-container-drop-vertical, 8px) var(--sjs2-layout-container-drop-horizontal, 8px); + margin: 0; + overflow-y: auto; + list-style-type: none; + + box-sizing: border-box; + + .sps-list__item { + width: 100%; + outline: none; + } + + .sps-list__item-body { + @include sjs2--typography--default; + text-align: start; + color: var(--sjs2-color-fg-basic-primary, #1c1b20); + transition: color $creator-transition-duration; + + display: flex; + flex: 1 0 0; + padding: var(--sjs2-spacing-x150, 12px) var(--sjs2-size-x200, 16px); + + align-items: center; + gap: 8px; + border-radius: var(--sjs2-radius-control-drop-item, 8px); + background: var(--sjs2-color-bg-brand-tertiary, rgba(25, 179, 148, 0)); + + cursor: pointer; + + transition: background-color $creator-transition-duration; + + & > span, + & > sv-ng-string { + flex: 1 0 0; + } + } + + .sps-list__item:disabled, + .sps-list__item--disabled { + opacity: var(--ctr-list-item-opacity-disabled, 0.25); + pointer-events: none; + } + + .sps-list__item:focus, + .sps-list__item:hover, + .sps-list__item--focused, + .sps-list__item--hovered { + & > .sps-list__item-body { + border-radius: var(--sjs2-radius-control-drop-item, 8px); + background: var(--sjs2-color-bg-brand-tertiary-dim, rgba(25, 179, 148, 0.1)); + } + } + + .sps-list__item--selected, + .sps-list__item--selected:hover, + .sps-list__item--selected:focus, + .sps-list__item.sps-list__item--selected:hover { + & > .sps-list__item-body { + @include sjs2--typography--default-strong; + border-radius: var(--sjs2-radius-control-drop-item, 8px); + background: var(--sjs2-color-bg-brand-primary, #19b394); + } + } +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index 6588fb794d..9ccf46d122 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -17,6 +17,7 @@ @use "blocks/sps-overriding.scss"; @use "blocks/sps-search-editor.scss"; @use "blocks/sps-buttongroup.scss"; +@use "blocks/sps-list.scss"; .sps-root-modern { position: relative; diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.ts b/packages/survey-creator-core/src/presets/presets-theme/presets.ts index 2f0bdb5f99..1b4f537a05 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.ts +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.ts @@ -203,7 +203,7 @@ export var presetsCss = { control: "sps-input sps-dropdown", controlEmpty: "sps-dropdown--empty sd-dropdown--empty", controlValue: "sps-dropdown__value", - filterStringInput: "sd-dropdown__filter-string-input sps-dropdown__filter-string-input", + filterStringInput: "sps-input sd-dropdown__filter-string-input sps-dropdown__filter-string-input", other: "sps-comment sps-question__other", onError: "sps-input--error", selectWrapper: "sv-dropdown_select-wrapper sps-dropdown_select-wrapper", @@ -393,7 +393,14 @@ export var presetsCss = { buttonCollapsed: "" } }, - //list: JSON.parse(JSON.stringify(listComponentCss)), + list: { + root: "sv-list__container sps-list", + item: "sv-list__item sps-list__item", + itemBody: "sv-list__item-body sps-list__item-body", + itemSelected: "sv-list__item--selected sps-list__item--selected", + itemFocused: "sv-list__item--focused sps-list__item--focused", + itemHovered: "sv-list__item--hovered sps-list__item--hovered", + }, actionBar: { root: "sps-action-bar", item: "sps-action-button", From 9fe2e3b50ffdc98e94ebf4dc59164426726c58b7 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 8 Aug 2025 18:01:30 +0300 Subject: [PATCH 041/240] #7004 work for matrix theming --- .../src/presets/presets-editable-tabs.ts | 25 +++++++++------ .../presets-theme/blocks/sps-table.scss | 3 -- .../blocks/sps-theme-builder.scss | 31 ------------------- .../src/presets/presets-theme/presets.scss | 16 +++++++++- packages/survey-creator-react/index.js | 2 ++ 5 files changed, 33 insertions(+), 44 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index 29472e694b..12b293229e 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -40,17 +40,24 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { public createMainPageCore(): any { return { - title: "Set Up the Tabs", + title: "Configure the Tabs", + description: "Select the tabs you want to show, reorder them, change their titles, and choose the tab that will be active by default.", navigationTitle: "Tabs", elements: [ - this.createItemsMatrixJSON({ - name: this.nameItems - }), - this.createItemsMatrixJSON({ - startWithNewLine: false, - name: this.nameMatrix, - "descriptionLocation": "underInput", - }), + { + type: "panel", + name: "panel_tabs_matrix", + elements: [ + this.createItemsMatrixJSON({ + name: this.nameItems + }), + this.createItemsMatrixJSON({ + startWithNewLine: false, + name: this.nameMatrix, + "descriptionLocation": "underInput", + }), + ] + }, { type: "panel", name: "panel_tabs_controls", diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss index 2b8dad1acb..7350fe4c35 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -2,9 +2,6 @@ @use "./variables.scss" as *; .sps-table-wrapper { - border: var(--ctr-data-table-border-width, var(--sjs-stroke-x1)) solid - var(--ctr-data-table-border-color, var(--sjs-border-25, #d4d4d4ff)); - border-radius: var(--ctr-data-table-corner-radius, var(--sjs-corner-radius-x075)); overflow: hidden; } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-theme-builder.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-theme-builder.scss index c5c7c968f6..8d75b35851 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-theme-builder.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-theme-builder.scss @@ -36,33 +36,6 @@ margin: 0 auto; } - .sps-row--multiple { - .sps-spin-editor { - .sps-input-container__buttons-container { - display: none; - } - } - - & > div { - flex-grow: 1; - flex-shrink: 1; - flex-basis: calc(50% - #{$base-unit} * 0.5); - min-width: auto; - - input { - min-width: 0; - } - - .sps-question--location--left { - box-sizing: border-box; - - .sps-input { - height: auto; - } - } - } - } - .sv-button-group { overflow: hidden; } @@ -140,10 +113,6 @@ margin-top: calc(var(--thm-ctr-editor-layout-gap) - var(--thm-ctr-property-grid-form-gap)); } - .sps-row--multiple .sps-question.sps-row__question:not(.sd-question--title-top) { - margin-top: 0; - } - .sps-question-composite__content .sps-row:first-of-type { margin-top: var(--ctr-editor-layout-gap, var(--sjs-spacing-x1)); } diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index 9ccf46d122..99771fbcb2 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -96,4 +96,18 @@ bottom: 0; right: 0; } -} \ No newline at end of file +} + +.sps-row--multiple { + display: flex; + align-items: stretch; + + & > div { + display: flex; + padding: var(--sjs2-spacing-x150, 12px); + flex-direction: column; + align-items: flex-start; + gap: var(--sjs2-spacing-x075, 6px); + align-self: stretch; + } +} diff --git a/packages/survey-creator-react/index.js b/packages/survey-creator-react/index.js index 83b5714881..4c1ec69abe 100644 --- a/packages/survey-creator-react/index.js +++ b/packages/survey-creator-react/index.js @@ -236,6 +236,8 @@ if(window.SurveyCreatorCorePresets) { window.editor = new SurveyCreatorCorePresets.TabPresetsPlugin(creator); } +creator.activeTab = "presets"; +editor.model.model.currentPageNo = 1; ReactDOM.render( From 7a9837a4b3ee5defff92c40a063272194ad8e207 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 11 Aug 2025 16:50:39 +0300 Subject: [PATCH 042/240] #7004 Presets: integrate presets into creator Fixes #7004 --- .../src/images-v2/remove_24x24.svg | 4 ++ .../src/images/remove_24x24.svg | 4 ++ .../presets/presets-editable-categorized.ts | 1 + .../src/presets/presets-editable-list.ts | 5 +- .../presets-theme/blocks/sps-action-bar.scss | 4 +- .../blocks/sps-matrixdynamic.scss | 35 +++++++++----- .../presets-theme/blocks/sps-table.scss | 46 +++++++++++++------ .../src/presets/presets-theme/presets.ts | 2 +- 8 files changed, 73 insertions(+), 28 deletions(-) create mode 100644 packages/survey-creator-core/src/images-v2/remove_24x24.svg create mode 100644 packages/survey-creator-core/src/images/remove_24x24.svg diff --git a/packages/survey-creator-core/src/images-v2/remove_24x24.svg b/packages/survey-creator-core/src/images-v2/remove_24x24.svg new file mode 100644 index 0000000000..e7821f2f6c --- /dev/null +++ b/packages/survey-creator-core/src/images-v2/remove_24x24.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/packages/survey-creator-core/src/images/remove_24x24.svg b/packages/survey-creator-core/src/images/remove_24x24.svg new file mode 100644 index 0000000000..e7821f2f6c --- /dev/null +++ b/packages/survey-creator-core/src/images/remove_24x24.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 822607f8b3..e2bf0b35ad 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -98,6 +98,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre options.actions.push({ id: iconName, iconName: iconName, + innerCss: "sps-matrix-row-icon", location: "start", enabled: false }); diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 5a42d4ea20..f1be449436 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -55,6 +55,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { options.actions.push({ id: iconName, iconName: iconName, + innerCss: "sps-matrixdynamic__row-icon", location: "start", enabled: false }); @@ -69,7 +70,9 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { } if (a.id == "remove-row") { a.visibleIndex = 20; - a.iconName = options.question.name == this.nameMatrix ? "icon-add_16x16" : "icon-remove_16x16"; + a.component = "sv-action-bar-item"; + a.action = () => options.question.removeRowUI(options.row); + a.iconName = options.question.name == this.nameMatrix ? "icon-add_24x24" : "icon-remove_24x24"; } }); } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss index cf125bd8b4..89e42bac09 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss @@ -49,8 +49,8 @@ box-sizing: border-box; border: none; color: var(--ctr-actionbar-button-text-color, var(--sjs-primary-background-500, #19b394ff)); - border-radius: var(--ctr-actionbar-button-corner-radius, var(--sjs-corner-radius-x1)); - background-color: transparent; + border-radius: var(--sjs2-radius-control-action-icon, 8px); + background: var(--sjs2-color-bg-neutral-tertiary, rgba(28, 27, 32, 0.00)); cursor: pointer; transition: background-color $creator-transition-duration, diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss index b0aa6f92d1..6cb54e6ffa 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss @@ -15,18 +15,15 @@ // } .sps-drag-element__svg { - width: var(--ctr-data-table-row-drag-area-icon-width, var(--sjs-font-size-x3)); - height: var(--ctr-data-table-row-drag-area-icon-height, var(--sjs-font-size-x3)); - padding-top: var(--ctr-data-table-row-drag-area-padding-top, var(--sjs-spacing-x1)); - padding-inline-end: var(--ctr-data-table-row-drag-area-padding-right, var(--sjs-spacing-x1)); - padding-bottom: var(--ctr-data-table-row-drag-area-padding-bottom, var(--sjs-spacing-x1)); - padding-inline-start: var(--ctr-data-table-row-drag-area-padding-left, var(--sjs-spacing-x1)); - - display: block; - opacity: 0.5; - + width: var(--sjs2-size-icon-medium, 24px); + height: var(--sjs2-size-icon-medium, 24px); + display: flex; + padding: var(--sjs2-spacing-x100, 8px); + flex-direction: column; + justify-content: center; + align-items: center; use { - fill: var(--ctr-data-table-row-drag-area-icon-color, var(--sjs-layer-1-foreground-50, #00000080)); + fill: var(--sjs2-color-fg-basic-tertiary, rgba(from #1C1B20 r g b / 0.4)); } } @@ -80,6 +77,22 @@ text-align: center; } +.sps-matrixdynamic__row-icon { + width: var(--sjs2-size-icon-medium, 24px); + height: var(--sjs2-size-icon-medium, 24px); + padding: var(--ctr-actionbar-button-padding-top-large-icon, var(--sjs-spacing-x1)) + 0 + var(--ctr-actionbar-button-padding-bottom-large-icon, var(--sjs-spacing-x1)) + 0; + margin-inline-end: var(--sjs2-spacing-x100, 8px); + &:disabled { + opacity: 1; + } + use { + fill: var(--sjs2-color-fg-brand-primary, #19B394); + } +} + .sps-matrixdynamic__add-btn { @include ctrDefaultBoldFont; display: none; diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss index 7350fe4c35..b006d0b10f 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -7,21 +7,45 @@ .sps-table { width: 100%; - background-color: var(--ctr-data-table-background-color, var(--sjs-layer-1-background-400, #f5f5f5ff)); + background-color: var(--sjs2-color-bg-basic-primary, #FFF); border-collapse: collapse; tr { - border-bottom: var(--ctr-data-table-row-border-width, var(--sjs-stroke-x1)) solid - var(--ctr-data-table-row-border-color, var(--sjs-border-10, #dcdcdcff)); - background-color: var(--ctr-data-table-row-background-color, var(--sjs-layer-1-background-500, #ffffffff)); + background-color: var(--sjs2-color-bg-basic-primary, #FFF); + &:hover { + td > div { + background: red; + } + } } + tbody > tr:last-of-type { - border-bottom: var(--ctr-data-table-row-border-width-last-row, 0px); + border-bottom: none; + td { + border-bottom: none; + } + } + tbody > tr:first-of-type { + border-top: none; + td { + border-top: none; + } } } .sps-table__cell { padding: 0; + padding-bottom: calc(var(--sjs2-spacing-x075, 6px) + var(--sjs2-spacing-x050, 4px)); + padding-top: calc(var(--sjs2-spacing-x075, 6px) + var(--sjs2-spacing-x050, 4px)); + border-bottom: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #D4D4D4); + &:first-of-type > div { + border-top-left-radius: var(--sjs2-radius-semantic-form, 8px); + border-bottom-left-radius: var(--sjs2-radius-semantic-form, 8px); + } + &:last-of-type > div { + border-top-right-radius: var(--sjs2-radius-semantic-form, 8px); + border-bottom-right-radius: var(--sjs2-radius-semantic-form, 8px); + } } .sps-table__cell--detail-panel { @@ -46,7 +70,7 @@ appearance: none; box-shadow: none; border-radius: var(--ctr-data-table-cell-corner-radius-focused, var(--sjs-corner-radius-x075)); - background-color: var(--ctr-data-table-row-background-color, var(--sjs-layer-1-background-500, #ffffffff)); + background-color: transparent; height: auto; padding: var(--ctr-data-table-cell-padding-top, var(--sjs-spacing-x1)) var(--ctr-data-table-cell-padding-right, var(--sjs-spacing-x1)) @@ -99,7 +123,9 @@ .sps-table__cell:not(.sps-table__cell--detail-panel):first-of-type .sps-text { padding-left: calcSize(2); } - +.sps-table__cell--actions { + width: 0; +} .sps-table__cell--actions:first-of-type { width: calcSize(5); } @@ -141,12 +167,6 @@ white-space: unset; } } -.sps-table__question-wrapper { - box-sizing: border-box; - padding: var(--ctr-data-table-row-padding-top, var(--sjs-spacing-x05)) - var(--ctr-data-table-row-padding-right, var(--sjs-spacing-x05)) - var(--ctr-data-table-row-padding-bottom, var(--sjs-spacing-x05)) var(--ctr-data-table-row-padding-left, 0px); -} .sps-table__row--leave, .sps-table__row--enter { diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.ts b/packages/survey-creator-core/src/presets/presets-theme/presets.ts index 1b4f537a05..9ae47a2806 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.ts +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.ts @@ -297,7 +297,7 @@ export var presetsCss = { buttonAdd: "sps-matrixdynamic__add-btn sps-action-button sps-action-button--large", buttonRemove: "sps-matrixdynamic__remove-btn", iconAdd: "", - iconRemove: "", + iconRemove: "xxx", dragElementDecorator: "sps-drag-element__svg", iconDragElement: "#icon-drag-24x24", iconDrag: "sps-matrixdynamic__drag-element", From 34faebba41518287ac65f7d55bc120647d1e40b4 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 12 Aug 2025 00:07:36 +0300 Subject: [PATCH 043/240] #7004 - styles --- .../presets/presets-editable-categorized.ts | 7 +- .../src/presets/presets-editable-toolbox.ts | 78 ++++++++++--------- .../presets-theme/blocks/sps-action-bar.scss | 6 +- .../blocks/sps-matrixdynamic.scss | 3 +- .../presets-theme/blocks/sps-table.scss | 15 +++- .../src/presets/presets-theme/presets.scss | 5 +- .../src/presets/presets-theme/presets.ts | 1 + 7 files changed, 70 insertions(+), 45 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index e2bf0b35ad..5e60e87da3 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -125,7 +125,12 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre a.iconName = "icon-expand-24x24", a.visibleIndex = 10; } - if (a.id == "remove-row") a.visibleIndex = 20; + if (a.id == "remove-row") { + a.visibleIndex = 20; + a.component = "sv-action-bar-item"; + a.action = () => options.question.removeRowUI(options.row); + a.iconName = options.question.name == this.nameMatrix ? "icon-add_24x24" : "icon-remove_24x24"; + } }); } } diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 9fb9383d0a..d84dba1494 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -74,46 +74,50 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita title: "Set Up the Toolbox", navigationTitle: "Toolbox", elements: [ - { - type: "matrixdynamic", - name: this.nameCategories, - titleLocation: "hidden", - visibleIf: this.getTextVisibleIf(this.nameCategoriesMode, "categories"), - minRowCount: 1, - allowRowReorder: true, - addRowButtonLocation: "top", - addRowText: "Add Custom Category", - showHeader: false, - columns: [ - { cellType: "text", name: "category", isUnique: true, isRequired: true, visible: false }, - { name: "isDefault", type: "boolean", defaultValue: false, visible: false }, - { cellType: "text", name: "title" } - ], - detailPanelMode: "underRow", - detailElements: [ - { type: "text", name: "category", isRequired: true, visible: false }, - { type: "text", name: "tooltip", visible: false }, + type: "panel", + name: "panel_toolbox_matrix", + elements: [ + { + type: "matrixdynamic", + name: this.nameCategories, + titleLocation: "hidden", + visibleIf: this.getTextVisibleIf(this.nameCategoriesMode, "categories"), + minRowCount: 1, + allowRowReorder: true, + addRowButtonLocation: "top", + addRowText: "Add Custom Category", + showHeader: false, + columns: [ + { cellType: "text", name: "category", isUnique: true, isRequired: true, visible: false }, + { name: "isDefault", type: "boolean", defaultValue: false, visible: false }, + { cellType: "text", name: "title" } + ], + detailPanelMode: "underRow", + detailElements: [ + { type: "text", name: "category", isRequired: true, visible: false }, + { type: "text", name: "tooltip", visible: false }, + this.createItemsMatrixJSON({ + name: this.nameInnerMatrix, + valueName: "items" + }) + ] + }, this.createItemsMatrixJSON({ - name: this.nameInnerMatrix, - valueName: "items" - }) - ] + name: this.nameItems, + startWithNewLine: false, + visibleIf: this.getTextVisibleIf(this.nameCategoriesMode, "items"), + }), + this.createItemsMatrixJSON({ + allowAddRows: true, + addRowButtonLocation: "top", + addRowText: "Add Custom Item", + startWithNewLine: false, + name: this.nameMatrix, + "descriptionLocation": "underInput", + description: "Drag an item from this column to the left one — it will appear visible in the toolbox. You can also move them, using plus and minus buttons near the item." + })] }, - this.createItemsMatrixJSON({ - name: this.nameItems, - startWithNewLine: false, - visibleIf: this.getTextVisibleIf(this.nameCategoriesMode, "items"), - }), - this.createItemsMatrixJSON({ - allowAddRows: true, - addRowButtonLocation: "top", - addRowText: "Add Custom Item", - startWithNewLine: false, - name: this.nameMatrix, - "descriptionLocation": "underInput", - description: "Drag an item from this column to the left one — it will appear visible in the toolbox. You can also move them, using plus and minus buttons near the item." - }), { type: "panel", name: "panel_toolbox_controls", diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss index 89e42bac09..9252a3ef7f 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss @@ -60,10 +60,8 @@ &:focus { opacity: 1; outline: none; - background-color: var( - --ctr-actionbar-button-background-color-hovered, - var(--sjs-layer-1-background-400, #f5f5f5ff) - ); + + background: var(--sjs2-color-bg-neutral-tertiary-dim, rgba(28, 27, 32, 0.05)); use { fill: var(--ctr-actionbar-button-icon-color-hovered, var(--sjs-layer-1-foreground-75, #000000bf)); diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss index 6cb54e6ffa..ade159c3ed 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss @@ -80,7 +80,8 @@ .sps-matrixdynamic__row-icon { width: var(--sjs2-size-icon-medium, 24px); height: var(--sjs2-size-icon-medium, 24px); - padding: var(--ctr-actionbar-button-padding-top-large-icon, var(--sjs-spacing-x1)) + padding: 0; + margin: var(--ctr-actionbar-button-padding-top-large-icon, var(--sjs-spacing-x1)) 0 var(--ctr-actionbar-button-padding-bottom-large-icon, var(--sjs-spacing-x1)) 0; diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss index b006d0b10f..6cdb2b4f39 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -1,5 +1,6 @@ @use "../../../variables.scss" as *; @use "./variables.scss" as *; +@use "../fonts" as *; .sps-table-wrapper { overflow: hidden; @@ -12,9 +13,15 @@ tr { background-color: var(--sjs2-color-bg-basic-primary, #FFF); + td:last-of-type button { + opacity: 0; + } &:hover { td > div { - background: red; + background: var(--sjs2-color-bg-basic-primary-dim, rgba(28, 27, 32, 0.05)); + } + td:last-of-type button { + opacity: 1; } } } @@ -227,3 +234,9 @@ animation: none; } } + +.sps-table__row--empty { + @include sjs2--typography--default; + color: var(--sjs2-color-fg-basic-primary, #1C1B20); + text-align: center; +} \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index 99771fbcb2..0bfd17e81b 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -101,7 +101,6 @@ .sps-row--multiple { display: flex; align-items: stretch; - & > div { display: flex; padding: var(--sjs2-spacing-x150, 12px); @@ -109,5 +108,9 @@ align-items: flex-start; gap: var(--sjs2-spacing-x075, 6px); align-self: stretch; + border-right: var(--sjs2-border-width-static-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #D4D4D4); + &:last-child { + border: none; + } } } diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.ts b/packages/survey-creator-core/src/presets/presets-theme/presets.ts index 9ae47a2806..4111afd0c1 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.ts +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.ts @@ -309,6 +309,7 @@ export var presetsCss = { cellQuestionWrapper: "sps-table__question-wrapper", draggedRow: "sps-matrixdynamic__dragged-row", emptyCell: "sps-table__cell--empty", + rowEmpty: "sps-table__row--empty", rowEnter: "sps-table__row--enter", rowLeave: "sps-table__row--leave", }, From 1537411a56e51b4e91461f61df72c792da8cf8bd Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 12 Aug 2025 17:02:39 +0300 Subject: [PATCH 044/240] #7004 fixed styles --- .../src/components/popup.scss | 11 ++++++++ .../src/presets/presets-editable-base.ts | 4 ++- .../presets/presets-editable-properties.ts | 6 ++--- .../src/presets/presets-editable-tabs.ts | 3 +-- .../src/presets/presets-editable-toolbox.ts | 24 ++++++++++------- .../src/presets/presets-editor.ts | 3 +++ .../src/presets/presets-plugin.ts | 2 +- .../presets-theme/blocks/sps-table.scss | 26 +++++++++++++++---- .../src/presets/presets-theme/presets.scss | 20 +++++++++++++- 9 files changed, 76 insertions(+), 23 deletions(-) diff --git a/packages/survey-creator-core/src/components/popup.scss b/packages/survey-creator-core/src/components/popup.scss index de55473e6d..39e100bad0 100644 --- a/packages/survey-creator-core/src/components/popup.scss +++ b/packages/survey-creator-core/src/components/popup.scss @@ -226,3 +226,14 @@ // color: var(--ctr-popup-message-color, var(--sjs-layer-1-foreground-100, #000000e6)); // } } + +.svc-creator-popup--large-markers { + .svc-list__item-body { + padding-inline-end: var(--sjs-spacing-x150, 12px); + } + .svc-list-item__marker-icon { + padding: 0; + width: var(--sjs-font-size-x3, 24px); + height: var(--sjs-font-size-x3, 24px); + } +} diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index d6afa5f35a..a219a3c8e2 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -23,6 +23,9 @@ export class CreatorPresetEditableBase { return prefix + this.path; } public get pageName(): string { return "page_" + this.fullPath; } + protected get mainPanelName() { return this.path + "_mainPanel"; } + public getMainElementName() : any { return this.mainPanelName; } + public getMainPanelName() : any { return this.mainPanelName; } public createPages(): Array { const res = []; const mainPage = this.createMainPage(); @@ -59,7 +62,6 @@ export class CreatorPresetEditableBase { protected getTextVisibleIf(name: string, val: string): string { return "{" + name + "}='" + val + "'"; } protected getNotEmptyVisibleIf(name: string): string { return "{" + name + "} notempty"; } protected createMainPageCore(): any { return undefined; } - public getMainElementName() : any { return undefined; } public getNavigationElementName() : any { return this.navigationPanelName; } public getJsonValue(model: SurveyModel, creator: SurveyCreatorModel, defaultJson?: any): any { const page = model.getPageByName(this.pageName); diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 8ee61f2288..4d31525583 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -259,7 +259,7 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare }, { type: "panel", - name: "propPanel", + name: this.mainPanelName, visibleIf: this.getNotEmptyVisibleIf(this.nameSelector), elements: [ { @@ -290,9 +290,7 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare //addRowButtonLocation: "top", //addRowText: "Add Custom Item", startWithNewLine: false, - name: this.nameMatrix, - "descriptionLocation": "underInput", - description: "Drag an item from this column to the left one — it will appear visible in the toolbox. You can also move them, using plus and minus buttons near the item." + name: this.nameMatrix }) ] }, diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index 12b293229e..b6a50258ed 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -37,7 +37,6 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { }; return { ...defaultJSON, ...props }; } - public createMainPageCore(): any { return { title: "Configure the Tabs", @@ -46,7 +45,7 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { elements: [ { type: "panel", - name: "panel_tabs_matrix", + name: this.mainPanelName, elements: [ this.createItemsMatrixJSON({ name: this.nameItems diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index d84dba1494..952e529695 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -1,4 +1,4 @@ -import { FunctionFactory, Helpers, IDialogOptions, ItemValue, MatrixDropdownRowModelBase, MatrixDynamicRowModel, QuestionMatrixDynamicModel, Serializer, settings, SurveyModel } from "survey-core"; +import { FunctionFactory, Helpers, IDialogOptions, ItemValue, MatrixDropdownRowModelBase, MatrixDynamicRowModel, QuestionMatrixDropdownRenderedRow, QuestionMatrixDynamicModel, Serializer, settings, SurveyModel } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; import { QuestionToolboxCategory, QuestionToolboxItem, SurveyCreatorModel, SurveyJSON5, editorLocalization } from "survey-creator-core"; import { PresetItemValue, QuestionPresetRankingModel } from "./preset-question-ranking"; @@ -76,7 +76,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita elements: [ { type: "panel", - name: "panel_toolbox_matrix", + name: this.mainPanelName, elements: [ { type: "matrixdynamic", @@ -113,14 +113,13 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita addRowButtonLocation: "top", addRowText: "Add Custom Item", startWithNewLine: false, - name: this.nameMatrix, - "descriptionLocation": "underInput", - description: "Drag an item from this column to the left one — it will appear visible in the toolbox. You can also move them, using plus and minus buttons near the item." + name: this.nameMatrix })] }, { type: "panel", - name: "panel_toolbox_controls", + title: " ", + name: this.navigationPanelName, elements: [ { type: "boolean", @@ -132,7 +131,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita valueFalse: "items", clearIfInvisible: "onHidden", startWithNewLine: false, - renderAs: "checkbox" + renderAs: "switch" }, { type: "boolean", @@ -143,8 +142,9 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita visibleIf: this.getTextVisibleIf(this.nameCategoriesMode, "categories"), clearIfInvisible: "onHidden", startWithNewLine: false, - renderAs: "checkbox" - }] + renderAs: "switch" + } + ] } ] }; @@ -240,6 +240,12 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita } protected setupQuestionsCore(model: SurveyModel, creatorSetup: ICreatorPresetEditorSetup): void { + this.getQuestionCategories(model).onCreateDetailPanelRenderedRowCallback = ( + renderedRow: QuestionMatrixDropdownRenderedRow + ) => { + renderedRow.cells = [renderedRow.cells[1]]; + renderedRow.cells[0].colSpans += 2; + }; this.setupPageQuestions(model, creatorSetup.creator); } private setupPageQuestions(model: SurveyModel, creator: SurveyCreatorModel): void { diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index f5ba61ae29..bc3e52ea94 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -166,6 +166,9 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit }); model.onUpdatePanelCssClasses.add(function(_, options) { editablePresets.forEach(item => { + if (options.panel.name === item.getMainPanelName()) { + options.cssClasses.panel.content += " sps-panel__content--main"; + } if (options.panel.name === item.getNavigationElementName()) { options.cssClasses.panel.container += " sps-panel--navigation"; } diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index f47ed936ce..649b1ac435 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -54,7 +54,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { items: [...presets, ...tools], verticalPosition: "top", horizontalPosition: "center", - cssClass: "svc-creator-popup", + cssClass: "svc-creator-popup svc-creator-popup--large-markers", cssClasses: listComponentCss, // onHide: () => { this.languageSelectorAction.enabled = true; }, // onShow: () => { this.languageSelectorAction.enabled = false; } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss index 6cdb2b4f39..326c066c14 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -11,16 +11,16 @@ background-color: var(--sjs2-color-bg-basic-primary, #FFF); border-collapse: collapse; - tr { + &>tbody>tr { background-color: var(--sjs2-color-bg-basic-primary, #FFF); - td:last-of-type button { + &> td:last-of-type > .sps-action-bar { opacity: 0; } &:hover { - td > div { + &> td > div { background: var(--sjs2-color-bg-basic-primary-dim, rgba(28, 27, 32, 0.05)); } - td:last-of-type button { + &> td:last-of-type > .sps-action-bar { opacity: 1; } } @@ -56,11 +56,26 @@ } .sps-table__cell--detail-panel { - background: var(--ctr-data-table-background-color, var(--sjs-layer-1-background-400, #f5f5f5ff)); + padding: 0; .sps-panel__content { box-shadow: none; } + + .sps-row .sps-question--nested { + overflow: initial; + } + + .sps-panel { + border: none; + } + + .sps-table__cell { + padding: 0; + padding-bottom: var(--sjs2-spacing-x075, 6px); + padding-top: var(--sjs2-spacing-x075, 6px); + border-bottom: none; + } } .sps-table__cell:where(:not(.sps-table__cell--detail-panel)) { .sps-checkbox { @@ -239,4 +254,5 @@ @include sjs2--typography--default; color: var(--sjs2-color-fg-basic-primary, #1C1B20); text-align: center; + height: 300px; } \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index 0bfd17e81b..3acbd45a37 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -32,7 +32,8 @@ display: flex; flex-direction: column; - :has(.sps-question__content--main) { + :has(.sps-question__content--main), + :has(.sps-panel__content--main) { max-height: 100%; height: 0; flex-grow: 1; @@ -51,6 +52,13 @@ overflow: auto; } +.sps-panel__content--main { + max-height: 100%; + &> .sps-row { + max-height: 100%; + } +} + .sps-container { width: 100%; height: 100%; @@ -86,6 +94,11 @@ .sps-action-title-bar { margin-inline-end: var(--ctr-data-table-border-width, var(--sjs-stroke-x1)); padding-inline-end: var(--ctr-caption-with-actions-actionbar-padding-right, calcSize(0.5)); + + &.sps-action-title-bar { + margin-top: 0; + margin-bottom: 0; + } } .sps-body { @@ -109,8 +122,13 @@ gap: var(--sjs2-spacing-x075, 6px); align-self: stretch; border-right: var(--sjs2-border-width-static-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #D4D4D4); + padding-right: 0; &:last-child { border: none; + padding-right: var(--sjs2-spacing-x150, 12px); } } + .sps-question--nested { + overflow-y: scroll; + } } From 281b6dc838d5f1afc9cedea21cb05180f0bb6cc4 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 12 Aug 2025 18:10:03 +0300 Subject: [PATCH 045/240] clean styles #7004 --- .../presets-theme/blocks/sps-buttongroup.scss | 124 ----------------- .../blocks/sps-color-editor.scss | 66 --------- .../presets-theme/blocks/sps-comment.scss | 9 -- .../presets-theme/blocks/sps-file-edit.scss | 3 - .../presets-theme/blocks/sps-link.scss | 14 -- .../presets-theme/blocks/sps-list.scss | 69 ---------- .../presets-theme/blocks/sps-overriding.scss | 17 --- .../blocks/sps-question-group.scss | 10 -- .../blocks/sps-search-editor.scss | 54 -------- .../presets-theme/blocks/sps-table.scss | 71 +--------- .../blocks/sps-theme-builder.scss | 126 ------------------ .../src/presets/presets-theme/presets.scss | 10 -- 12 files changed, 4 insertions(+), 569 deletions(-) delete mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-buttongroup.scss delete mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-color-editor.scss delete mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-comment.scss delete mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-file-edit.scss delete mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-link.scss delete mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss delete mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-overriding.scss delete mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question-group.scss delete mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-search-editor.scss delete mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-theme-builder.scss diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-buttongroup.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-buttongroup.scss deleted file mode 100644 index d400d0be53..0000000000 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-buttongroup.scss +++ /dev/null @@ -1,124 +0,0 @@ -@use "../../../variables" as *; - -.sps-button-group { - position: relative; - display: flex; - padding: var(--ctr-button-group-padding, var(--sjs-spacing-x05)); - align-items: center; - align-self: stretch; - box-sizing: border-box; - overflow-x: auto; - - border-radius: var(--ctr-button-group-corner-radius, var(--sjs-corner-radius-x075)); - box-shadow: inset 0 0 0 var(--ctr-button-group-border-width, var(--sjs-stroke-x1)) - var(--ctr-button-group-border-color, var(--sjs-border-10, #dcdcdcff)); - background-color: var(--ctr-button-group-background-color, var(--sjs-layer-3-background-500, #f4f4f4ff)); - - &::after { - content: ""; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - border-radius: var(--ctr-button-group-corner-radius, var(--sjs-corner-radius-x075)); - box-shadow: inset 0 0 0 var(--ctr-button-group-border-width-focused, var(--sjs-stroke-x2)) transparent; - pointer-events: none; - transition: box-shadow $creator-transition-duration; - } -} - -.sps-button-group:focus-within::after { - box-shadow: inset 0 0 0 var(--ctr-button-group-border-width-focused, var(--sjs-stroke-x2)) - var(--ctr-button-group-border-color-focused, var(--sjs-primary-background-500, #19b394ff)); -} - -.sps-button-group__item { - @include ctrDefaultFont; - color: var(--ctr-button-group-item-text-color, var(--sjs-layer-3-foreground-100, #000000e6)); - - display: flex; - padding: var(--ctr-button-group-item-padding-vertical, var(--sjs-spacing-x1)) - var(--ctr-button-group-item-padding-horizontal, var(--sjs-spacing-x2)); - justify-content: center; - align-items: center; - align-self: stretch; - flex-basis: 0; - flex-grow: 1; - - border-radius: var(--ctr-button-group-item-corner-radius, var(--sjs-corner-radius-x075)); - box-shadow: inset 0 0 0 var(--ctr-button-group-item-border-width, 0px) - var(--ctr-button-group-item-border-color, var(--sjs-border-10, #dcdcdcff)); - background-color: var(--ctr-button-group-item-background-color, var(--sjs-layer-3-background-500, #f4f4f4ff)); - - transition: - background $creator-transition-duration, - background-color $creator-transition-duration, - color $creator-transition-duration; - - &:not(:last-of-type) { - margin-right: var(--ctr-button-group-gap, var(--sjs-spacing-x05)); - } -} - -.sps-button-group__item--hover:hover { - background-color: var(--ctr-button-group-item-background-color-hovered, var(--sjs-layer-3-background-400, #eaeaeaff)); -} - -.sps-button-group__item-icon { - use { - fill: var(--ctr-button-group-item-icon-color, var(--sjs-layer-3-foreground-75, #000000bf)); - } -} - -.sps-button-group__item--selected { - @include ctrDefaultBoldFont; - color: var(--ctr-button-group-item-text-color-selected, var(--sjs-primary-background-500, #19b394ff)); - box-shadow: inset 0 0 0 var(--ctr-button-group-item-border-width-selected, var(--sjs-stroke-x1)) - var(--ctr-button-group-item-border-color, var(--sjs-border-10, #dcdcdcff)); - background: var(--ctr-button-group-item-background-color-selected, var(--sjs-layer-1-background-500, #ffffffff)); - .sps-button-group__item-icon use { - fill: var(--ctr-button-group-item-icon-color-selected, var(--sjs-primary-background-500, #19b394ff)); - } -} - -.sps-button-group__item-decorator { - display: flex; - align-items: center; - white-space: nowrap; -} - -.sps-button-group__item-caption { - display: block; -} -.sps-question--disabled .sps-button-group { - background: var(--ctr-button-group-background-color-disabled, var(--sjs-layer-1-background-500, #ffffffff)); -} - -.sps-button-group__item--disabled { - color: var(--ctr-button-group-item-text-color-disabled, var(--sjs-layer-3-foreground-100, #000000e6)); - background: var(--ctr-button-group-item-background-color-disabled, var(--sjs-layer-1-background-500, #ffffffff)); - .sps-button-group__item-icon use { - fill: var(--ctr-button-group-item-text-color-disabled, var(--sjs-layer-3-foreground-100, #000000e6)); - } - .sps-button-group__item-caption { - opacity: var(--ctr-button-group-item-text-opacity-disabled, 0.25); - color: var(--ctr-button-group-item-text-color-disabled, var(--sjs-layer-3-foreground-100, #000000e6)); - } - &:hover { - background-color: var( - --ctr-button-group-item-background-color-disabled, - var(--sjs-layer-1-background-500, #ffffffff) - ); - } -} - -.sps-button-group__item--selected.sps-button-group__item--disabled { - @include ctrDefaultFont; - box-shadow: inset 0 0 0 var(--ctr-button-group-item-border-width-selected-disabled, 0px) - var(--ctr-button-group-item-border-color, var(--sjs-border-10, #dcdcdcff)); - background: var( - --ctr-button-group-item-background-color-selected-disabled, - var(--sjs-layer-1-background-400, #f5f5f5ff) - ); -} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-color-editor.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-color-editor.scss deleted file mode 100644 index 1008890417..0000000000 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-color-editor.scss +++ /dev/null @@ -1,66 +0,0 @@ -@use "../../../variables" as *; - -.sps-color-editor__color-input { - position: absolute; - height: 1px; - width: 1px; - overflow: hidden; - clip: rect(1px 1px 1px 1px); - /* IE6, IE7 */ - clip: rect(1px, 1px, 1px, 1px); - left: 0; - top: 100%; - transform: translateY(-50%); -} - -.svc-list__item-body { - // display: flex; - // gap: var(--ctr-list-item-gap, var(--sjs-spacing-x2)); - // padding: var(--ctr-list-item-padding-top-with-icon, var(--sjs-spacing-x150)) var(--ctr-list-item-padding-right, var(--sjs-spacing-x6)) - // var(--ctr-list-item-padding-bottom-with-icon, var(--sjs-spacing-x150)) var(--ctr-list-item-padding-left, var(--sjs-spacing-x2)); - - .sps-color-editor__color-swatch { - margin-left: 0; - flex: 0 1 auto; - } -} - -.sps-color-editor__color-swatch { - position: relative; - flex-shrink: 0; - flex-grow: 0; - border-radius: var(--ctr-list-item-color-swatch-corner-radius, var(--sjs-corner-radius-x05)); - width: var(--ctr-list-item-color-swatch-width, var(--sjs-font-size-x4)); - height: var(--ctr-list-item-color-swatch-height, var(--sjs-font-size-x3)); - box-sizing: border-box; - border: 1px solid var(--ctr-list-item-color-swatch-border-color, var(--sjs-border-25-overlay, #00000026)); - margin-left: var(--ctr-editor-color-swatch-margin-left, var(--sjs-spacing-x150)); - - .sv-svg-icon { - position: absolute; - width: var(--ctr-editor-color-swatch-icon-width, var(--sjs-font-size-x2)); - height: var(--ctr-editor-color-swatch-icon-height, var(--sjs-font-size-x2)); - left: 50%; - top: 50%; - transform: translate(-50%, -50%); - fill: var(--ctr-editor-color-swatch-icon-color-stroke, #00000040); - } -} -.sps-question--disabled .sps-color-editor { - background-color: var(--ctr-editor-background-color-disabled, var(--sjs-layer-1-background-500, #ffffffff)); -} -.sps-color-editor__color-swatch--disabled { - .sv-svg-icon { - opacity: 0.25; - } -} - -.sps-color-editor__color-swatch--default { - .sv-svg-icon { - opacity: 1; - } -} - -.sps-color-editor .sps-color-editor__button-wrapper + * { - margin-inline-end: calc(0px - var(--ctr-editor-gap, var(--sjs-spacing-x05))); -} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-comment.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-comment.scss deleted file mode 100644 index 7e76246796..0000000000 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-comment.scss +++ /dev/null @@ -1,9 +0,0 @@ -@use "../../../variables" as *; - -.sps-comment { - height: auto; - max-width: 100%; - min-width: calcSize(6); - min-height: calcSize(6); - line-height: calcSize(3); -} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-file-edit.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-file-edit.scss deleted file mode 100644 index 12624dd53c..0000000000 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-file-edit.scss +++ /dev/null @@ -1,3 +0,0 @@ -.sps-file-edit__choose-button { - position: relative; -} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-link.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-link.scss deleted file mode 100644 index 9caad34a55..0000000000 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-link.scss +++ /dev/null @@ -1,14 +0,0 @@ -@use "../../../variables.scss" as *; - -.sps-link { - display: flex; -} - -.sv-string-viewer { - .sps-link { - display: initial; - color: var(--ctr-survey-action-button-text-color-positive, var(--sjs-primary-background-500, #19b394ff)); - font-weight: 600; - text-decoration-line: underline; - } -} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss deleted file mode 100644 index 3990a38acf..0000000000 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss +++ /dev/null @@ -1,69 +0,0 @@ -@use "../../../variables" as *; -@use "../fonts" as *; - -.sps-list { - width: 100%; - padding: var(--sjs2-layout-container-drop-vertical, 8px) var(--sjs2-layout-container-drop-horizontal, 8px); - margin: 0; - overflow-y: auto; - list-style-type: none; - - box-sizing: border-box; - - .sps-list__item { - width: 100%; - outline: none; - } - - .sps-list__item-body { - @include sjs2--typography--default; - text-align: start; - color: var(--sjs2-color-fg-basic-primary, #1c1b20); - transition: color $creator-transition-duration; - - display: flex; - flex: 1 0 0; - padding: var(--sjs2-spacing-x150, 12px) var(--sjs2-size-x200, 16px); - - align-items: center; - gap: 8px; - border-radius: var(--sjs2-radius-control-drop-item, 8px); - background: var(--sjs2-color-bg-brand-tertiary, rgba(25, 179, 148, 0)); - - cursor: pointer; - - transition: background-color $creator-transition-duration; - - & > span, - & > sv-ng-string { - flex: 1 0 0; - } - } - - .sps-list__item:disabled, - .sps-list__item--disabled { - opacity: var(--ctr-list-item-opacity-disabled, 0.25); - pointer-events: none; - } - - .sps-list__item:focus, - .sps-list__item:hover, - .sps-list__item--focused, - .sps-list__item--hovered { - & > .sps-list__item-body { - border-radius: var(--sjs2-radius-control-drop-item, 8px); - background: var(--sjs2-color-bg-brand-tertiary-dim, rgba(25, 179, 148, 0.1)); - } - } - - .sps-list__item--selected, - .sps-list__item--selected:hover, - .sps-list__item--selected:focus, - .sps-list__item.sps-list__item--selected:hover { - & > .sps-list__item-body { - @include sjs2--typography--default-strong; - border-radius: var(--sjs2-radius-control-drop-item, 8px); - background: var(--sjs2-color-bg-brand-primary, #19b394); - } - } -} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-overriding.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-overriding.scss deleted file mode 100644 index 94307b63f9..0000000000 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-overriding.scss +++ /dev/null @@ -1,17 +0,0 @@ -.sps-boolean-wrapper--overriding.sps-boolean-wrapper--overriding { - min-width: 0; - flex: 0 0 max-content; -} -.sps-link-wrapper--overriding { - align-self: end; - .svc-action-button { - text-decoration: underline; - padding: 0; - border: none; - margin: 0; - &:focus, - &:hover { - background-color: transparent; - } - } -} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question-group.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question-group.scss deleted file mode 100644 index 6e5cbe13e0..0000000000 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question-group.scss +++ /dev/null @@ -1,10 +0,0 @@ -@use "../../../variables.scss" as *; - -.sps-question-group { - .sps-row { - margin-top: 0; - &:not(:first-of-type) { - margin-top: calcSize(1); - } - } -} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-search-editor.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-search-editor.scss deleted file mode 100644 index 63c75a7363..0000000000 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-search-editor.scss +++ /dev/null @@ -1,54 +0,0 @@ -@use "../../../variables.scss" as *; - -.svc-side-bar { - .svc-search { - border-bottom: 1px solid var(--ctr-property-grid-search-border-color, var(--sjs-border-10, #dcdcdcff)); - background: var(--ctr-property-grid-search-background-color, var(--sjs-layer-3-background-500, #f4f4f4ff)); - gap: var(--ctr-property-grid-search-gap, var(--sjs-spacing-x1)); - - padding: var(--ctr-property-grid-search-padding-top, var(--sjs-spacing-x2)) - var(--ctr-property-grid-search-padding-right, var(--sjs-spacing-x2)) - var(--ctr-property-grid-search-padding-bottom, var(--sjs-spacing-x2)) - var(--ctr-property-grid-search-padding-left, var(--sjs-spacing-x2)); - } - - .svc-search__input { - color: var(--ctr-property-grid-search-text-color, var(--sjs-layer-3-foreground-100, #000000e6)); - } - - .svc-search__input::placeholder { - color: var(--ctr-property-grid-search-text-color-placeholder, var(--sjs-layer-3-foreground-50, #00000080)); - } - - .svc-search__bar-item:not(.sv-action-bar-item--pressed) { - &:hover:enabled, - &:focus:enabled { - background-color: var( - --ctr-property-grid-search-button-background-color-hovered, - var(--sjs-layer-3-background-400, #eaeaeaff) - ); - } - } - - .svc-search__toolbar .sv-action-bar-item__icon use { - fill: var(--ctr-property-grid-search-button-icon-color, var(--sjs-layer-3-foreground-50, #00000080)); - } - - .svc-search__toolbar-counter { - color: var(--ctr-property-grid-search-count-text-color, var(--sjs-layer-3-foreground-50, #00000080)); - } - - .svc-search__search-icon { - width: var(--ctr-property-grid-search-icon-width, var(--sjs-font-size-x3)); - height: var(--ctr-property-grid-search-icon-height, var(--sjs-font-size-x3)); - - .sv-svg-icon { - width: var(--ctr-property-grid-search-icon-width, var(--sjs-font-size-x3)); - height: var(--ctr-property-grid-search-icon-height, var(--sjs-font-size-x3)); - - use { - fill: var(--ctr-property-grid-search-icon-color, var(--sjs-layer-3-foreground-50, #00000080)); - } - } - } -} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss index 326c066c14..9024f796bf 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -91,53 +91,15 @@ .sps-input { appearance: none; box-shadow: none; - border-radius: var(--ctr-data-table-cell-corner-radius-focused, var(--sjs-corner-radius-x075)); + border-radius: var(--sjs2-radius-semantic-form, 8px); + border: var(--sjs2-border-width-focused, 2px) solid transparent; background-color: transparent; height: auto; - padding: var(--ctr-data-table-cell-padding-top, var(--sjs-spacing-x1)) - var(--ctr-data-table-cell-padding-right, var(--sjs-spacing-x1)) - var(--ctr-data-table-cell-padding-bottom, var(--sjs-spacing-x1)) - var(--ctr-data-table-cell-padding-left, var(--sjs-spacing-x1)); - - &[type="color"] { - padding-right: 0; - } + padding: calc(var(--sjs2-spacing-x100, 8px) - var(--sjs2-border-width-focused, 2px)); &:focus, &:focus-within { - box-shadow: inset 0 0 0 2px - var(--ctr-data-table-cell-border-color-focused, var(--sjs-primary-background-500, #19b394ff)); - } - } - - .sps-dropdown { - width: max-content; - min-height: auto; - } - - .sps-dropdown_chevron-button { - position: static; - } - .sps-dropdown_select-wrapper { - display: flex; - align-items: center; - width: max-content; - max-width: 100%; - } - - .sps-dropdown__value { - margin: 0; - } - - .sd-editor-button-item { - padding: 0; - } - - .sv-editor-button-item__icon { - opacity: var(--ctr-data-table-cell-drop-down-arrow-opacity, 0.5); - - use { - fill: var(--ctr-data-table-cell-drop-down-arrow-color, var(--sjs-layer-1-foreground-50, #00000080)); + border-color: var(--sjs2-color-border-brand-primary, #19B394); } } } @@ -165,31 +127,6 @@ // cursor: move; // } -.sps-table__cell--header { - background: var(--ctr-data-table-row-background-color-header, var(--sjs-layer-3-background-500, #f4f4f4ff)); - text-align: left; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - max-width: 100px; - padding: var(--ctr-data-table-row-padding-top-header, var(--sjs-spacing-x1)) - var(--ctr-data-table-cell-padding-right, var(--sjs-spacing-x1)) - var(--ctr-data-table-row-padding-bottom-header, var(--sjs-spacing-x1)) - var(--ctr-data-table-cell-padding-left, var(--sjs-spacing-x1)); - - @include ctrSmallFont; - color: var(--ctr-data-table-cell-text-color-header, var(--sjs-layer-3-foreground-50, #00000080)); - - span { - display: none; - } - - .sv-string-viewer { - display: inline; - white-space: unset; - } -} - .sps-table__row--leave, .sps-table__row--enter { animation-name: empty; diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-theme-builder.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-theme-builder.scss deleted file mode 100644 index 8d75b35851..0000000000 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-theme-builder.scss +++ /dev/null @@ -1,126 +0,0 @@ -@use "../../../variables.scss" as *; - -.sps-theme-builder-root { - .sv-skeleton-element { - min-height: 50px; - } - - .sps-paneldynamic__separator { - border: none; - margin: 0; - height: calcSize(1); - } - .sps-paneldynamic__footer { - .sps-paneldynamic__separator { - display: none; - } - } - .sps-paneldynamic__buttons-container { - display: flex; - justify-content: center; - .sps-action-bar { - margin: 0; - } - } - - .sps-panel__footer { - justify-content: center; - margin: calcSize(1) 0 0 0; - padding: 0; - } - .sps-panel__content .sps-row.sps-row { - animation: none; - } - - .sps-paneldynamic__add-btn { - margin: 0 auto; - } - - .sv-button-group { - overflow: hidden; - } - - //2 level nested - .sps-panel-by-page, - .sps-nested-panel { - padding-bottom: calcSize(5); - - &::after { - content: " "; - display: block; - position: relative; - left: calcSize(-4); - top: calc(5 * #{$base-unit}); - width: calc(8 * #{$base-unit} + 100%); - height: 1px; - background-color: var(--ctr-editor-border-color, var(--sjs-border-10, #dcdcdcff)); - } - } - - .sps-panel-by-page__content > .sps-row:first-of-type, - .sps-nested-panel__content > .sps-row:first-of-type { - margin-top: 0; - } - - .sps-panel-by-page.sps-panel--hidden-border, - .sps-row:last-of-type > div > .sps-panel-by-page, - .sps-paneldynamic__panel-wrapper > .sps-nested-panel, - .sps-row:last-of-type > div > .sps-nested-panel { - padding-bottom: 0; - - &::after { - content: none; - } - } - - .sps-panel-by-page.sps-panel--padding { - padding-top: calcSize(2); - padding-bottom: calcSize(3); - } - - .sps-theme-group-caption { - @include ctrDefaultBoldFont; - color: var(--ctr-property-grid-group-caption-text-color, var(--sjs-layer-1-foreground-100, #000000e6)); - - position: relative; - top: calc(4 * #{$base-unit}); - padding: calc(1 * #{$base-unit}) 0; - cursor: auto; - } - - .sv-theme-group_title-action .sps-action-button:hover, - .sv-theme-group_title-action .sps-action-button:focus { - background-color: unset; - } - - .sd-panel__header.sd-element__header .sps-action-bar { - pointer-events: none; - } - - .sps-header { - margin-top: calcSize(-2); - } - - .sd-question--title-top .sps-paneldynamic { - --thm-ctr-editor-layout-gap: var(--ctr-editor-layout-gap, var(--sjs-spacing-x1)); - margin-top: calc(-1 * var(--thm-ctr-editor-layout-gap)); - } - - .sps-question.sps-row__question:not(.sd-question--title-top):not(.sps-question--boolean), - .sps-question__content-coloralpha { - --thm-ctr-property-grid-form-gap: var(--ctr-property-grid-form-gap, var(--sjs-spacing-x2)); - --thm-ctr-editor-layout-gap: var(--ctr-editor-layout-gap, var(--sjs-spacing-x1)); - margin-top: calc(var(--thm-ctr-editor-layout-gap) - var(--thm-ctr-property-grid-form-gap)); - } - - .sps-question-composite__content .sps-row:first-of-type { - margin-top: var(--ctr-editor-layout-gap, var(--sjs-spacing-x1)); - } -} - -.svc-side-bar--mobile .sps-theme-builder-root { - .sps-nested-panel__content::after { - width: calc(4 * var(--sjs-base-unit, var(--base-unit, 8px)) + 100%); - left: calc(-2 * var(--sjs-base-unit, var(--base-unit, 8px))); - } -} diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index 3acbd45a37..d36cddb940 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -4,20 +4,10 @@ @use "blocks/sps-question.scss"; @use "blocks/sps-input.scss"; @use "blocks/sps-dropdown.scss"; -@use "blocks/sps-comment.scss"; @use "blocks/sps-panel.scss"; @use "blocks/sps-checkbox.scss"; @use "blocks/sps-matrixdynamic.scss"; @use "blocks/sps-table.scss"; -@use "blocks/sps-question-group.scss"; -@use "blocks/sps-color-editor.scss"; -@use "blocks/sps-file-edit.scss"; -@use "blocks/sps-link"; -@use "blocks/sps-theme-builder.scss"; -@use "blocks/sps-overriding.scss"; -@use "blocks/sps-search-editor.scss"; -@use "blocks/sps-buttongroup.scss"; -@use "blocks/sps-list.scss"; .sps-root-modern { position: relative; From 453d41ec18418bde05f63a7a56cdcd653ab054ca Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 12 Aug 2025 22:39:06 +0300 Subject: [PATCH 046/240] #7004 - remove unused classes --- .../src/presets/presets-theme/presets.ts | 191 +----------------- 1 file changed, 1 insertion(+), 190 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.ts b/packages/survey-creator-core/src/presets/presets-theme/presets.ts index 4111afd0c1..57a234833d 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.ts +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.ts @@ -118,14 +118,6 @@ export var presetsCss = { confirmDialog: "sps-popup--confirm sv-popup--confirm svc-creator-popup", errorsContainerBottom: "sps-question__erbox--below-question", }, - image: { root: "sps-image", image: "sv_image_image" }, - error: { - root: "sps-question__erbox", - icon: "sps-question__erbox-icon", - item: "", - locationTop: "sps-question__erbox--location--top", - locationBottom: "sps-question__erbox--location--bottom" - }, checkbox: { root: "sps-selectbase", item: "sps-item sps-checkbox sps-selectbase__item", @@ -188,14 +180,6 @@ export var presetsCss = { remainingCharacterCounter: "sps-remaining-character-counter", onError: "sps-input--error" }, - multipletext: { - root: "sps-multipletext", - item: "sps-multipletext__item", - itemTitle: "sps-multipletext__item-title", - content: "sps-multipletext__content sps-text__content", - row: "sps-multipletext__row", - cell: "sps-multipletext__cell" - }, dropdown: { root: "sps-selectbase", popup: "sps-dropdown-popup svc-creator-popup", @@ -211,46 +195,6 @@ export var presetsCss = { cleanButton: "sps-dropdown__clean-button sps-input__edit-button", controlReadOnly: "sd-input--disabled sd-input--readonly" }, - buttongroup: { - root: "sd-button-group-scrollable-container sps-button-group", - item: "sps-button-group__item", - itemIcon: "sps-button-group__item-icon", - itemDecorator: "sps-button-group__item-decorator", - itemCaption: "sps-button-group__item-caption", - itemHover: "sps-button-group__item--hover", - itemSelected: "sps-button-group__item--selected", - itemDisabled: "sps-button-group__item--disabled", - itemControl: "sv-visuallyhidden", - readOnly: "sps-question--disabled", - - rootDropdown: "sd-button-group-scrollable-container sd-scrollable-container--compact sd-selectbase", - selectWrapper: "sv-dropdown_select-wrapper sps-dropdown_select-wrapper", - control: "sps-input sps-dropdown sd-input sd-dropdown", - controlEmpty: "sps-dropdown--empty sd-dropdown--empty", - controlValue: "sps-dropdown__value", - controlDisabled: "sps-input--disabled sd-input--disabled", - controlReadOnly: "sps-input--readonly sd-input--readonly", - controlPreview: "sps-input--preview sd-input--preview", - filterStringInput: "sd-dropdown__filter-string-input sps-dropdown__filter-string-input", - chevronButton: "sd-dropdown_chevron-button sps-dropdown_chevron-button", - chevronButtonSvg: "sd-dropdown_chevron-button-svg sps-dropdown_chevron-button-svg", - chevronButtonIconId: "icon-chevron", - popup: "sps-dropdown-popup svc-creator-popup", - }, - imagepicker: { - root: "sps-imagepicker", - item: "sps-imagepicker__item", - itemInline: "sps-imagepicker__item--inline", - itemChecked: "sps-imagepicker__item--checked", - itemReadOnly: "sps-imagepicker__item--disabled", - itemHover: "sps-imagepicker__item--allowhover", - label: "sps-imagepicker__label", - itemControl: "sps-imagepicker__control", - image: "sps-imagepicker__image", - itemText: "sps-imagepicker__text", - clearButton: "sps-btn", - other: "sps-comment sps-question__other" - }, matrix: { tableWrapper: "sps-matrix sps-table-wrapper", root: "sps-table", @@ -313,95 +257,7 @@ export var presetsCss = { rowEnter: "sps-table__row--enter", rowLeave: "sps-table__row--leave", }, - rating: { - root: "sps-rating", - item: "sps-rating__item", - selected: "sps-rating__item--selected", - minText: "sps-rating__min-text", - itemText: "sps-rating__item-text", - maxText: "sps-rating__max-text", - readOnly: "sps-rating--disabled" - }, - comment: { - root: "sps-input sps-comment", - content: "sps-question__content sps-comment__content", - remainingCharacterCounter: "sps-remaining-character-counter", - small: "sps-row__question--small", - onError: "sps-input--error" - }, - expression: "", - file: { - root: "sps-file", - other: "sps-comment sps-question__other", - placeholderInput: "sps-visuallyhidden", - preview: "sps-file__preview", - fileSign: "sps-hidden", - fileSignBottom: "sps-file__sign", - fileDecorator: "sps-file__decorator", - fileInput: "sps-visuallyhidden", - noFileChosen: "sps-description sps-file__no-file-chosen", - chooseFile: "sps-btn sps-file__choose-btn", - readOnly: "sps-file__choose-btn--disabled", - removeButton: "sps-hidden", - removeButtonBottom: "sps-btn sps-file__clean-btn", - removeFile: "sps-hidden", - removeFileSvg: "sps-file__remove-svg", - wrapper: "sps-file__wrapper" - }, - signaturepad: { - root: "sps-signaturepad sjs_sp_container", - small: "sps-row__question--small", - controls: "sjs_sp_controls", - clearButton: "sjs_sp_clear" - }, - propertygrid_bindings: { - content: "sps-question__content sps-question__nopadding sps-question-group" - }, - propertygrid_restfull: { - content: "sps-question__content sps-question__nopadding sps-restfull" - }, - propertygrid_masksettings: { - content: "sps-question__content sps-question__nopadding sps-masksettings" - }, - propertygrid_header: { - mainRoot: "sps-header", - content: "sps-question__content sps-question__nopadding" - }, - coloralpha: { - content: "sps-question__content sps-question__nopadding sps-question__content-coloralpha" - }, - font: { - content: "sps-question__content sps-question__nopadding sps-question-composite__content" - }, - backgroundcornerradius: { - content: "sps-question__content sps-question__nopadding sps-question-composite__content" - }, - saveData: { - root: "", - saving: "", - error: "", - success: "", - saveAgainButton: "" - }, - window: { - root: "sv_window", - body: "sv_window_content", - header: { - root: "sv_window_title", - title: "", - button: "", - buttonExpanded: "", - buttonCollapsed: "" - } - }, - list: { - root: "sv-list__container sps-list", - item: "sv-list__item sps-list__item", - itemBody: "sv-list__item-body sps-list__item-body", - itemSelected: "sv-list__item--selected sps-list__item--selected", - itemFocused: "sv-list__item--focused sps-list__item--focused", - itemHovered: "sv-list__item--hovered sps-list__item--hovered", - }, + actionBar: { root: "sps-action-bar", item: "sps-action-button", @@ -409,50 +265,5 @@ export var presetsCss = { itemAsIcon: "sps-action-button--icon", itemIcon: "sps-action-button__icon", itemTitle: "sps-action-button__title", - }, - spinedit: { - root: "sps-input sps-spin-editor sps-input-container", - control: "sps-spin-editor__input sps-input-container__input", - buttonsContainer: "sps-input-container__buttons-container", - arrowButton: "sps-input__edit-button", - increaseButtonIcon: "icon-arrow-up", - decreaseButtonIcon: "icon-arrow-down" - }, - color: { - root: "sps-input sps-color-editor sps-input-container", - swatch: "sps-color-editor__color-swatch", - swatchDefault: "sps-color-editor__color-swatch--default", - swatchDisabled: "sps-color-editor__color-swatch--disabled", - colorInput: "sps-color-editor__color-input", - control: "sps-color-editor__input sps-input-container__input", - colorDropdown: "sps-input__edit-button", - colorDropdownIcon: "icon-drop-down-arrow", - swatchIcon: "icon-color-picker", - choicesButtonWrapper: "sps-color-editor__button-wrapper" - }, - textwithreset: { - root: "sps-input sps-input-container", - rootMultiline: "sps-input-container--multiline", - control: "sps-input-container__input", - controlMultiline: "sps-input-container__input sps-comment", - resetButton: "sps-input__edit-button", - resetButtonIcon: "icon-reset", - content: "sps-question__content sps-text__content", - remainingCharacterCounter: "sps-remaining-character-counter", - onError: "sps-input--error" - }, - fileedit: { - root: "sps-input sps-input-container sps-file-edit", - control: "sps-input-container__input", - buttonsContainer: "sps-input-container__buttons-container", - chooseButtonIcon: "icon-choosefile", - clearButtonIcon: "icon-cancel-24x24", - fileInput: "sd-visuallyhidden", - clearButton: "sps-input__edit-button", - chooseButton: "sps-input__edit-button sps-file-edit__choose-button", - chooseButtonDisabled: "sps-input__edit-button--disabled" - }, - linkvalue: { - content: "sps-link" } }; From 82c7865f2ac08075c8b6830224509f1719f9a9a5 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 13 Aug 2025 12:01:57 +0300 Subject: [PATCH 047/240] #7004 fixed appearance --- .../src/components/popup.scss | 1 + .../src/presets/presets-editable-categorized.ts | 13 ++++++++++--- .../src/presets/presets-editable-list.ts | 17 ++++++++++------- .../src/presets/presets-editable-properties.ts | 12 ++++++++++++ .../src/presets/presets-editable-toolbox.ts | 7 +------ .../src/presets/presets-editor.ts | 2 +- .../src/presets/presets-plugin.ts | 2 +- .../presets/presets-theme/blocks/sps-panel.scss | 3 +++ .../src/presets/presets-theme/presets.scss | 4 ++++ 9 files changed, 43 insertions(+), 18 deletions(-) diff --git a/packages/survey-creator-core/src/components/popup.scss b/packages/survey-creator-core/src/components/popup.scss index 39e100bad0..936034627f 100644 --- a/packages/survey-creator-core/src/components/popup.scss +++ b/packages/survey-creator-core/src/components/popup.scss @@ -230,6 +230,7 @@ .svc-creator-popup--large-markers { .svc-list__item-body { padding-inline-end: var(--sjs-spacing-x150, 12px); + gap: var(--sjs-spacing-x6, 48px); } .svc-list-item__marker-icon { padding: 0; diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 5e60e87da3..3d97e020d0 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -1,4 +1,4 @@ -import { FunctionFactory, Helpers, IDialogOptions, ItemValue, MatrixDropdownRowModelBase, MatrixDynamicRowModel, QuestionMatrixDynamicModel, Serializer, settings, SurveyModel } from "survey-core"; +import { FunctionFactory, Helpers, IDialogOptions, ItemValue, MatrixDropdownRowModelBase, MatrixDynamicRowModel, QuestionMatrixDropdownRenderedRow, QuestionMatrixDynamicModel, Serializer, settings, SurveyModel } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; import { QuestionToolboxCategory, QuestionToolboxItem, SurveyCreatorModel, SurveyJSON5, editorLocalization } from "survey-creator-core"; import { PresetItemValue, QuestionPresetRankingModel } from "./preset-question-ranking"; @@ -42,7 +42,14 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre survey.getAllQuestions().forEach(q => q.visible = q.name != this.nameInnerMatrix); } } - + protected setupQuestionsCore(model: SurveyModel, creatorSetup: ICreatorPresetEditorSetup): void { + this.getQuestionCategories(model).onCreateDetailPanelRenderedRowCallback = ( + renderedRow: QuestionMatrixDropdownRenderedRow + ) => { + renderedRow.cells = [renderedRow.cells[1]]; + renderedRow.cells[0].colSpans += 2; + }; + } protected getQuestionCategories(model: SurveyModel): QuestionMatrixDynamicModel { return model.getQuestionByName(this.nameCategories); } protected isItemsMatrix(question: QuestionMatrixDynamicModel): boolean { @@ -129,7 +136,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre a.visibleIndex = 20; a.component = "sv-action-bar-item"; a.action = () => options.question.removeRowUI(options.row); - a.iconName = options.question.name == this.nameMatrix ? "icon-add_24x24" : "icon-remove_24x24"; + a.iconName = "icon-delete_24x24"; } }); } diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index f1be449436..4bb7349027 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -52,13 +52,16 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { protected onGetMatrixRowActionsCore(model: SurveyModel, creator: SurveyCreatorModel, options: any): void { if (this.isItemsMatrix(options.question)) { const iconName = options.question.value?.filter(v => v.name == options.row.getValue("name"))[0]?.iconName; - options.actions.push({ - id: iconName, - iconName: iconName, - innerCss: "sps-matrixdynamic__row-icon", - location: "start", - enabled: false - }); + if (iconName) { + options.actions.push({ + id: iconName, + iconName: iconName, + innerCss: "sps-matrixdynamic__row-icon", + location: "start", + enabled: false + }); + + } options.question.cssClasses.detailIconExpandedId = "icon-edit"; options.question.cssClasses.detailIconId = "icon-edit"; diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 4d31525583..0fab7ba122 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -294,6 +294,17 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare }) ] }, + { + type: "panel", + title: " ", + name: this.navigationPanelName, + elements: [ + { + type: "html", + html: " " + } + ] + } ] }; @@ -306,6 +317,7 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare } protected setupQuestionsCore(model: SurveyModel, creatorSetup: ICreatorPresetEditorSetup): void { + super.setupQuestionsCore(model, creatorSetup); this.getSelector(model).choices = this.getSelectorChoices(creatorSetup.creator); const oldSearchValue = settings.propertyGrid.enableSearch; settings.propertyGrid.enableSearch = false; diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 952e529695..280c989195 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -240,12 +240,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita } protected setupQuestionsCore(model: SurveyModel, creatorSetup: ICreatorPresetEditorSetup): void { - this.getQuestionCategories(model).onCreateDetailPanelRenderedRowCallback = ( - renderedRow: QuestionMatrixDropdownRenderedRow - ) => { - renderedRow.cells = [renderedRow.cells[1]]; - renderedRow.cells[0].colSpans += 2; - }; + super.setupQuestionsCore(model, creatorSetup); this.setupPageQuestions(model, creatorSetup.creator); } private setupPageQuestions(model: SurveyModel, creator: SurveyCreatorModel): void { diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index bc3e52ea94..132f5a83c4 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -89,7 +89,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit model.css = presetsCss; model.editablePresets = editablePresets; model.keepIncorrectValues = true; - model.showPrevButton = false; + model.showCompleteButton = false; model.showNavigationButtons = false; model.fitToContainer = false; model.registerFunctionOnPropertyValueChanged("isShowNextButton", () => { diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 649b1ac435..6dd4be5941 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -42,7 +42,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { presets.forEach(p => { p.action = (item)=>{ presetsList.selectedItem = item; - settingsAction.popupModel.show(); + //settingsAction.popupModel.show(); this.model.model.currentPage = this.model.model.getPageByName(item.id); }; }); diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss index c64b657d66..51c0521a4f 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss @@ -32,6 +32,9 @@ .sps-question__content { padding: 0; } + .sps-row--multiple .sps-question--nested { + overflow-y: visible; + } } .sps-panel__header { width: 100%; diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index d36cddb940..4d90ba5972 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -84,6 +84,10 @@ .sps-action-title-bar { margin-inline-end: var(--ctr-data-table-border-width, var(--sjs-stroke-x1)); padding-inline-end: var(--ctr-caption-with-actions-actionbar-padding-right, calcSize(0.5)); + gap: var(--sjs2-spacing-x150, 12px); + .sv-action--hidden { + display: none; + } &.sps-action-title-bar { margin-top: 0; From a1452344f97aa56538f9e0fc7d5a8f0c5eb1dc46 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 13 Aug 2025 12:53:52 +0300 Subject: [PATCH 048/240] #7004 - fixed tests --- .../src/presets/presets-editable-tabs.ts | 2 +- .../src/presets/presets-editable-toolbox.ts | 2 +- .../tests-presets/presets-editor.tests.ts | 7 +------ 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index b6a50258ed..e184e22d03 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -153,7 +153,7 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { protected setupQuestionsValueCore(model: SurveyModel, json: any, creator: SurveyCreatorModel): void { json = json || {}; - let items = json["items"] || []; + let items = (json["items"] || []).map(i => typeof i === "string" ? { name: i } : i); const tabNames = creator.tabbedMenu.actions.map(a => a.id); const allTabs = this.getAllTabs(creator); diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 280c989195..bbb636154d 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -186,7 +186,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita for (let i = 0; i < categories.length; i++) { if (categories[i].category !== toolboxCategories[i].name) return false; if (categories[i].title !== toolboxCategories[i].title) return false; - const toolboxItems = toolboxCategories[i].items?.map(item => item.name); + const toolboxItems = toolboxCategories[i].items; const categoryItems = categories[i].items; if (!Helpers.isTwoValueEquals(categoryItems, toolboxItems)) return false; } diff --git a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts index 6b5dd7473e..8f420a6537 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts @@ -111,7 +111,7 @@ test("Preset edit model, tabs page with creator, default items", () => { const survey = editor.model; const itemsQuestion = survey.getQuestionByName("tabs_items"); const defultTabs = JSON.parse(JSON.stringify(itemsQuestion.value)); - expect(defultTabs).toEqual(["designer", "logic"]); + expect(defultTabs.map(t => t.name)).toEqual(["designer", "logic"]); const activeTabQuestion = survey.getQuestionByName("tabs_activeTab"); expect(activeTabQuestion.value).toEqual("logic"); }); @@ -348,11 +348,6 @@ test("Preset edit model, property grid, setup", () => { expect(checkSelectorChoice("empty")).toBeFalsy(); expect(checkSelectorChoice("nonvalue")).toBeFalsy(); expect(checkSelectorChoice("textwithbutton")).toBeFalsy(); - selectorQuestion.value = null; - const panel = survey.getPanelByName("propPanel"); - expect(panel.isVisible).toBeFalsy(); - selectorQuestion.value = "survey"; - expect(panel.isVisible).toBeTruthy(); const propGridCategories = survey.getQuestionByName("propertyGrid_categories"); expect(propGridCategories).toBeTruthy(); From ad39be130e53f433ac5d3bc8b29ee44c3a3fcc13 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 13 Aug 2025 14:47:11 +0300 Subject: [PATCH 049/240] #7004 - presets default page --- packages/survey-creator-react/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/survey-creator-react/index.js b/packages/survey-creator-react/index.js index 4c1ec69abe..9585b20ecf 100644 --- a/packages/survey-creator-react/index.js +++ b/packages/survey-creator-react/index.js @@ -237,7 +237,6 @@ if(window.SurveyCreatorCorePresets) { } creator.activeTab = "presets"; -editor.model.model.currentPageNo = 1; ReactDOM.render( From 7ce9dd164f67410af780835857b4f597381345b9 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 13 Aug 2025 16:26:57 +0300 Subject: [PATCH 050/240] #7004 - fix scrolling --- .../src/presets/presets-editable-categorized.ts | 1 + .../src/presets/presets-theme/presets.scss | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 3d97e020d0..e871338e7c 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -14,6 +14,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre protected get nameInnerMatrix() { return "items"; } protected get nameCategories() { return this.fullPath + "_categories"; } + public getMainElementName() : any { return this.nameCategories; } //private fillAutoName(question: QuestionMatrixDynamicModel, propName: string) { // question.value?.filter(v =>v.isDefault === false && !v[propName]).forEach(v => v[propName] = this.replaceNonLettersWithDash(v.title)); //} diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index 4d90ba5972..7d195cbe8d 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -36,6 +36,12 @@ .sv-components-row > .sv-components-column--expandable { width: 100%; } + .sps-row--multiple { + flex-direction: row; + &>div { + height: auto; + } + } } } .sps-question__content--main { @@ -122,7 +128,7 @@ padding-right: var(--sjs2-spacing-x150, 12px); } } - .sps-question--nested { + .sps-question--nested > .sps-question__content--main { overflow-y: scroll; } } From 60909ab3e9d42bddfb5bf03bc21c7c60a7ea8e01 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 13 Aug 2025 17:03:46 +0300 Subject: [PATCH 051/240] #7004 - boolean switch --- .../src/custom-questions/BooleanSwitch.tsx | 4 ++-- .../survey-creator-vue/src/custom-questions/BooleanSwitch.vue | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/survey-creator-react/src/custom-questions/BooleanSwitch.tsx b/packages/survey-creator-react/src/custom-questions/BooleanSwitch.tsx index 608ff48ed6..1038c9adcc 100644 --- a/packages/survey-creator-react/src/custom-questions/BooleanSwitch.tsx +++ b/packages/survey-creator-react/src/custom-questions/BooleanSwitch.tsx @@ -3,7 +3,7 @@ import { type QuestionBooleanModel, RendererFactory } from "survey-core"; import { attachKey2click, ReactQuestionFactory, SurveyElementBase, SurveyQuestionElementBase } from "survey-react-ui"; export class SurveyQuestionBooleanSwitch extends SurveyQuestionElementBase { protected renderElement(): React.JSX.Element { - const button = attachKey2click(
, this.questionBase, { processEsc: false }); return ( -
this.questionBase.value = !this.questionBase.value}> +
this.questionBase.booleanValue = !this.questionBase.booleanValue}> {button}
diff --git a/packages/survey-creator-vue/src/custom-questions/BooleanSwitch.vue b/packages/survey-creator-vue/src/custom-questions/BooleanSwitch.vue index 07be5aeb0f..e9e62fea55 100644 --- a/packages/survey-creator-vue/src/custom-questions/BooleanSwitch.vue +++ b/packages/survey-creator-vue/src/custom-questions/BooleanSwitch.vue @@ -49,11 +49,11 @@ useQuestion(props, root); const renderedValue = computed({ get() { - return props.question.value; + return props.question.booleanValue; }, set(val) { const question = props.question; - question.value = val; + question.booleanValue = val; }, }); From 5e82f065a316517bb8a1da1a3a91748a3781fa4b Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 13 Aug 2025 17:55:55 +0300 Subject: [PATCH 052/240] #7004 - fix paddings --- .../src/presets/presets-theme/blocks/sps-panel.scss | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss index 51c0521a4f..e57f25edac 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss @@ -32,8 +32,14 @@ .sps-question__content { padding: 0; } - .sps-row--multiple .sps-question--nested { - overflow-y: visible; + .sps-row--multiple { + & > div { + padding: 0; + border: none; + } + .sps-question--nested { + overflow-y: visible; + } } } .sps-panel__header { From e5c3cf9f4f567fa7253249b25a7b2b3169addaf5 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 13 Aug 2025 18:38:40 +0300 Subject: [PATCH 053/240] #7004 - toolbox no categories --- .../src/presets/presets-editable-toolbox.ts | 2 ++ .../tests-presets/presets-editor-toolbox.tests.ts | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index bbb636154d..6adc060974 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -170,6 +170,8 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita if (Array.isArray(categories) && categories.length > 0 && (!toolbox.hasCategories || !this.isCategoriesSame(categories, toolboxCategories))) { res.categories = this.getCategoriesJson(model); } + } else { + res.categories = []; } if (model.getValue(this.nameShowCategoryTitles)) { res.showCategoryTitles = true; diff --git a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts index ad1501a0db..af80384586 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts @@ -50,6 +50,14 @@ test("Preset edit, toolbox - remove whole category from categories", () => { expect(editor.json.toolbox.categories.length).toBe(4); }); +test("Preset edit, toolbox - no categories", () => { + const editor = new CreatorPresetEditorModel(); + const survey = editor.model; + survey.getQuestionByName("toolbox_mode").value = "items"; + expect(editor.json.toolbox).toBeDefined(); + expect(editor.json.toolbox.categories.length).toBe(0); +}); + test("Preset edit, toolbox - remove item from flat items", () => { const editor = new CreatorPresetEditorModel(); const survey = editor.model; From e0b1cad6ece7ed35401c8cfda87a1fbfa03e84d3 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 14 Aug 2025 11:24:33 +0300 Subject: [PATCH 054/240] #7004 fix no categories toolbox --- .../src/presets-creator/presets-toolbox.ts | 8 ++++- .../tests/presets.tests.ts | 36 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts b/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts index 218c3eaa99..62fd94cdc7 100644 --- a/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts +++ b/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts @@ -52,7 +52,7 @@ export class CreatorPresetToolboxConfigurator extends CreatorPresetBase { super.applyCore(creator); creator.toolbox.showCategoryTitles = this.json.showCategoryTitles; const items = this.json["definition"]; - const itemNames = items?.map(i => i.name) || []; + const itemNames = items?.map(i => i.name); let categories = this.json["categories"]; if (!categories) { categories = creator.toolbox.categories @@ -60,6 +60,12 @@ export class CreatorPresetToolboxConfigurator extends CreatorPresetBase { category: c.name, items: c.items?.map(i => i.name).filter(name => !itemNames || itemNames.indexOf(name) != -1) })).filter(c => c.items.length > 0); + } else if (categories.length === 0) { + const category = { + category: "general", + items: itemNames || creator.toolbox.itemNames + }; + categories = [category]; } creator.toolbox.defineCategories(categories); } diff --git a/packages/survey-creator-core/tests/presets.tests.ts b/packages/survey-creator-core/tests/presets.tests.ts index 24c361c5a0..320ff32c52 100644 --- a/packages/survey-creator-core/tests/presets.tests.ts +++ b/packages/survey-creator-core/tests/presets.tests.ts @@ -134,6 +134,42 @@ test("set toolbox definition", () => { expect(actions[1].title).toEqual("Date"); expect(actions[1].json.inputType).toEqual("date"); }); + +test("set toolbox definition - no categories", () => { + const creator = new CreatorTester(); + const preset = new CreatorPreset({ + toolbox: { + definition: [ + { name: "text-number", title: "Number", json: { type: "text", inputType: "number" } }, + { name: "text-date", title: "Date", json: { type: "text", inputType: "date" } }, + { name: "dropdown" }, + { name: "matrix" }, + ], + categories: [] + } + }); + preset.apply(creator); + const tb = creator.toolbox; + tb.flushUpdates(); + const actions = tb.visibleActions; + expect(tb.categories).toHaveLength(1); + expect(tb.visibleActions).toHaveLength(4); +}); + +test("set toolbox definition - no categories, no definition", () => { + const creator = new CreatorTester(); + const preset = new CreatorPreset({ + toolbox: { + categories: [] + } + }); + preset.apply(creator); + const tb = creator.toolbox; + tb.flushUpdates(); + expect(tb.categories).toHaveLength(1); + expect(tb.visibleActions.length).toBeGreaterThan(0); +}); + test("Override toolbox JSON", () => { const creator = new CreatorTester(); const preset = new CreatorPreset({ From baef970af358f1ede9f2039bd11d584bea1cfc77 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 14 Aug 2025 14:07:35 +0300 Subject: [PATCH 055/240] #7004 fix build --- packages/survey-creator-react/webpack.presets.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-react/webpack.presets.config.js b/packages/survey-creator-react/webpack.presets.config.js index 2777ed093b..278ca37140 100644 --- a/packages/survey-creator-react/webpack.presets.config.js +++ b/packages/survey-creator-react/webpack.presets.config.js @@ -89,7 +89,7 @@ module.exports = function (options) { path: buildPath, filename: "[name]" + (isProductionBuild ? ".min" : "") + ".js", library: { - root: options.libraryName || "SurveyCreator", + root: options.libraryName || "SurveyCreatorPresets", amd: "[dashedname]", commonjs: "[dashedname]", }, From 29886286c656fc20c15ddae4520af6244c40461a Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 18 Aug 2025 14:52:04 +0300 Subject: [PATCH 056/240] #7004 container scrolling --- .../src/presets/presets-editor.ts | 1 - .../presets-theme/blocks/sps-panel.scss | 3 +++ .../src/presets/presets-theme/presets.scss | 23 ++++++------------- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 132f5a83c4..1f94fd3b82 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -91,7 +91,6 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit model.keepIncorrectValues = true; model.showCompleteButton = false; model.showNavigationButtons = false; - model.fitToContainer = false; model.registerFunctionOnPropertyValueChanged("isShowNextButton", () => { model.setPropertyValue("isShowNextButton", true); }); diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss index e57f25edac..e92eec82d6 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss @@ -22,6 +22,9 @@ padding: var(--sjs2-spacing-x250, 20px); align-items: center; gap: var(--sjs2-spacing-x150, 12px); + border-radius: 0; + border: none; + border-top: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #D4D4D4); .sps-panel__header { width: auto; flex-grow: 1; diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index 7d195cbe8d..16961158ab 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -24,14 +24,11 @@ :has(.sps-question__content--main), :has(.sps-panel__content--main) { - max-height: 100%; - height: 0; flex-grow: 1; display: flex; flex-direction: column; align-self: stretch; align-items: stretch; - height: 0; flex-grow: 1; .sv-components-row > .sv-components-column--expandable { width: 100%; @@ -44,16 +41,6 @@ } } } -.sps-question__content--main { - overflow: auto; -} - -.sps-panel__content--main { - max-height: 100%; - &> .sps-row { - max-height: 100%; - } -} .sps-container { width: 100%; @@ -111,6 +98,13 @@ } } +.sps-row:has(.sps-panel--navigation) { + position: sticky; + margin: calc(-1 * var(--sjs2-spacing-x400, 32px)); + margin-top: 0; + bottom: 0; +} + .sps-row--multiple { display: flex; align-items: stretch; @@ -128,7 +122,4 @@ padding-right: var(--sjs2-spacing-x150, 12px); } } - .sps-question--nested > .sps-question__content--main { - overflow-y: scroll; - } } From eee40e2ec70671a3eb0b111a41db93a8a92cfc2c Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 18 Aug 2025 16:32:12 +0300 Subject: [PATCH 057/240] #7004 - work for Creator parts disabling --- .../src/presets/presets-editable-base.ts | 10 ++++------ .../src/presets/presets-editable-languages.ts | 7 +++---- .../src/presets/presets-editable-properties.ts | 9 ++++----- .../src/presets/presets-editable-tabs.ts | 5 ++--- .../src/presets/presets-editable-toolbox.ts | 8 +++++--- .../src/presets/presets-editor.ts | 13 ++++++++++--- 6 files changed, 28 insertions(+), 24 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index a219a3c8e2..7ce346185f 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -104,12 +104,10 @@ export class CreatorPresetEditableBase { item.setupQuestions(model, creatorSetup); }); } - public setupOnCurrentPage(model: SurveyModel, creator: SurveyCreatorModel): void { - if (model.currentPage.name === this.pageName) { - this.setupOnCurrentPageCore(model, creator); - } + public setupOnCurrentPage(model: SurveyModel, creator: SurveyCreatorModel, active: boolean): void { + this.setupOnCurrentPageCore(model, creator, active); this.children.forEach(item => { - item.setupOnCurrentPage(model, creator); + item.setupOnCurrentPage(model, creator, active); }); } public updateOnValueChanged(model: SurveyModel, name: string): void { @@ -153,7 +151,7 @@ export class CreatorPresetEditableBase { protected setJsonLocalizationStringsCore(model: SurveyModel, locStrs: any): void {} protected updateJsonLocalizationStringsCore(locStrs: any): void {} protected disposeCore(): void {} - protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel): void {} + protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel, active: boolean): void {} protected updateOnValueChangedCore(model: SurveyModel, name: string): void {} protected updateOnMatrixDetailPanelVisibleChangedCore(model: SurveyModel, creator: SurveyCreatorModel, options: any): void {} protected onGetMatrixRowActionsCore(model: SurveyModel, creator: SurveyCreatorModel, options: any): void {} diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index 14962d32a4..d3eb53fdc8 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -126,10 +126,9 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { question.selectAll(); } } - protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel): void { - this.propertyGridSetObj(locPreview); - creator.toolbox.forceCompact = true; - creator.setShowSidebar(true); + protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel, active: boolean): void { + creator.setShowSidebar(active); + this.propertyGridSetObj(active ? locPreview : null); } protected updateOnValueChangedCore(model: SurveyModel, name: string): void { if (name === this.surveyUseEnglishNames) { diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 0fab7ba122..9a36381052 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -339,11 +339,10 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare protected updateJsonLocalizationStringsCore(locStrs: any): void { this.localeStrings = { pe: locStrs.pe || {}, pehelp: locStrs.pehelp || {} }; } - - protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel): void { - this.propertyGridSetObj(this.currentProperties?.getObj()); - creator.toolbox.forceCompact = true; - creator.setShowSidebar(true); + protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel, active: boolean): void { + (creator.getPlugin("designer") as any).tabControlModel.expandCollapseAction.enabled = active; + creator.setShowSidebar(active); + this.propertyGridSetObj(active ? this.currentProperties?.getObj() : null); } // private isPropCreatorChanged: boolean; diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index e184e22d03..fe89719f1a 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -146,9 +146,8 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { return creator.getAvailableTabs().map(t => ({ name: t.name, title: editorLocalization.getString("tabs." + t.name), iconName: t.iconName })); } - protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel): void { - creator.toolbox.forceCompact = false; - creator.setShowSidebar(false); + protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel, active: boolean): void { + creator.tabs.forEach(i => i.enabled = active); } protected setupQuestionsValueCore(model: SurveyModel, json: any, creator: SurveyCreatorModel): void { diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 6adc060974..f47609f551 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -236,9 +236,11 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita super.onMatrixRowRemoving(model, creator, options); } - protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel): void { - creator.toolbox.forceCompact = false; - creator.setShowSidebar(false); + protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel, active: boolean): void { + creator.toolbox.forceCompact = !active; + creator.toolbox.isCompact = !active; + creator.toolbox.items.forEach(i => i.enabled = active); + creator.readOnly = active; } protected setupQuestionsCore(model: SurveyModel, creatorSetup: ICreatorPresetEditorSetup): void { diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 1f94fd3b82..6ad369a80a 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -83,6 +83,13 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit return new SurveyCreatorModel(options); } + private activatePage (model: SurveyModel, creator: SurveyCreatorModel, editablePresets: CreatorPresetEditableBase[]) { + const inactivePresets = editablePresets.filter(item => model.currentPage.name !== item.pageName); + const activePreset = editablePresets.filter(item => model.currentPage.name === item.pageName)[0]; + inactivePresets.forEach(item => item.setupOnCurrentPage(model, this.creator, false)); + activePreset.setupOnCurrentPage(model, this.creator, true); + } + protected createModel(): SurveyModel { const editablePresets = this.createEditablePresets(); const model = new SurveyModel(this.getEditModelJson(editablePresets)); @@ -111,9 +118,9 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit const json = this.preset.getJson() || {}; editablePresets.forEach(item => item.setupQuestionsValue(model, json[item.path], this.creator)); this.updateJsonLocalizationStrings(editablePresets); - editablePresets.forEach(item => item.setupOnCurrentPage(model, this.creator)); + this.activatePage(model, this.creator, editablePresets); model.onCurrentPageChanged.add((sender, options) => { - editablePresets.forEach(item => item.setupOnCurrentPage(model, this.creator)); + this.activatePage(model, this.creator, editablePresets); }); const questionNames = editablePresets.map(preset => preset.questionNames).reduce((acc, current) => acc.concat(current), []); model.onValueChanged.add((sender, options) => { @@ -124,7 +131,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit } if (questionNames.indexOf(options.name) != -1 && !this.applying) { this.applyFromSurveyModel(false); - editablePresets.forEach(item => item.setupOnCurrentPage(model, this.creator)); + this.activatePage(model, this.creator, editablePresets); } }); model.onGetQuestionTitleActions.add((_, options) => { From 9b68a54148be52720e83add95c7687e6bf72cb58 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 18 Aug 2025 16:55:04 +0300 Subject: [PATCH 058/240] #7004 - fix page titles and descriptions --- .../src/presets/presets-editable-languages.ts | 4 ++-- .../src/presets/presets-editable-properties.ts | 3 ++- .../survey-creator-core/src/presets/presets-editable-tabs.ts | 4 ++-- .../src/presets/presets-editable-toolbox.ts | 3 ++- .../src/presets/presets-theme/presets.scss | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index d3eb53fdc8..b49acacb17 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -46,8 +46,8 @@ Serializer.getProperties("localizationpreview").forEach(p => { export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { public createMainPageCore(): any { return { - title: "Select Languages", - description: "Select the language of the Survey Creator UI and target languages for the survey being configured.", + title: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", navigationTitle: "Languages", elements: [ { diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 9a36381052..b4737b3a31 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -247,8 +247,9 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare public createMainPageCore(): any { return { - title: "Set Up the Property Grid", + title: "Customize the Property Grid", navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", elements: [ { type: "dropdown", diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index fe89719f1a..30f7372c31 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -39,8 +39,8 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { } public createMainPageCore(): any { return { - title: "Configure the Tabs", - description: "Select the tabs you want to show, reorder them, change their titles, and choose the tab that will be active by default.", + title: "Configure tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", navigationTitle: "Tabs", elements: [ { diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index f47609f551..5b512f5cb5 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -71,7 +71,8 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita public createMainPageCore(): any { return { - title: "Set Up the Toolbox", + title: "Set up the Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", navigationTitle: "Toolbox", elements: [ { diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index 16961158ab..d9213a83cc 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -67,7 +67,7 @@ } .sps-page__description { - color: var(--sjs2-color-fg-basic-primary, #1C1B20); + color: var(--sjs2-color-fg-basic-secondary, rgba(28, 27, 32, 0.60)); @include sjs2--typography--default; From e6c082007012ab94e2d70c6519bc7a0fdc045cd8 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 18 Aug 2025 18:20:27 +0300 Subject: [PATCH 059/240] #7004 - fixed some styles --- .../presets/presets-editable-categorized.ts | 1 + .../presets-theme/blocks/sps-action-bar.scss | 28 ++++++-- .../presets-theme/blocks/sps-table.scss | 65 ++++++++++--------- .../src/presets/presets-theme/presets.scss | 2 - 4 files changed, 59 insertions(+), 37 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index e871338e7c..6b438a2eec 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -138,6 +138,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre a.component = "sv-action-bar-item"; a.action = () => options.question.removeRowUI(options.row); a.iconName = "icon-delete_24x24"; + a.innerCss = "sps-action-button sps-action-button--icon sps-action-button--danger"; } }); } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss index 9252a3ef7f..70cd1249b6 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss @@ -15,25 +15,41 @@ appearance: none; border: none; display: flex; - padding: var(--sjs2-layout-control-action-medium-box-vertical, 12px) var(--sjs2-layout-control-action-medium-box-horizontal, 12px); + padding: calc( + var(--sjs2-layout-control-action-medium-box-vertical, 12px) + + var(--sjs2-layout-control-action-medium-label-vertical, 0px) + ) + calc( + var(--sjs2-layout-control-action-medium-box-horizontal, 12px) + + var(--sjs2-layout-control-action-medium-label-horizontal, 12px) + ); + justify-content: center; align-items: center; gap: var(--sjs2-layout-control-action-medium-box-gap, 0); border-radius: var(--sjs2-radius-control-button, 8px); - background: var(--sjs2-color-bg-brand-primary, #19B394); + background: var(--sjs2-color-bg-brand-primary, #19b394); - color: var(--sjs2-color-fg-static-main-primary, #FFF); + color: var(--sjs2-color-fg-static-main-primary, #fff); text-align: center; @include sjs2--typography--default-strong; &:hover { - background: var(--sjs2-color-bg-brand-primary-dim, #15987E); + background: var(--sjs2-color-bg-brand-primary-dim, #15987e); } &:active { - background: var(--sjs2-color-bg-brand-primary, #19B394); + background: var(--sjs2-color-bg-brand-primary, #19b394); } +} +.sps-footer__prev-btn { + background: var(--sjs2-color-bg-brand-secondary, rgba(25, 179, 148, 0.1)); + color: var(--sjs2-color-fg-brand-primary, #19b394); + &:hover, + &:focus { + background: var(--sjs2-color-bg-brand-secondary-dim, rgba(25, 179, 148, 0.15)); + } } .sps-action-button { @@ -50,7 +66,7 @@ border: none; color: var(--ctr-actionbar-button-text-color, var(--sjs-primary-background-500, #19b394ff)); border-radius: var(--sjs2-radius-control-action-icon, 8px); - background: var(--sjs2-color-bg-neutral-tertiary, rgba(28, 27, 32, 0.00)); + background: var(--sjs2-color-bg-neutral-tertiary, rgba(28, 27, 32, 0)); cursor: pointer; transition: background-color $creator-transition-duration, diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss index 9024f796bf..c6fb5681ef 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -8,43 +8,53 @@ .sps-table { width: 100%; - background-color: var(--sjs2-color-bg-basic-primary, #FFF); + background-color: var(--sjs2-color-bg-basic-primary, #fff); border-collapse: collapse; - &>tbody>tr { - background-color: var(--sjs2-color-bg-basic-primary, #FFF); - &> td:last-of-type > .sps-action-bar { - opacity: 0; + & > tbody > tr { + background-color: var(--sjs2-color-bg-basic-primary, #fff); + & > td:last-of-type > .sps-action-bar .sps-action-button { + opacity: 0; + } + &:hover { + & > td > div { + background: var(--sjs2-color-bg-basic-primary-dim, rgba(28, 27, 32, 0.05)); } - &:hover { - &> td > div { - background: var(--sjs2-color-bg-basic-primary-dim, rgba(28, 27, 32, 0.05)); - } - &> td:last-of-type > .sps-action-bar { - opacity: 1; - } + & > td:last-of-type > .sps-action-bar .sps-action-button { + opacity: 1; } + } } tbody > tr:last-of-type { border-bottom: none; td { border-bottom: none; + padding-bottom: 0; } } tbody > tr:first-of-type { border-top: none; td { border-top: none; + padding-top: 0; } } } +.sd-table__row--expanded { + & > td { + padding-bottom: 0; + &> div { + background: var(--sjs2-color-bg-basic-primary-dim, rgba(28, 27, 32, 0.05)); + } + } +} .sps-table__cell { padding: 0; padding-bottom: calc(var(--sjs2-spacing-x075, 6px) + var(--sjs2-spacing-x050, 4px)); padding-top: calc(var(--sjs2-spacing-x075, 6px) + var(--sjs2-spacing-x050, 4px)); - border-bottom: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #D4D4D4); + border-top: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #d4d4d4); &:first-of-type > div { border-top-left-radius: var(--sjs2-radius-semantic-form, 8px); border-bottom-left-radius: var(--sjs2-radius-semantic-form, 8px); @@ -56,7 +66,8 @@ } .sps-table__cell--detail-panel { - padding: 0; + padding: var(--sjs2-spacing-x075, 6px) 0; + border-top: none; .sps-panel__content { box-shadow: none; @@ -73,8 +84,8 @@ .sps-table__cell { padding: 0; padding-bottom: var(--sjs2-spacing-x075, 6px); - padding-top: var(--sjs2-spacing-x075, 6px); - border-bottom: none; + padding-top: 0; + border-top: none; } } .sps-table__cell:where(:not(.sps-table__cell--detail-panel)) { @@ -91,15 +102,18 @@ .sps-input { appearance: none; box-shadow: none; - border-radius: var(--sjs2-radius-semantic-form, 8px); - border: var(--sjs2-border-width-focused, 2px) solid transparent; background-color: transparent; height: auto; - padding: calc(var(--sjs2-spacing-x100, 8px) - var(--sjs2-border-width-focused, 2px)); + padding: var(--sjs2-spacing-x100, 8px) 0; &:focus, &:focus-within { - border-color: var(--sjs2-color-border-brand-primary, #19B394); + border-radius: var(--sjs2-radius-semantic-form, 8px); + background: var(--sjs2-color-control-formbox-focused-bg, #f5f5f5); + box-shadow: var(--sjs2-border-offset-x-form-focused, 0) var(--sjs2-border-offset-y-form-focused, 0) + var(--sjs2-border-blur-form-focused, 0) var(--sjs2-border-spread-form-focused, 2px) + var(--sjs2-color-control-formbox-focused-border, #19b394) inset; + padding: var(--sjs2-spacing-x100, 8px); } } } @@ -114,13 +128,6 @@ width: calcSize(5); } -.sps-table__cell--actions:last-of-type { - .sps-action-bar { - justify-content: flex-end; - padding-inline-end: var(--ctr-data-table-row-padding-right, var(--sjs-spacing-x05)); - } -} - // .sps-table__cell--actions > .sps-matrixdynamic__drag-element { // display: inline-block; // margin-top: calcSize(0.5); @@ -189,7 +196,7 @@ .sps-table__row--empty { @include sjs2--typography--default; - color: var(--sjs2-color-fg-basic-primary, #1C1B20); + color: var(--sjs2-color-fg-basic-primary, #1c1b20); text-align: center; height: 300px; -} \ No newline at end of file +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index d9213a83cc..b320c968f9 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -116,10 +116,8 @@ gap: var(--sjs2-spacing-x075, 6px); align-self: stretch; border-right: var(--sjs2-border-width-static-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #D4D4D4); - padding-right: 0; &:last-child { border: none; - padding-right: var(--sjs2-spacing-x150, 12px); } } } From f0aaafcfd568d993fdb4c84ce0f17ab31a825d9c Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 19 Aug 2025 12:47:38 +0300 Subject: [PATCH 060/240] #7004 switches in navigation panel --- .../src/presets/presets-editable-toolbox.ts | 2 -- .../presets/presets-theme/blocks/sps-panel.scss | 14 +++++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 5b512f5cb5..b91ea1080d 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -131,7 +131,6 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita valueTrue: "categories", valueFalse: "items", clearIfInvisible: "onHidden", - startWithNewLine: false, renderAs: "switch" }, { @@ -142,7 +141,6 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita titleLocation: "hidden", visibleIf: this.getTextVisibleIf(this.nameCategoriesMode, "categories"), clearIfInvisible: "onHidden", - startWithNewLine: false, renderAs: "switch" } ] diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss index e92eec82d6..d362c6957e 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss @@ -19,7 +19,7 @@ position: relative; display: flex; flex-direction: row-reverse; - padding: var(--sjs2-spacing-x250, 20px); + padding: var(--sjs2-spacing-x150, 12px) var(--sjs2-spacing-x400, 32px);; align-items: center; gap: var(--sjs2-spacing-x150, 12px); border-radius: 0; @@ -32,6 +32,18 @@ display: flex; justify-content: flex-end; } + .sps-panel__content { + display: flex; + } + .sps-row { + border: none; + padding: 0 var(--tokens-spacing-static-positive-x300, 24px); + border-left: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #D4D4D4); + &:first-child { + padding-left: 0; + border-left: none; + } + } .sps-question__content { padding: 0; } From 06de0114ef8839ff84b9884060c05ec384ef48cb Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 19 Aug 2025 14:30:44 +0300 Subject: [PATCH 061/240] #7004 - fix button style --- .../src/presets/presets-plugin.ts | 7 ++++--- .../presets-theme/blocks/sps-action-bar.scss | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 6dd4be5941..9155082e52 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -49,15 +49,16 @@ export class TabPresetsPlugin implements ICreatorPlugin { settingsAction = createDropdownActionModel({ id: "presets-menu", locTooltipName: "ed.creatorPresetsTitle", - iconName: "navmenu-24x24" + iconName: "navmenu-24x24", + css: "sps-menu-floating-action" }, { items: [...presets, ...tools], verticalPosition: "top", horizontalPosition: "center", cssClass: "svc-creator-popup svc-creator-popup--large-markers", cssClasses: listComponentCss, - // onHide: () => { this.languageSelectorAction.enabled = true; }, - // onShow: () => { this.languageSelectorAction.enabled = false; } + onHide: () => { settingsAction.iconName = "navmenu-24x24"; }, + onShow: () => { settingsAction.iconName = "close-24x24"; } }, this.creator); const bottomActions = this.designerPlugin.tabControlModel.bottomToolbar.actions; bottomActions.forEach(a => a.visible = false); diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss index 70cd1249b6..b266de94cc 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss @@ -139,3 +139,20 @@ button.sps-action-button--large { .sps-action-button--text { padding: calcSize(0.5) calcSize(2); } + +.sps-menu-floating-action { + .svc-menu-action__button { + background: var(--sjs2-color-bg-brand-primary, #19B394); + use { + fill: var(--sjs2-color-fg-static-main-primary, #FFF); + } + } + .svc-menu-action__button:hover, + .svc-menu-action__button:focus, + .svc-menu-action__button:focus-within { + background: var(--sjs2-color-bg-brand-primary-dim, #15987E); + } + .svc-menu-action__button:active { + background: var(--sjs2-color-bg-brand-primary, #19B394); + } +} From 42c9f62a364f2abb50989a07df011b47b809ffc3 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 19 Aug 2025 14:45:32 +0300 Subject: [PATCH 062/240] #7004 - fix matrix expand-collapse --- .../src/presets/presets-theme/blocks/sps-table.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss index c6fb5681ef..0904b877f6 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -43,7 +43,6 @@ } .sd-table__row--expanded { & > td { - padding-bottom: 0; &> div { background: var(--sjs2-color-bg-basic-primary-dim, rgba(28, 27, 32, 0.05)); } @@ -66,7 +65,7 @@ } .sps-table__cell--detail-panel { - padding: var(--sjs2-spacing-x075, 6px) 0; + padding: 0 0 var(--sjs2-spacing-x075, 6px) 0; border-top: none; .sps-panel__content { @@ -79,6 +78,7 @@ .sps-panel { border: none; + margin-top: calc(-1 * var(--sjs2-spacing-x075, 6px)); } .sps-table__cell { From 06ebc3cf03e43394aaabb6d9147c3796daa401dc Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 19 Aug 2025 18:03:55 +0300 Subject: [PATCH 063/240] #7007 - launch presets from sidebar --- .../src/presets/presets-editor.ts | 6 + .../src/presets/presets-plugin.ts | 18 ++- .../presets-theme/blocks/sps-launch.scss | 117 ++++++++++++++++++ .../src/presets/presets-theme/presets.scss | 5 + packages/survey-creator-react/index.js | 2 - .../src/entries/presets.ts | 3 +- .../src/presets/PresetsPropertyGrid.tsx | 55 ++++++++ 7 files changed, 201 insertions(+), 5 deletions(-) create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-launch.scss create mode 100644 packages/survey-creator-react/src/presets/PresetsPropertyGrid.tsx diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 6ad369a80a..84885c5e2f 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -53,6 +53,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit this.disposeModel(); } private disposeModel(): void { + this.resetAllPages(); this.model.editablePresets.forEach(preset => preset.dispose()); this.model.dispose(); } @@ -83,6 +84,11 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit return new SurveyCreatorModel(options); } + private resetAllPages() { + this.model.editablePresets.forEach(item => item.setupOnCurrentPage(this.model, this.creator, true)); + this.creator.readOnly = false; + } + private activatePage (model: SurveyModel, creator: SurveyCreatorModel, editablePresets: CreatorPresetEditableBase[]) { const inactivePresets = editablePresets.filter(item => model.currentPage.name !== item.pageName); const activePreset = editablePresets.filter(item => model.currentPage.name === item.pageName)[0]; diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 9155082e52..8697b7f220 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -6,15 +6,29 @@ import { darkTheme } from "sjs-design-tokens"; export class TabPresetsPlugin implements ICreatorPlugin { public model: CreatorPresetEditorModel | undefined; public static iconName = "icon-settings"; + private activeTab; private currentPresetIndex = 0; private currentValue; private designerPlugin; private toolboxCompact; private defaultJson; + private showPresets() { + this.activeTab = this.creator.activeTab; + this.creator.activeTab = "presets"; + } + + private hidePresets() { + this.creator.activeTab = this.activeTab; + } + constructor(private creator: SurveyCreatorModel) { creator.addTab({ name: "presets", title: "Presets", plugin: this, iconName: TabPresetsPlugin.iconName }); + creator.tabs.filter(t => t.id == "presets")[0].css = "svc-tabbed-menu-item-container--presets"; this.designerPlugin = creator.getPlugin("designer"); + const settingsPage = this.creator.sidebar.getPageById("creatorTheme"); + settingsPage.componentData.showPresets = () => this.showPresets(); + settingsPage.componentName = "svc-presets-property-grid"; this.toolboxCompact = creator.toolbox.forceCompact; } @@ -32,7 +46,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { const presets = this.model?.model.pages.map(p => { id: p.name, title: p.navigationTitle }); const tools = [ - { id: "save", title: "Save & Exit", markerIconName: "check-24x24", needSeparator: true }, + { id: "save", title: "Save & Exit", markerIconName: "check-24x24", needSeparator: true, action: () => this.hidePresets() }, { id: "import", title: "Import", markerIconName: "import-24x24", action: () => { this.model?.loadJsonFile(); } }, { id: "export", title: "Export", markerIconName: "download-24x24", action: () => { this.model?.downloadJsonFile(); } }, { id: "reset", title: "Reset all changes", markerIconName: "restore-24x24", needSeparator: true }, @@ -42,7 +56,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { presets.forEach(p => { p.action = (item)=>{ presetsList.selectedItem = item; - //settingsAction.popupModel.show(); + settingsAction.popupModel.show(); this.model.model.currentPage = this.model.model.getPageByName(item.id); }; }); diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-launch.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-launch.scss new file mode 100644 index 0000000000..9278e5011a --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-launch.scss @@ -0,0 +1,117 @@ +.sps-launch, +.sps-launch * { + box-sizing: border-box; +} +.sps-launch { + padding: var(--sjs2-spacing-x200, 16px) var(--sjs2-spacing-x400, 32px) 0px var(--sjs2-spacing-x400, 32px); + display: flex; + flex-direction: column; + gap: var(--sjs2-spacing-x200, 16px); + align-items: flex-start; + justify-content: flex-start; + align-self: stretch; + flex-shrink: 0; + position: relative; +} +.sps-launch__card { + background: var(--sjs2-color-bg-basic-primary, #ffffff); + border-radius: var(--radius-semantic-form, 8px); + border-style: solid; + border-color: var(--sjs2-color-border-basic-secondary, #d4d4d4); + border-width: 1px; + display: flex; + flex-direction: row; + gap: 0px; + align-items: flex-start; + justify-content: flex-start; + align-self: stretch; + flex-shrink: 0; + position: relative; + cursor: pointer; + appearance: none; + &:hover { + background: var(--sjs2-color-bg-basic-primary-dim, rgba(28, 27, 32, 0.05)); + } + &:active { + background: var(--sjs2-color-bg-basic-primary, #ffffff); + } +} +.sps-launch__container { + padding: 16px; + display: flex; + flex-direction: column; + gap: 4px; + align-items: flex-start; + justify-content: flex-start; + flex: 1; + position: relative; +} +.sps-launch__text { + color: var(--sjs2-color-fg-brand-primary, #19b394); + text-align: left; + font-family: var(--sjs2-typography-default-strong-font-family, "OpenSans-SemiBold", sans-serif); + font-size: var(--sjs2-typography-default-strong-font-size, 16px); + line-height: var(--sjs2-typography-default-strong-line-height, 24px); + font-weight: var(--sjs2-typography-default-strong-font-weight, 600); + position: relative; + align-self: stretch; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} +.sps-launch__text2 { + color: var(--sjs2-color-fg-basic-secondary, rgba(28, 27, 32, 0.6)); + text-align: left; + font-family: var(--sjs2-typography-small-font-family, "OpenSans-Regular", sans-serif); + font-size: var(--sjs2-typography-small-font-size, 12px); + line-height: var(--sjs2-typography-small-line-height, 16px); + font-weight: var(--sjs2-typography-small-font-weight, 400); + position: relative; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} +.sps-launch__icon { + display: flex; + flex-direction: row; + gap: 0px; + align-items: center; + justify-content: center; + flex-shrink: 0; + width: var(--ctr-menu-toolbar-button-icon-width, 24px); + height: var(--ctr-menu-toolbar-button-icon-height, 24px); + position: absolute; + right: 12px; + top: 50%; + translate: 0 -50%; +} +.sps-launch__chevron-right-16-x-16 { + flex-shrink: 0; + width: 24px; + height: 24px; + position: relative; + overflow: hidden; +} +.sps-launch__icon2 { + display: flex; + flex-direction: row; + gap: 0px; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + position: absolute; + right: 0%; + left: 0%; + bottom: -100%; + top: 100%; + transform-origin: 0 0; + transform: rotate(-90deg) scale(1, 1); +} +.sps-launch__chevron-down { + align-self: stretch; + flex: 1; + height: auto; + position: relative; + overflow: visible; +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index b320c968f9..1364d0def8 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -8,6 +8,7 @@ @use "blocks/sps-checkbox.scss"; @use "blocks/sps-matrixdynamic.scss"; @use "blocks/sps-table.scss"; +@use "blocks/sps-launch.scss"; .sps-root-modern { position: relative; @@ -121,3 +122,7 @@ } } } + +.svc-tabbed-menu-item-container--presets { + display: none; +} \ No newline at end of file diff --git a/packages/survey-creator-react/index.js b/packages/survey-creator-react/index.js index 9585b20ecf..6367b81b9b 100644 --- a/packages/survey-creator-react/index.js +++ b/packages/survey-creator-react/index.js @@ -236,8 +236,6 @@ if(window.SurveyCreatorCorePresets) { window.editor = new SurveyCreatorCorePresets.TabPresetsPlugin(creator); } -creator.activeTab = "presets"; - ReactDOM.render( diff --git a/packages/survey-creator-react/src/entries/presets.ts b/packages/survey-creator-react/src/entries/presets.ts index 443023257d..75afb28b06 100644 --- a/packages/survey-creator-react/src/entries/presets.ts +++ b/packages/survey-creator-react/src/entries/presets.ts @@ -1 +1,2 @@ -export { TabPresetsComponent } from "../presets/Presets"; \ No newline at end of file +export { TabPresetsComponent } from "../presets/Presets"; +export { PresetsPropertyGridWrapper } from "../presets/PresetsPropertyGrid"; \ No newline at end of file diff --git a/packages/survey-creator-react/src/presets/PresetsPropertyGrid.tsx b/packages/survey-creator-react/src/presets/PresetsPropertyGrid.tsx new file mode 100644 index 0000000000..cb2c0eae71 --- /dev/null +++ b/packages/survey-creator-react/src/presets/PresetsPropertyGrid.tsx @@ -0,0 +1,55 @@ +import * as React from "react"; +import PropTypes from "prop-types"; +import { Base, SurveyModel, PageModel } from "survey-core"; +import { + ReactElementFactory, + Survey, + SurveyElementBase, + SvgIcon, +} from "survey-react-ui"; +import { PropertyGridViewModel } from "survey-creator-core"; +interface IPresetsPropertyGridWrapperProps { + model: PropertyGridViewModel; + +} +export class PresetsPropertyGridWrapper extends React.Component { + static propTypes = { + model: PropTypes.object.isRequired, + + }; + + constructor(props: IPresetsPropertyGridWrapperProps) { + super(props); + } + render() { + const model = (this.props as IPresetsPropertyGridWrapperProps).model; + if (!model) return null; + + return ( + +
+ +
+ { ReactElementFactory.Instance.createElement("svc-property-grid", { model: model })} +
+ ); + } +} + +ReactElementFactory.Instance.registerElement("svc-presets-property-grid", (props) => { + return React.createElement(PresetsPropertyGridWrapper, props); +}); From 9a38e54bac8591f37f82f8c34af5723cb4bcee85 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 20 Aug 2025 17:01:05 +0300 Subject: [PATCH 064/240] #7004 Add button in tables --- .../presets/presets-editable-categorized.ts | 2 +- .../presets/presets-editable-properties.ts | 5 ++-- .../src/presets/presets-editable-toolbox.ts | 6 +++-- .../src/presets/presets-editor.ts | 10 ++++++- .../blocks/sps-matrixdynamic.scss | 16 ++++++----- .../presets-theme/blocks/sps-question.scss | 27 +++++++++++++++---- .../src/presets/presets-theme/presets.scss | 1 - 7 files changed, 49 insertions(+), 18 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 6b438a2eec..fd75171366 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -1,4 +1,4 @@ -import { FunctionFactory, Helpers, IDialogOptions, ItemValue, MatrixDropdownRowModelBase, MatrixDynamicRowModel, QuestionMatrixDropdownRenderedRow, QuestionMatrixDynamicModel, Serializer, settings, SurveyModel } from "survey-core"; +import { Action, FunctionFactory, Helpers, IDialogOptions, ItemValue, MatrixDropdownRowModelBase, MatrixDynamicRowModel, QuestionMatrixDropdownRenderedRow, QuestionMatrixDynamicModel, Serializer, settings, SurveyModel } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; import { QuestionToolboxCategory, QuestionToolboxItem, SurveyCreatorModel, SurveyJSON5, editorLocalization } from "survey-creator-core"; import { PresetItemValue, QuestionPresetRankingModel } from "./preset-question-ranking"; diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index b4737b3a31..4527b4ae7a 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -221,7 +221,7 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare cellType: "text", showHeader: false, rowCount: 0, - allowAddRows: false, + allowAddRows: true, addRowButtonLocation: "top", addRowText: "Add Custom Item", "noRowsText": "There are no items", @@ -266,10 +266,11 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare { type: "matrixdynamic", name: this.nameCategories, - titleLocation: "hidden", + title: "Add custom category", minRowCount: 1, allowRowReorder: true, addRowButtonLocation: "top", + allowAddRows: true, addRowText: "Add Custom Category", showHeader: false, columns: [ diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index b91ea1080d..c81001dc18 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -21,7 +21,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita const defaultJSON = { type: "matrixdynamic", name: "items", - titleLocation: "hidden", + title: "Add custom item", allowRowReorder: true, cellType: "text", showHeader: false, @@ -82,10 +82,11 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita { type: "matrixdynamic", name: this.nameCategories, - titleLocation: "hidden", + title: "Add custom category", visibleIf: this.getTextVisibleIf(this.nameCategoriesMode, "categories"), minRowCount: 1, allowRowReorder: true, + allowAddRows: true, addRowButtonLocation: "top", addRowText: "Add Custom Category", showHeader: false, @@ -106,6 +107,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita }, this.createItemsMatrixJSON({ name: this.nameItems, + titleLocation: "hidden", startWithNewLine: false, visibleIf: this.getTextVisibleIf(this.nameCategoriesMode, "items"), }), diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 84885c5e2f..da21908b67 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -1,6 +1,6 @@ import { SurveyCreatorModel, editorLocalization, ICreatorOptions } from "survey-creator-core"; import { CreatorPreset, ICreatorPresetData } from "survey-creator-core"; -import { ActionContainer, Base, ComputedUpdater, LocalizableString, SurveyModel, createDropdownActionModel } from "survey-core"; +import { Action, ActionContainer, Base, ComputedUpdater, LocalizableString, QuestionMatrixDynamicModel, SurveyModel, createDropdownActionModel } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; import { CreatorPresetEditableToolboxConfigurator } from "./presets-editable-toolbox"; import { CreatorPresetEditablePropertyGrid } from "./presets-editable-properties"; @@ -145,6 +145,14 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit if (options.question.name == item.getNavigationElementName()) { options.actions = model.navigationBar.actions; } + if (options.question instanceof QuestionMatrixDynamicModel && options.question.allowAddRows) { + options.actions = [new Action({ + iconName: "add-24x24", + action: () => { + options.question.addRowUI(); + } + })]; + } }); }); model.onGetPanelTitleActions.add((_, options) => { diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss index ade159c3ed..9f41c1429b 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss @@ -23,7 +23,7 @@ justify-content: center; align-items: center; use { - fill: var(--sjs2-color-fg-basic-tertiary, rgba(from #1C1B20 r g b / 0.4)); + fill: var(--sjs2-color-fg-basic-tertiary, rgba(from #1c1b20 r g b / 0.4)); } } @@ -50,6 +50,12 @@ bottom: 0; } +.sps-matrixdynamic__content { + padding: var(--sjs2-spacing-x150, 12px); +} +.sps-table__row--detail .sps-matrixdynamic__content { + padding: 0; +} .sps-matrixdynamic__placeholder { display: flex; flex-direction: column; @@ -81,16 +87,14 @@ width: var(--sjs2-size-icon-medium, 24px); height: var(--sjs2-size-icon-medium, 24px); padding: 0; - margin: var(--ctr-actionbar-button-padding-top-large-icon, var(--sjs-spacing-x1)) - 0 - var(--ctr-actionbar-button-padding-bottom-large-icon, var(--sjs-spacing-x1)) - 0; + margin: var(--ctr-actionbar-button-padding-top-large-icon, var(--sjs-spacing-x1)) 0 + var(--ctr-actionbar-button-padding-bottom-large-icon, var(--sjs-spacing-x1)) 0; margin-inline-end: var(--sjs2-spacing-x100, 8px); &:disabled { opacity: 1; } use { - fill: var(--sjs2-color-fg-brand-primary, #19B394); + fill: var(--sjs2-color-fg-brand-primary, #19b394); } } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss index 2947b2f3bc..0b147ef890 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss @@ -2,12 +2,12 @@ @use "../fonts" as *; .sps-question { - background: var(--sjs2-color-bg-basic-primary, #FFF); + background: var(--sjs2-color-bg-basic-primary, #fff); } .sps-question--with-frame { border-radius: var(--sjs2-radius-x250, 20px); - border: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #D4D4D4); + border: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #d4d4d4); overflow: hidden; } @@ -19,15 +19,32 @@ align-self: stretch; } +.sps-question--nested .sps-question__header { + padding: var(--sjs2-spacing-x150, 12px); + border-bottom: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #d4d4d4); + box-sizing: border-box; +} + .sps-question__title { - color: var(--sjs2-color-fg-basic-primary, #1C1B20); + color: var(--sjs2-color-fg-basic-primary, #1c1b20); @include sjs2--typography--default-strong; + + .sv-title-actions { + flex-direction: row-reverse; + @include sjs2--typography--default; + } + .sps-action-title-bar { + margin: 0; + padding: 0; + min-width: initial; + } } .sps-question__content { display: flex; - padding: var(--sjs2-spacing-x150, 12px) var(--sjs2-spacing-x250, 20px) var(--sjs2-spacing-x250, 20px) var(--sjs2-spacing-x250, 20px); + padding: var(--sjs2-spacing-x150, 12px) var(--sjs2-spacing-x250, 20px) var(--sjs2-spacing-x250, 20px) + var(--sjs2-spacing-x250, 20px); flex-direction: column; align-items: flex-start; align-self: stretch; @@ -35,4 +52,4 @@ .sps-question__description { white-space: normal; -} \ No newline at end of file +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index 1364d0def8..6d09ea8066 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -111,7 +111,6 @@ align-items: stretch; & > div { display: flex; - padding: var(--sjs2-spacing-x150, 12px); flex-direction: column; align-items: flex-start; gap: var(--sjs2-spacing-x075, 6px); From eb476a88686796721e312046ecd230e8404e1160 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 20 Aug 2025 19:30:52 +0300 Subject: [PATCH 065/240] #7007 - fix table rows --- .../src/presets/presets-editable-list.ts | 10 +++++++- .../src/presets/presets-editable-toolbox.ts | 1 + .../presets-theme/blocks/sps-table.scss | 25 +++++++++++++++++++ .../src/presets/presets-theme/presets.scss | 7 +++++- 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 4bb7349027..b248ff7324 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -34,7 +34,8 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { } } } - + private resetItems(model: SurveyModel, row: MatrixDynamicRowModel) { + } protected restoreItems(questionItems: QuestionMatrixDynamicModel, questionHiddenItems: QuestionMatrixDynamicModel, rowIndex: number) { const rowData = questionHiddenItems.value[rowIndex]; const value = questionItems.value ? [...questionItems.value] : []; @@ -60,6 +61,13 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { location: "start", enabled: false }); + options.actions.push({ + id: "reset-to-default", + iconName: "icon-reset", + location: "end", + visibleIndex: 15, + action: ()=>{ this.resetItems(model, options.row); } + }); } options.question.cssClasses.detailIconExpandedId = "icon-edit"; diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index c81001dc18..3ac02d853d 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -101,6 +101,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita { type: "text", name: "tooltip", visible: false }, this.createItemsMatrixJSON({ name: this.nameInnerMatrix, + titleLocation: "hidden", valueName: "items" }) ] diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss index 0904b877f6..7e45cc79ae 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -105,6 +105,10 @@ background-color: transparent; height: auto; padding: var(--sjs2-spacing-x100, 8px) 0; + + width: calc(100% + var(--action-container-width)); + margin-right: calc(-1 * var(--action-container-width)); + text-overflow: ellipsis; &:focus, &:focus-within { @@ -118,6 +122,27 @@ } } +.sps-table__row { + --action-width: calc(2 * var(--ctr-actionbar-button-padding-top-large-icon, 8px) + var(--ctr-actionbar-button-icon-width, var(--sjs-font-size-x3))); + --action-container-width: calc(3 * var(--action-width)); +} + +.sps-table__row:has(> .sps-table__cell:last-of-type .sv-action:nth-child(4)) { + --action-container-width: calc(4 * var(--action-width)); +} + +.sps-table__row { + &:hover, + &:focus-within{ + .sps-table__cell:not(.sps-table__cell--detail-panel) { + .sps-input { + width: 100%; + margin-right: 0; + } + } + } +} + .sps-table__cell:not(.sps-table__cell--detail-panel):first-of-type .sps-text { padding-left: calcSize(2); } diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index 6d09ea8066..f8f4538c3f 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -72,7 +72,7 @@ @include sjs2--typography--default; - padding-bottom: var(--sjs2-spacing-x150, 12px); + padding-bottom: calc(var(--sjs2-spacing-x400, 32px) - var(--sjs2-spacing-x150, 12px)); } .sps-action-title-bar { @@ -99,11 +99,16 @@ } } +.sps-row { + max-width: 854px; +} + .sps-row:has(.sps-panel--navigation) { position: sticky; margin: calc(-1 * var(--sjs2-spacing-x400, 32px)); margin-top: 0; bottom: 0; + max-width: initial; } .sps-row--multiple { From 9fcfb71c9a78f31e2b1ed2266939f3ada2f00b91 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 21 Aug 2025 13:05:37 +0300 Subject: [PATCH 066/240] #7004 fixed menu --- .../src/components/popup.scss | 14 +-- .../src/presets/presets-plugin.ts | 8 +- .../presets-theme/blocks/sps-list.scss | 112 ++++++++++++++++++ .../presets-theme/blocks/sps-popup.scss | 24 ++++ .../src/presets/presets-theme/list-theme.ts | 27 +++++ .../src/presets/presets-theme/presets.scss | 2 + 6 files changed, 171 insertions(+), 16 deletions(-) create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss create mode 100644 packages/survey-creator-core/src/presets/presets-theme/list-theme.ts diff --git a/packages/survey-creator-core/src/components/popup.scss b/packages/survey-creator-core/src/components/popup.scss index 936034627f..df668dc8f9 100644 --- a/packages/survey-creator-core/src/components/popup.scss +++ b/packages/survey-creator-core/src/components/popup.scss @@ -225,16 +225,4 @@ // @include ctrDefaultFont; // color: var(--ctr-popup-message-color, var(--sjs-layer-1-foreground-100, #000000e6)); // } -} - -.svc-creator-popup--large-markers { - .svc-list__item-body { - padding-inline-end: var(--sjs-spacing-x150, 12px); - gap: var(--sjs-spacing-x6, 48px); - } - .svc-list-item__marker-icon { - padding: 0; - width: var(--sjs-font-size-x3, 24px); - height: var(--sjs-font-size-x3, 24px); - } -} +} \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 8697b7f220..1c9f589f98 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -1,6 +1,7 @@ import { createDropdownActionModel, Base, SurveyModel, Action, ComputedUpdater, CurrentPageChangedEvent, PageVisibleChangedEvent, QuestionDropdownModel, ActionContainer, IAction } from "survey-core"; -import { ICreatorPlugin, SurveyCreatorModel, listComponentCss, saveToFileHandler, extendCreatorTheme } from "survey-creator-core"; +import { ICreatorPlugin, SurveyCreatorModel, saveToFileHandler, extendCreatorTheme } from "survey-creator-core"; import { CreatorPresetEditorModel } from "./presets-editor"; +import { listComponentCss } from "./presets-theme/list-theme"; import { darkTheme } from "sjs-design-tokens"; export class TabPresetsPlugin implements ICreatorPlugin { @@ -46,7 +47,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { const presets = this.model?.model.pages.map(p => { id: p.name, title: p.navigationTitle }); const tools = [ - { id: "save", title: "Save & Exit", markerIconName: "check-24x24", needSeparator: true, action: () => this.hidePresets() }, + { id: "save", title: "Save & Exit", css: "sps-list__item--positive", markerIconName: "check-24x24", needSeparator: true, action: () => this.hidePresets() }, { id: "import", title: "Import", markerIconName: "import-24x24", action: () => { this.model?.loadJsonFile(); } }, { id: "export", title: "Export", markerIconName: "download-24x24", action: () => { this.model?.downloadJsonFile(); } }, { id: "reset", title: "Reset all changes", markerIconName: "restore-24x24", needSeparator: true }, @@ -67,9 +68,10 @@ export class TabPresetsPlugin implements ICreatorPlugin { css: "sps-menu-floating-action" }, { items: [...presets, ...tools], + showPointer: false, verticalPosition: "top", horizontalPosition: "center", - cssClass: "svc-creator-popup svc-creator-popup--large-markers", + cssClass: "sps-popup-menu", cssClasses: listComponentCss, onHide: () => { settingsAction.iconName = "navmenu-24x24"; }, onShow: () => { settingsAction.iconName = "close-24x24"; } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss new file mode 100644 index 0000000000..03431321a9 --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss @@ -0,0 +1,112 @@ +@use "../../../variables.scss" as *; +@use "../fonts" as *; + +.sps-list { + width: 100%; + display: flex; + padding: var(--sjs2-spacing-x150, 12px); + flex-direction: column; + align-items: flex-start; + gap: var(--sjs2-spacing-x050, 4px); + align-self: stretch; + margin: 0; + overflow-y: auto; + list-style-type: none; + + box-sizing: border-box; +} + +.sps-list__container { + width: 288px; +} + +.sps-list__item { + width: 100%; + outline: none; +} + +.sps-list__item--positive { + .sps-list__item-body { + color: var(--sjs2-color-fg-brand-primary, #19b394); + } +} + +.sps-list__item-body { + @include textEllipsis; + @include sjs2--typography--default; + text-align: start; + color: var(--sjs2-color-fg-basic-primary, #1c1b20); + transition: color $creator-transition-duration; + + display: flex; + flex: 1 0 0; + display: flex; + padding: var(--sjs2-spacing-x100, 8px) var(--sjs2-spacing-x150, 12px); + align-items: center; + gap: 8px; + flex: 1 0 0; + border-radius: var(--ctr-list-item-corner-radius, var(--sjs-corner-radius-x075)); + cursor: pointer; + + transition: background-color $creator-transition-duration; + + & > span, + & > sv-ng-string { + flex: 1 0 0; + } +} + +.sps-list__item:disabled, +.sps-list__item--disabled { + opacity: var(--ctr-list-item-opacity-disabled, 0.25); + pointer-events: none; +} + +.sps-list__item:focus, +.sps-list__item:hover, +.sps-list__item--focused, +.sps-list__item--hovered { + & > .sps-list__item-body { + background: var(--sjs2-color-bg-brand-tertiary-dim, rgba(25, 179, 148, 0.1)); + } +} + +.sps-list__item--selected, +.sps-list__item--selected:hover, +.sps-list__item--selected:focus, +.sps-list__item.sps-list__item--selected:hover { + & > .sps-list__item-body { + @include sjs2--typography--default-strong; + color: var(--sjs2-color-fg-static-main-primary, #fff); + background: var(--sjs2-color-bg-brand-primary, #19b394); + } +} + +.sps-list__item-separator { + width: calc(100% + var(--sjs2-spacing-x150, 12px)); + height: var(--sjs2-border-width-x100, 1px); + margin: 0 calc(-1 * var(--sjs2-spacing-x150, 12px)) var(--sjs2-spacing-x050, 4px); + background: var(--sjs2-color-border-basic-secondary, #d4d4d4); +} + +.sps-list-item__marker-icon { + display: flex; + padding: 0; + align-items: flex-start; + width: 24px; + height: 24px; + box-sizing: content-box; + justify-content: center; + + use { + fill: currentColor; + } +} + +.sps-list__container { + display: flex; + flex-direction: column; + flex-grow: 1; + min-height: 0; + height: 100%; +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss new file mode 100644 index 0000000000..d18cc014aa --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss @@ -0,0 +1,24 @@ +@use "../../../variables.scss" as *; +@use "./variables.scss" as *; +@use "../fonts" as *; + +.sps-popup-menu.sv-popup--menu-popup { + .sv-popup__container { + border: initial; + padding: var(--sjs2-spacing-x150, 12px); + box-shadow: initial; + background: initial; + box-sizing: border-box; + + .sv-popup__body-content { + border-radius: var(--sjs2-radius-container-menu, 20px); + border: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #d4d4d4); + background: var(--sjs2-color-utility-sheet, #fff); + + /* sjs2/border-effect/floating/default */ + box-shadow: var(--sjs2-border-offset-x-floating-default, 0) var(--sjs2-border-offset-y-floating-default, 6px) + var(--sjs2-border-blur-floating-default, 12px) var(--sjs2-border-spread-floating-default, 4px) + var(--sjs2-color-utility-shadow-floating-default, rgba(0, 76, 68, 0.2)); + } + } +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/list-theme.ts b/packages/survey-creator-core/src/presets/presets-theme/list-theme.ts new file mode 100644 index 0000000000..8ff9a09dd5 --- /dev/null +++ b/packages/survey-creator-core/src/presets/presets-theme/list-theme.ts @@ -0,0 +1,27 @@ +export var listComponentCss = { + root: "sps-list__container", + itemsContainer: "sps-list", + itemsContainerFiltering: "sps-list--filtering", + emptyContainer: "sps-list__empty-container", + emptyText: "sps-list__empty-text", + + filter: "sps-list__filter", + filterIcon: "sps-list__filter-icon", + filterInput: "sps-list__input", + searchClearButtonIcon: "sps-list__filter-clear-button", + + loadingIndicator: "sps-list__loading-indicator", + item: "sps-list__item", + itemSelected: "sps-list__item--selected", + itemGroup: "sps-list__item--group", + itemGroupSelected: "sps-list__item--group-selected", + itemWithIcon: "sps-list__item--with-icon", + itemDisabled: "sps-list__item--disabled", + itemFocused: "sps-list__item--focused", + itemHovered: "sps-list__item--hovered", + itemTextWrap: "sps-list__item-text--wrap", + itemIcon: "sps-list__item-icon", + itemMarkerIcon: "sps-list-item__marker-icon", + itemSeparator: "sps-list__item-separator", + itemBody: "sps-list__item-body", +}; diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index f8f4538c3f..4d033b8c37 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -9,6 +9,8 @@ @use "blocks/sps-matrixdynamic.scss"; @use "blocks/sps-table.scss"; @use "blocks/sps-launch.scss"; +@use "blocks/sps-list.scss"; +@use "blocks/sps-popup.scss"; .sps-root-modern { position: relative; From 80e9d789151819d43023f7664a1d0ad3a7b5f50d Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 21 Aug 2025 16:43:42 +0300 Subject: [PATCH 067/240] #7004 - popup styles --- .../src/presets/presets-editable-base.ts | 9 +++- .../blocks/sps-matrixdynamic.scss | 8 +++ .../presets-theme/blocks/sps-popup.scss | 49 +++++++++++++++++++ .../presets-theme/blocks/sps-question.scss | 6 --- .../presets-theme/blocks/sps-table.scss | 22 +++++---- .../src/presets/presets-theme/presets.ts | 1 + 6 files changed, 78 insertions(+), 17 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index 7ce346185f..4073d70291 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -1,5 +1,6 @@ import { Helpers, IDialogOptions, MatrixDynamicRowModel, QuestionMatrixDynamicModel, settings, SurveyModel } from "survey-core"; import { PropertyGridModel, SurveyCreatorModel, editorLocalization, CreatorPresetBase, ICreatorOptions } from "survey-creator-core"; +import { presetsCss } from "./presets-theme/presets"; export interface ICreatorPresetEditorSetup { creator: SurveyCreatorModel; @@ -167,6 +168,7 @@ export class CreatorPresetEditableBase { survey.fitToContainer = false; survey.showNavigationButtons = false; survey.data = data; + survey.css = presetsCss; const popupModel = settings.showDialog?.({ componentName: "survey", data: { survey: survey, model: survey }, @@ -184,10 +186,13 @@ export class CreatorPresetEditableBase { onCancel: () => { return true; }, - cssClass: "svc-property-editor svc-creator-popup", - title: "Detail", + cssClass: "sps-popup svc-property-editor svc-creator-popup", + title: "Edit", displayMode: "popup" }, rootElement); + if (survey.calculatedWidthMode == "responsive") { + popupModel.width = "100%"; + } return survey; } } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss index 9f41c1429b..ffe4a3f5f6 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss @@ -126,6 +126,14 @@ } } +.sps-question--matrixdynamic.sps-question--nested { + .sps-question__header { + padding: var(--sjs2-spacing-x150, 12px); + border-bottom: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #d4d4d4); + box-sizing: border-box; + } +} + .sps-matrixdynamic__dragged-row { cursor: grabbing; position: absolute; diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss index d18cc014aa..9347a35632 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss @@ -22,3 +22,52 @@ } } } + +.sps-popup { + .sps-root-modern { + height: initial; + } + .sps-page { + padding: 0; + gap: var(--sjs2-spacing-x200, 16px); + background: initial; + } + .sps-question--with-frame { + border: none; + border-radius: 0; + } + + .sps-question__header { + padding-left: 0; + padding-right: 0; + padding-top: 0; + } + .sps-question__content { + padding-left: 0; + padding-right: 0; + padding-bottom: 0; + } + + .sps-row--multiple > div { + padding-left: var(--sjs2-spacing-x400, 32px); + padding-right: var(--sjs2-spacing-x400, 32px); + &:first-of-type { + padding-left: 0; + } + &:last-of-type { + padding-right: 0; + } + } + + .sps-panel { + border: none; + border-radius: 0; + align-self: stretch; + display: flex; + flex-direction: column; + gap: var(--sjs2-spacing-x200, 16px); + .sps-row { + border: none; + } + } +} diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss index 0b147ef890..e15dff4be0 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss @@ -19,12 +19,6 @@ align-self: stretch; } -.sps-question--nested .sps-question__header { - padding: var(--sjs2-spacing-x150, 12px); - border-bottom: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #d4d4d4); - box-sizing: border-box; -} - .sps-question__title { color: var(--sjs2-color-fg-basic-primary, #1c1b20); diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss index 7e45cc79ae..7bfc4bfaa3 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -13,7 +13,7 @@ & > tbody > tr { background-color: var(--sjs2-color-bg-basic-primary, #fff); - & > td:last-of-type > .sps-action-bar .sps-action-button { + & > td:last-of-type > .sps-action-bar .sps-action-button { opacity: 0; } &:hover { @@ -43,9 +43,9 @@ } .sd-table__row--expanded { & > td { - &> div { - background: var(--sjs2-color-bg-basic-primary-dim, rgba(28, 27, 32, 0.05)); - } + & > div { + background: var(--sjs2-color-bg-basic-primary-dim, rgba(28, 27, 32, 0.05)); + } } } @@ -105,7 +105,7 @@ background-color: transparent; height: auto; padding: var(--sjs2-spacing-x100, 8px) 0; - + width: calc(100% + var(--action-container-width)); margin-right: calc(-1 * var(--action-container-width)); text-overflow: ellipsis; @@ -123,17 +123,20 @@ } .sps-table__row { - --action-width: calc(2 * var(--ctr-actionbar-button-padding-top-large-icon, 8px) + var(--ctr-actionbar-button-icon-width, var(--sjs-font-size-x3))); + --action-width: calc( + 2 * var(--ctr-actionbar-button-padding-top-large-icon, 8px) + + var(--ctr-actionbar-button-icon-width, var(--sjs-font-size-x3)) + ); --action-container-width: calc(3 * var(--action-width)); } .sps-table__row:has(> .sps-table__cell:last-of-type .sv-action:nth-child(4)) { - --action-container-width: calc(4 * var(--action-width)); + --action-container-width: calc(4 * var(--action-width)); } .sps-table__row { &:hover, - &:focus-within{ + &:focus-within { .sps-table__cell:not(.sps-table__cell--detail-panel) { .sps-input { width: 100%; @@ -172,7 +175,8 @@ animation-direction: var(--animation-direction); animation-timing-function: var(--animation-timing-function); animation-fill-mode: forwards; - animation-duration: var(--fade-animation-duration), var(--move-animation-duration), var(--move-animation-duration); + animation-duration: + var(--fade-animation-duration), var(--move-animation-duration), var(--move-animation-duration); animation-delay: var(--fade-animation-delay), var(--move-animation-delay), var(--move-animation-delay); } } diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.ts b/packages/survey-creator-core/src/presets/presets-theme/presets.ts index 57a234833d..c95ce15e7a 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.ts +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.ts @@ -222,6 +222,7 @@ export var presetsCss = { rowLeave: "sps-table__row--leave", }, matrixdynamic: { + mainRoot: "sps-question sps-question--matrixdynamic sd-element sd-question sd-row__question sd-element--complex sd-question--complex sd-question--table", tableWrapper: "sps-table-wrapper", root: "sps-table sps-matrixdynamic", content: "sps-matrixdynamic__content sps-text__content", From 0605bfd80e9105a5842e9a6b966da3c5523fd94c Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 21 Aug 2025 19:19:08 +0300 Subject: [PATCH 068/240] #7004 fix styles in popup --- .../src/presets/presets-editable-base.ts | 10 +++++++--- .../src/presets/presets-editable-categorized.ts | 2 +- .../src/presets/presets-editable-toolbox.ts | 1 + .../src/presets/presets-theme/blocks/sps-popup.scss | 12 +++++++++--- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index 4073d70291..3c9d01bb35 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -160,7 +160,7 @@ export class CreatorPresetEditableBase { return Helpers.getUnbindValue(json); } - protected showDetailPanelInPopup(matrix: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, rootElement: HTMLElement, hideDetailPanel = true) { + protected showDetailPanelInPopup(matrix: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, rootElement: HTMLElement, hideDetailPanel = true, width = "") { if (settings.showDialog) { const data = matrix.value[(matrix.visibleRows as any).findIndex(r => r === row)]; if (hideDetailPanel) row.hideDetailPanel(); @@ -190,8 +190,12 @@ export class CreatorPresetEditableBase { title: "Edit", displayMode: "popup" }, rootElement); - if (survey.calculatedWidthMode == "responsive") { - popupModel.width = "100%"; + if (!width) { + if (survey.calculatedWidthMode == "responsive") { + popupModel.width = "100%"; + } + } else { + popupModel.width = width; } return survey; } diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index fd75171366..a269dd854b 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -31,7 +31,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre // } } private editCategory(model: SurveyModel, row: MatrixDynamicRowModel) { - const survey = this.showDetailPanelInPopup(this.getQuestionCategories(model), row, model.rootElement, false); + const survey = this.showDetailPanelInPopup(this.getQuestionCategories(model), row, model.rootElement, false, "auto"); if (survey) { const category = survey.getQuestionByName("category"); const isDefault = row.getQuestionByName("isDefault"); diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 3ac02d853d..7b05af213f 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -45,6 +45,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita { "type": "panel", "name": "details", + "maxWidth": "30%", "elements": [ { type: "text", name: "name", title: "Name", isUnique: true, isRequired: true }, { type: "text", name: "iconName", title: "Icon name" }, diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss index 9347a35632..07a5754ad8 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss @@ -32,6 +32,9 @@ gap: var(--sjs2-spacing-x200, 16px); background: initial; } + .sps-row { + max-width: initial; + } .sps-question--with-frame { border: none; border-radius: 0; @@ -49,6 +52,7 @@ } .sps-row--multiple > div { + align-items: stretch; padding-left: var(--sjs2-spacing-x400, 32px); padding-right: var(--sjs2-spacing-x400, 32px); &:first-of-type { @@ -63,11 +67,13 @@ border: none; border-radius: 0; align-self: stretch; - display: flex; - flex-direction: column; - gap: var(--sjs2-spacing-x200, 16px); .sps-row { border: none; } } + .sps-panel__content { + display: flex; + flex-direction: column; + gap: var(--sjs2-spacing-x200, 16px); + } } From e600a2f58c049dd7850563d0edec02cab6563676 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 22 Aug 2025 18:33:35 +0300 Subject: [PATCH 069/240] #7004 - popup actions --- .../src/presets/presets-editable-base.ts | 19 +++++-- .../presets/presets-editable-categorized.ts | 26 ++++++--- .../src/presets/presets-editable-list.ts | 55 ++++++++++++------- .../presets-theme/blocks/sps-action-bar.scss | 28 +++++++++- .../presets-theme/blocks/sps-popup.scss | 6 ++ .../src/presets/presets-theme/presets.ts | 6 +- 6 files changed, 105 insertions(+), 35 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index 3c9d01bb35..e1e9fdbe5f 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -1,4 +1,4 @@ -import { Helpers, IDialogOptions, MatrixDynamicRowModel, QuestionMatrixDynamicModel, settings, SurveyModel } from "survey-core"; +import { Helpers, IDialogOptions, MatrixDynamicRowModel, QuestionMatrixDynamicModel, settings, SurveyModel, IAction, ActionBarCssClasses } from "survey-core"; import { PropertyGridModel, SurveyCreatorModel, editorLocalization, CreatorPresetBase, ICreatorOptions } from "survey-creator-core"; import { presetsCss } from "./presets-theme/presets"; @@ -160,7 +160,8 @@ export class CreatorPresetEditableBase { return Helpers.getUnbindValue(json); } - protected showDetailPanelInPopup(matrix: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, rootElement: HTMLElement, hideDetailPanel = true, width = "") { + protected showDetailPanelInPopup(matrix: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, rootElement: HTMLElement, options: {hideDetailPanel?: boolean, width?: string, actions?: IAction[]}) { + const hideDetailPanel = options.hideDetailPanel !== false; if (settings.showDialog) { const data = matrix.value[(matrix.visibleRows as any).findIndex(r => r === row)]; if (hideDetailPanel) row.hideDetailPanel(); @@ -190,12 +191,22 @@ export class CreatorPresetEditableBase { title: "Edit", displayMode: "popup" }, rootElement); - if (!width) { + if (!options.width) { if (survey.calculatedWidthMode == "responsive") { popupModel.width = "100%"; } } else { - popupModel.width = width; + popupModel.width = options.width; + } + + const defaultActionBarCss = popupModel.footerToolbar.cssClasses; + defaultActionBarCss.item = "sps-btn"; + popupModel.footerToolbar.cssClasses = defaultActionBarCss; + popupModel.footerToolbar.getActionById("apply").innerCss = "sps-btn--primary-brand"; + popupModel.footerToolbar.getActionById("cancel").innerCss = "sps-btn--secondary-brand"; + + if (options.actions) { + popupModel.footerToolbar.actions.unshift(...options.actions); } return survey; } diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index a269dd854b..eb0f4e6b93 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -1,4 +1,4 @@ -import { Action, FunctionFactory, Helpers, IDialogOptions, ItemValue, MatrixDropdownRowModelBase, MatrixDynamicRowModel, QuestionMatrixDropdownRenderedRow, QuestionMatrixDynamicModel, Serializer, settings, SurveyModel } from "survey-core"; +import { Action, FunctionFactory, Helpers, IAction, IDialogOptions, ItemValue, MatrixDropdownRowModelBase, MatrixDynamicRowModel, QuestionMatrixDropdownRenderedRow, QuestionMatrixDynamicModel, Serializer, settings, SurveyModel } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; import { QuestionToolboxCategory, QuestionToolboxItem, SurveyCreatorModel, SurveyJSON5, editorLocalization } from "survey-creator-core"; import { PresetItemValue, QuestionPresetRankingModel } from "./preset-question-ranking"; @@ -30,8 +30,20 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre // this.fillAutoName(this.getMatrix(model), "name"); // } } - private editCategory(model: SurveyModel, row: MatrixDynamicRowModel) { - const survey = this.showDetailPanelInPopup(this.getQuestionCategories(model), row, model.rootElement, false, "auto"); + private editCategory(model: SurveyModel, creator: SurveyCreatorModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { + const resetAction = { + id: "reset-to-default", + title: "Reset to default", + css: "sps-action--grow", + innerCss: "sps-btn sps-btn--secondary-alert", + visibleIndex: 15, + action: (a)=>{ creator.notify(a.title); } + }; + const survey = this.showDetailPanelInPopup(question, row, model.rootElement, { + hideDetailPanel: false, + width: "auto", + actions: [new Action(resetAction)] + }); if (survey) { const category = survey.getQuestionByName("category"); const isDefault = row.getQuestionByName("isDefault"); @@ -111,21 +123,21 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre enabled: false }); } - - options.actions.push({ + const resetAction = { id: "reset-to-default", iconName: "icon-reset", location: "end", visibleIndex: 15, action: ()=>{ this.resetCategory(model, options.row); } - }); + }; + options.actions.push(resetAction); options.actions.push({ id: "edit-category", iconName: "icon-edit", location: "end", visibleIndex: 13, - action: ()=>{ this.editCategory(model, options.row); } + action: ()=>{ this.editCategory(model, creator, options.question, options.row); } }); options.actions.forEach(a => { if (a.id == "show-detail") { diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index b248ff7324..db370e9de0 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -1,4 +1,4 @@ -import { FunctionFactory, Helpers, IDialogOptions, ItemValue, MatrixDropdownRowModelBase, MatrixDynamicRowModel, QuestionMatrixDynamicModel, Serializer, settings, SurveyModel } from "survey-core"; +import { FunctionFactory, Helpers, IDialogOptions, ItemValue, MatrixDropdownRowModelBase, MatrixDynamicRowModel, QuestionMatrixDynamicModel, Serializer, settings, SurveyModel, Action, IAction } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; import { QuestionToolboxCategory, QuestionToolboxItem, SurveyCreatorModel, SurveyJSON5, editorLocalization } from "survey-creator-core"; import { PresetItemValue, QuestionPresetRankingModel } from "./preset-question-ranking"; @@ -24,17 +24,24 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { // this.fillAutoName(this.getMatrix(model), "name"); // } } - protected updateOnMatrixDetailPanelVisibleChangedCore(model: SurveyModel, creator: SurveyCreatorModel, options: any): void { - if (this.isItemsMatrix(options.question)) { - const survey = this.showDetailPanelInPopup(options.question, options.row, model.rootElement); - const isDefault = options.row.getQuestionByName("isDefault"); - if (survey) { - const name = survey.getQuestionByName("name"); - if (name && isDefault) name.readOnly = isDefault.value; - } + private editItem(model: SurveyModel, creator: SurveyCreatorModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { + const resetAction = { + id: "reset-to-default", + title: "Reset to default", + css: "sps-action--grow", + innerCss: "sps-btn sps-btn--secondary-alert", + visibleIndex: 15, + action: (a)=>{ creator.notify(a.title); } + }; + const survey = this.showDetailPanelInPopup(question, row, model.rootElement, { actions: [new Action(resetAction)] }); + const isDefault = row.getQuestionByName("isDefault"); + if (survey) { + const name = survey.getQuestionByName("name"); + if (name && isDefault) name.readOnly = isDefault.value; } } - private resetItems(model: SurveyModel, row: MatrixDynamicRowModel) { + + private resetItem(model: SurveyModel, row: MatrixDynamicRowModel) { } protected restoreItems(questionItems: QuestionMatrixDynamicModel, questionHiddenItems: QuestionMatrixDynamicModel, rowIndex: number) { const rowData = questionHiddenItems.value[rowIndex]; @@ -61,22 +68,32 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { location: "start", enabled: false }); - options.actions.push({ - id: "reset-to-default", - iconName: "icon-reset", - location: "end", - visibleIndex: 15, - action: ()=>{ this.resetItems(model, options.row); } - }); - } + const resetAction = { + id: "reset-to-default", + iconName: "icon-reset", + title: "Reset to defaults", + location: "end", + visibleIndex: 15, + action: ()=>{ this.resetItem(model, options.row); } + }; + const resetActionForRow = { ...resetAction, ...{ title: undefined } }; + options.actions.push(resetActionForRow); + options.question.cssClasses.detailIconExpandedId = "icon-edit"; options.question.cssClasses.detailIconId = "icon-edit"; - + options.actions.push({ + id: "edit-category", + iconName: "icon-edit", + location: "end", + visibleIndex: 13, + action: ()=>{ this.editItem(model, creator, options.question, options.row); } + }); options.actions.forEach(a => { if (a.id == "show-detail") { a.location = "end"; a.iconName = "icon-edit", + a.visible = false, a.visibleIndex = 10; } if (a.id == "remove-row") { diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss index b266de94cc..2e88929fd9 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss @@ -11,6 +11,14 @@ white-space: nowrap; } +.sps-action { + display: flex; +} + +.sps-action--grow { + flex-grow: 1; +} + .sps-btn { appearance: none; border: none; @@ -35,7 +43,8 @@ @include sjs2--typography--default-strong; - &:hover { + &:hover, + &:focus { background: var(--sjs2-color-bg-brand-primary-dim, #15987e); } &:active { @@ -43,13 +52,28 @@ } } -.sps-footer__prev-btn { +.sps-btn--secondary-brand { background: var(--sjs2-color-bg-brand-secondary, rgba(25, 179, 148, 0.1)); color: var(--sjs2-color-fg-brand-primary, #19b394); &:hover, &:focus { background: var(--sjs2-color-bg-brand-secondary-dim, rgba(25, 179, 148, 0.15)); } + &:active{ + background: var(--sjs2-color-bg-brand-secondary, rgba(25, 179, 148, 0.1)); + } +} + +.sps-btn--secondary-alert { + background: var(--sjs2-color-bg-alert-secondary, rgba(229, 10, 62, 0.10)); + color: var(--sjs2-color-fg-alert-primary, #C30935); + &:hover, + &:focus { + background: var(--sjs2-color-bg-alert-secondary-dim, rgba(229, 10, 62, 0.15)); + } + &:active{ + background: var(--sjs2-color-bg-alert-secondary, rgba(229, 10, 62, 0.10)); + } } .sps-action-button { diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss index 07a5754ad8..80a2444a0f 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss @@ -27,6 +27,12 @@ .sps-root-modern { height: initial; } + + .sv-action-bar { + width: 100%; + justify-content: flex-end; + } + .sps-page { padding: 0; gap: var(--sjs2-spacing-x200, 16px); diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.ts b/packages/survey-creator-core/src/presets/presets-theme/presets.ts index c95ce15e7a..1595388751 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.ts +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.ts @@ -16,9 +16,9 @@ export var presetsCss = { bodyNavigationButton: "", completedPage: "sps-completedpage", navigation: { - complete: "sps-btn sps-footer__complete-btn", - prev: "sps-btn sps-footer__prev-btn", - next: "sps-btn sps-footer__next-btn", + complete: "sps-btn sps-btn--primary-brand sps-footer__complete-btn", + prev: "sps-btn sps-btn--secondary-brand sps-footer__prev-btn", + next: "sps-btn sps-btn--primary-brand sps-footer__next-btn", start: "sps-btn sps-footer__start-btn", preview: "sps-btn sps-footer__preview-btn", edit: "sps-btn sps-footer__edit-btn" From 0d86464f794a7077c43bbafff2685e1dfd58be42 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 22 Aug 2025 18:34:22 +0300 Subject: [PATCH 070/240] #7004 - refactoring --- .../presets/presets-editable-categorized.ts | 79 ++++++++-------- .../src/presets/presets-editable-list.ts | 94 +++++++++++-------- 2 files changed, 97 insertions(+), 76 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index eb0f4e6b93..9f4e9735fe 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -16,7 +16,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre protected get nameCategories() { return this.fullPath + "_categories"; } public getMainElementName() : any { return this.nameCategories; } //private fillAutoName(question: QuestionMatrixDynamicModel, propName: string) { - // question.value?.filter(v =>v.isDefault === false && !v[propName]).forEach(v => v[propName] = this.replaceNonLettersWithDash(v.title)); + // question.value?.filter(v =>v.isDefault === false && !v[propName]).forEach(v => v.category = this.replaceNonLettersWithDash(v.title)); //} public get questionNames() { return [this.nameCategories]; @@ -30,6 +30,39 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre // this.fillAutoName(this.getMatrix(model), "name"); // } } + + protected createCategoryEditAction(model: SurveyModel, creator: SurveyCreatorModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel): IAction { + return { + id: "edit-category", + iconName: "icon-edit", + location: "end", + visibleIndex: 13, + action: () => { this.editCategory(model, creator, question, row); } + }; + } + + protected setupCategoryCssClasses(question: QuestionMatrixDynamicModel): void { + question.cssClasses.detailIconExpandedId = "icon-collapse-24x24"; + question.cssClasses.detailIconId = "icon-expand-24x24"; + } + + protected setupCategoryActions(actions: IAction[], question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel): void { + actions.forEach(a => { + if (a.id == "show-detail") { + a.location = "end"; + a.iconName = "icon-expand-24x24"; + a.visibleIndex = 10; + } + if (a.id == "remove-row") { + a.visibleIndex = 20; + a.component = "sv-action-bar-item"; + a.action = () => question.removeRowUI(row); + a.iconName = "icon-delete_24x24"; + a.innerCss = "sps-action-button sps-action-button--icon sps-action-button--danger"; + } + }); + } + private editCategory(model: SurveyModel, creator: SurveyCreatorModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { const resetAction = { id: "reset-to-default", @@ -110,49 +143,19 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre protected onGetMatrixRowActionsCore(model: SurveyModel, creator: SurveyCreatorModel, options: any): void { super.onGetMatrixRowActionsCore(model, creator, options); if (options.question.name === this.nameCategories) { - options.question.cssClasses.detailIconExpandedId = "icon-collapse-24x24"; - options.question.cssClasses.detailIconId = "icon-expand-24x24"; + this.setupCategoryCssClasses(options.question); const iconName = options.question.value?.filter(v => v.category == options.row.getValue("category"))[0]?.iconName; if (iconName) { - options.actions.push({ - id: iconName, - iconName: iconName, - innerCss: "sps-matrix-row-icon", - location: "start", - enabled: false - }); + options.actions.push(super.createIconAction(iconName, "sps-matrix-row-icon")); } - const resetAction = { - id: "reset-to-default", - iconName: "icon-reset", - location: "end", - visibleIndex: 15, - action: ()=>{ this.resetCategory(model, options.row); } - }; + + const resetAction = super.createResetAction(model, options.row, () => { this.resetCategory(model, options.row); }); options.actions.push(resetAction); - options.actions.push({ - id: "edit-category", - iconName: "icon-edit", - location: "end", - visibleIndex: 13, - action: ()=>{ this.editCategory(model, creator, options.question, options.row); } - }); - options.actions.forEach(a => { - if (a.id == "show-detail") { - a.location = "end"; - a.iconName = "icon-expand-24x24", - a.visibleIndex = 10; - } - if (a.id == "remove-row") { - a.visibleIndex = 20; - a.component = "sv-action-bar-item"; - a.action = () => options.question.removeRowUI(options.row); - a.iconName = "icon-delete_24x24"; - a.innerCss = "sps-action-button sps-action-button--icon sps-action-button--danger"; - } - }); + options.actions.push(this.createCategoryEditAction(model, creator, options.question, options.row)); + + this.setupCategoryActions(options.actions, options.question, options.row); } } public onMatrixRowRemoving(model: SurveyModel, creator: SurveyCreatorModel, options: any) { diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index db370e9de0..e704b3dca6 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -16,6 +16,54 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { //private fillAutoName(question: QuestionMatrixDynamicModel, propName: string) { // question.value?.filter(v =>v.isDefault === false && !v[propName]).forEach(v => v[propName] = this.replaceNonLettersWithDash(v.title)); //} + + protected createResetAction(model: SurveyModel, row: MatrixDynamicRowModel, action: () => void): IAction { + return { + id: "reset-to-default", + iconName: "icon-reset", + location: "end", + visibleIndex: 15, + action: action + }; + } + + protected createEditAction(model: SurveyModel, creator: SurveyCreatorModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel): IAction { + return { + id: "edit-category", + iconName: "icon-edit", + location: "end", + visibleIndex: 13, + action: () => { this.editItem(model, creator, question, row); } + }; + } + + protected createIconAction(iconName: string, cssClass: string = "sps-matrixdynamic__row-icon"): IAction { + return { + id: iconName, + iconName: iconName, + innerCss: cssClass, + location: "start", + enabled: false + }; + } + + protected setupStandardActions(actions: IAction[], question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, isItemsMatrix: boolean = false): void { + actions.forEach(a => { + if (a.id == "show-detail") { + a.location = "end"; + a.iconName = "icon-edit"; + a.visible = false; + a.visibleIndex = 10; + } + if (a.id == "remove-row") { + a.visibleIndex = 20; + a.component = "sv-action-bar-item"; + a.action = () => question.removeRowUI(row); + a.iconName = isItemsMatrix ? "icon-add_24x24" : "icon-remove_24x24"; + } + }); + } + protected updateOnValueChangedCore(model: SurveyModel, name: string) { // if (name == this.nameCategories) { // this.fillAutoName(this.getQuestionCategories(model), "category"); @@ -61,48 +109,18 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { if (this.isItemsMatrix(options.question)) { const iconName = options.question.value?.filter(v => v.name == options.row.getValue("name"))[0]?.iconName; if (iconName) { - options.actions.push({ - id: iconName, - iconName: iconName, - innerCss: "sps-matrixdynamic__row-icon", - location: "start", - enabled: false - }); + options.actions.push(this.createIconAction(iconName)); } - const resetAction = { - id: "reset-to-default", - iconName: "icon-reset", - title: "Reset to defaults", - location: "end", - visibleIndex: 15, - action: ()=>{ this.resetItem(model, options.row); } - }; - const resetActionForRow = { ...resetAction, ...{ title: undefined } }; - options.actions.push(resetActionForRow); + + const resetAction = this.createResetAction(model, options.row, () => { this.resetItem(model, options.row); }); + options.actions.push(resetAction); options.question.cssClasses.detailIconExpandedId = "icon-edit"; options.question.cssClasses.detailIconId = "icon-edit"; - options.actions.push({ - id: "edit-category", - iconName: "icon-edit", - location: "end", - visibleIndex: 13, - action: ()=>{ this.editItem(model, creator, options.question, options.row); } - }); - options.actions.forEach(a => { - if (a.id == "show-detail") { - a.location = "end"; - a.iconName = "icon-edit", - a.visible = false, - a.visibleIndex = 10; - } - if (a.id == "remove-row") { - a.visibleIndex = 20; - a.component = "sv-action-bar-item"; - a.action = () => options.question.removeRowUI(options.row); - a.iconName = options.question.name == this.nameMatrix ? "icon-add_24x24" : "icon-remove_24x24"; - } - }); + + options.actions.push(this.createEditAction(model, creator, options.question, options.row)); + + this.setupStandardActions(options.actions, options.question, options.row, options.question.name == this.nameMatrix); } } public onMatrixRowDragOver(model: SurveyModel, creator: SurveyCreatorModel, options: any) { From dd1abdffcf490a64dda6932a1eeeaf254e49f8d7 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 22 Aug 2025 18:47:47 +0300 Subject: [PATCH 071/240] #7004 titles in dialogs Fixes #7004 --- .../src/presets/presets-editable-properties.ts | 3 ++- .../src/presets/presets-editable-tabs.ts | 3 ++- .../src/presets/presets-editable-toolbox.ts | 6 ++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 4527b4ae7a..dde557c1ee 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -280,7 +280,8 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare ], detailPanelMode: "underRow", detailElements: [ - { type: "text", name: "category", title: "Category", isRequired: true, visible: false }, + { type: "text", name: "category", title: "Name", isRequired: true, visible: false }, + { type: "text", name: "title", title: "Title", visible: false }, { type: "text", name: "iconName", title: "Icon Name", visible: false }, this.createItemsMatrixJSON({ name: this.nameInnerMatrix, diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index 30f7372c31..0c4909e6cb 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -31,7 +31,8 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { ], detailPanelMode: "underRow", detailElements: [ - { type: "text", name: "name", title: "Name", isUnique: true, isRequired: true }, + { type: "text", name: "name", title: "Name", isUnique: true, isRequired: true, readOnly: true }, + { type: "text", name: "title", title: "Title" }, { type: "text", name: "iconName", title: "Icon name" } ] }; diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 7b05af213f..4aaaf63a9a 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -48,6 +48,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita "maxWidth": "30%", "elements": [ { type: "text", name: "name", title: "Name", isUnique: true, isRequired: true }, + { type: "text", name: "title", title: "Title" }, { type: "text", name: "iconName", title: "Icon name" }, { type: "text", name: "tooltip", title: "Tooltip" }, ] @@ -98,8 +99,9 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita ], detailPanelMode: "underRow", detailElements: [ - { type: "text", name: "category", isRequired: true, visible: false }, - { type: "text", name: "tooltip", visible: false }, + { type: "text", name: "category", title: "Name", isRequired: true, visible: false }, + { type: "text", name: "title", title: "Title", visible: false }, + { type: "text", name: "tooltip", title: "Tooltip", visible: false }, this.createItemsMatrixJSON({ name: this.nameInnerMatrix, titleLocation: "hidden", From fa59f2d5575b693c631f66341372f01201442e65 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 25 Aug 2025 14:57:17 +0300 Subject: [PATCH 072/240] #7004 reset items and fix tests --- .../src/presets/presets-editable-base.ts | 16 +++++++----- .../src/presets/presets-editable-list.ts | 14 ++++++++-- .../presets/presets-editable-properties.ts | 1 - .../src/presets/presets-editor.ts | 14 ++-------- .../src/presets/presets-plugin.ts | 1 + .../presets-editable-base.test.ts | 26 +++++++++++++------ .../presets-editor-toolbox.tests.ts | 26 +++++++++++++++++-- .../tests-presets/presets-editor.tests.ts | 1 + 8 files changed, 67 insertions(+), 32 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index e1e9fdbe5f..ffe8d68fa8 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -199,14 +199,16 @@ export class CreatorPresetEditableBase { popupModel.width = options.width; } - const defaultActionBarCss = popupModel.footerToolbar.cssClasses; - defaultActionBarCss.item = "sps-btn"; - popupModel.footerToolbar.cssClasses = defaultActionBarCss; - popupModel.footerToolbar.getActionById("apply").innerCss = "sps-btn--primary-brand"; - popupModel.footerToolbar.getActionById("cancel").innerCss = "sps-btn--secondary-brand"; + if (popupModel.footerToolbar) { + const defaultActionBarCss = popupModel.footerToolbar.cssClasses; + defaultActionBarCss.item = "sps-btn"; + popupModel.footerToolbar.cssClasses = defaultActionBarCss; + popupModel.footerToolbar.getActionById("apply").innerCss = "sps-btn--primary-brand"; + popupModel.footerToolbar.getActionById("cancel").innerCss = "sps-btn--secondary-brand"; - if (options.actions) { - popupModel.footerToolbar.actions.unshift(...options.actions); + if (options.actions) { + popupModel.footerToolbar.actions.unshift(...options.actions); + } } return survey; } diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index e704b3dca6..339d68f9a2 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -89,7 +89,17 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { } } - private resetItem(model: SurveyModel, row: MatrixDynamicRowModel) { + private resetItem(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { + const name = row.getValue("name"); + const defaultItems = this.defaultItems.filter(i => i.name == name)[0]; + if (defaultItems) { + const value = question.value; + const itemRow = value.filter(v => v.name == name)[0]; + Object.keys(itemRow).forEach((key) => { + itemRow[key] = defaultItems[key]; + }); + question.value = value; + } } protected restoreItems(questionItems: QuestionMatrixDynamicModel, questionHiddenItems: QuestionMatrixDynamicModel, rowIndex: number) { const rowData = questionHiddenItems.value[rowIndex]; @@ -112,7 +122,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { options.actions.push(this.createIconAction(iconName)); } - const resetAction = this.createResetAction(model, options.row, () => { this.resetItem(model, options.row); }); + const resetAction = this.createResetAction(model, options.row, () => { this.resetItem(model, options.question, options.row); }); options.actions.push(resetAction); options.question.cssClasses.detailIconExpandedId = "icon-edit"; diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index dde557c1ee..af5985874c 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -343,7 +343,6 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare this.localeStrings = { pe: locStrs.pe || {}, pehelp: locStrs.pehelp || {} }; } protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel, active: boolean): void { - (creator.getPlugin("designer") as any).tabControlModel.expandCollapseAction.enabled = active; creator.setShowSidebar(active); this.propertyGridSetObj(active ? this.currentProperties?.getObj() : null); } diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index da21908b67..6a2a90f0a8 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -102,19 +102,9 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit model.css = presetsCss; model.editablePresets = editablePresets; model.keepIncorrectValues = true; - model.showCompleteButton = false; model.showNavigationButtons = false; - model.registerFunctionOnPropertyValueChanged("isShowNextButton", () => { - model.setPropertyValue("isShowNextButton", true); - }); - const nextButton = model.navigationBar.getActionById("sv-nav-next"); - nextButton.action = (): void => { - if (!model.isLastPage) { - model.nextPageUIClick(); - } else { - model.currentPageNo = 0; - } - }; + model.completeText = "Save & Exit"; + model.pagePrevText = "Back"; editablePresets.forEach(item => item.setupQuestions(model, this)); if (!this.defaultJsonValue) { diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 1c9f589f98..ccab40a1c8 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -44,6 +44,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { } this.model.model.currentPageNo = this.currentPresetIndex; this.designerPlugin.activateSidebar(); + this.model.model.onComplete.add(() => this.hidePresets()); const presets = this.model?.model.pages.map(p => { id: p.name, title: p.navigationTitle }); const tools = [ diff --git a/packages/survey-creator-core/tests-presets/presets-editable-base.test.ts b/packages/survey-creator-core/tests-presets/presets-editable-base.test.ts index b9cf38342a..729a85c5e2 100644 --- a/packages/survey-creator-core/tests-presets/presets-editable-base.test.ts +++ b/packages/survey-creator-core/tests-presets/presets-editable-base.test.ts @@ -65,25 +65,35 @@ describe("CreatorPresetEditableBase", () => { describe("showDetailPanelInPopup", () => { it("should hide detail panel and create popup with survey", () => { + mockShowDialog.mockImplementation((options) => { + return { dispose: jest.fn() }; + }); + // Act - base["showDetailPanelInPopup"](mockMatrix, mockRow, mockRootElement); + base["showDetailPanelInPopup"](mockMatrix, mockRow, mockRootElement, {}); // Assert expect(mockRow.isDetailPanelShowing).toBeFalsy(); expect(mockShowDialog).toHaveBeenCalledWith( expect.objectContaining({ componentName: "survey", - cssClass: "svc-property-editor svc-creator-popup", - title: "Detail", - displayMode: "popup" + cssClass: "sps-popup svc-property-editor svc-creator-popup", + title: "Edit", + displayMode: "popup", + data: expect.any(Object), + onApply: expect.any(Function), + onCancel: expect.any(Function) }), mockRootElement ); }); it("should create survey with correct configuration", () => { + mockShowDialog.mockImplementation((options) => { + return { dispose: jest.fn() }; + }); // Act - base["showDetailPanelInPopup"](mockMatrix, mockRow, mockRootElement); + base["showDetailPanelInPopup"](mockMatrix, mockRow, mockRootElement, {}); // Assert const dialogOptions = mockShowDialog.mock.calls[0][0]; @@ -106,7 +116,7 @@ describe("CreatorPresetEditableBase", () => { }); // Act - base["showDetailPanelInPopup"](mockMatrix, mockRow, mockRootElement); + base["showDetailPanelInPopup"](mockMatrix, mockRow, mockRootElement, {}); const survey = mockShowDialog.mock.calls[0][0].data.survey; survey.data = newValue; @@ -126,7 +136,7 @@ describe("CreatorPresetEditableBase", () => { }); // Act - base["showDetailPanelInPopup"](mockMatrix, mockRow, mockRootElement); + base["showDetailPanelInPopup"](mockMatrix, mockRow, mockRootElement, {}); const survey = mockShowDialog.mock.calls[0][0].data.survey; survey.data = { question1: "" }; // Empty value will fail validation @@ -146,7 +156,7 @@ describe("CreatorPresetEditableBase", () => { }); // Act - base["showDetailPanelInPopup"](mockMatrix, mockRow, mockRootElement); + base["showDetailPanelInPopup"](mockMatrix, mockRow, mockRootElement, {}); // Assert expect(onCancelCallback).toBeDefined(); diff --git a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts index af80384586..19690f6bf2 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts @@ -241,6 +241,22 @@ test("Preset edit, toolbox - reset category", () => { expect(hiddenQuestion.value.map(i => i.name)).toEqual(["comment", "paneldynamic"]); }); +test("Preset edit, toolbox - reset item", () => { + const editor = new CreatorPresetEditorModel(); + const survey = editor.model; + survey.getQuestionByName("toolbox_mode").value = "items"; + const itemQuestion = survey.getQuestionByName("toolbox_items"); + const itemsValue = itemQuestion.value; + + itemsValue.filter(c => c.name == "text")[0].title = "TextChanged"; + + const row = itemQuestion.visibleRows.filter(r => r.getValue("name") == "text")[0]; + const renderedRow = itemQuestion.renderedTable.rows.filter(r => r.row == row)[0]; + renderedRow.cells[renderedRow.cells.length - 1].item.value.actions.filter(a => a.id == "reset-to-default")[0].action(); + + expect(itemsValue.filter(c => c.name == "text")[0].title).toEqual("Single-Line Input"); +}); + test("Preset edit, toolbox - default names in categories", () => { const editor = new CreatorPresetEditorModel(); const survey = editor.model; @@ -339,11 +355,17 @@ test("Preset edit, toolbox - edit item", () => { itemsQuestion.addRow(); expect(itemsQuestion.visibleRows).toHaveLength(2); - matrixQuestion.visibleRows[0].showDetailPanel(); + const renderedRow = itemsQuestion.renderedTable.rows.filter(r => r.row == itemsQuestion.visibleRows[0])[0]; + const editItemAction = renderedRow.cells[renderedRow.cells.length - 1].item.value.actions.filter(a => a.id == "edit-category")[0]; + editItemAction.action(); + const nameQuestion = popupSurvey!.getQuestionByName("name"); expect(nameQuestion.readOnly).toBeTruthy(); - matrixQuestion.visibleRows[1].showDetailPanel(); + const renderedRow2 = matrixQuestion.renderedTable.rows.filter(r => r.row == matrixQuestion.visibleRows[1])[0]; + const editItemAction2 = renderedRow2.cells[renderedRow2.cells.length - 1].item.value.actions.filter(a => a.id == "edit-category")[0]; + editItemAction2.action(); + const nameQuestion2 = popupSurvey!.getQuestionByName("name"); expect(nameQuestion2.readOnly).toBeFalsy(); diff --git a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts index 8f420a6537..207cce451c 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts @@ -246,6 +246,7 @@ test("Preset edit model, toolbox items, default value and apply", () => { question.value = question.value.filter(r => ["boolean", "text", "checkbox"].indexOf(r.name) >= 0).sort((a, b)=>a.name < b.name ? 1 : -1); const etalon: ICreatorPresetData = { toolbox: { + categories: [], definition: [{ name: "text" }, { name: "checkbox" }, { name: "boolean" }] } }; From fc7e84e65a29078dbc4d26e381589a9af4f5fe82 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 25 Aug 2025 14:57:56 +0300 Subject: [PATCH 073/240] #7004 - some code for reset enable/disable --- .../src/presets/presets-editable-list.ts | 15 +++++++++++++-- .../src/presets/presets-editable-properties.ts | 3 ++- .../src/presets/presets-editable-tabs.ts | 4 +++- .../src/presets/presets-editable-toolbox.ts | 3 ++- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 339d68f9a2..1e84dd9c1f 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -1,4 +1,4 @@ -import { FunctionFactory, Helpers, IDialogOptions, ItemValue, MatrixDropdownRowModelBase, MatrixDynamicRowModel, QuestionMatrixDynamicModel, Serializer, settings, SurveyModel, Action, IAction } from "survey-core"; +import { FunctionFactory, Helpers, IDialogOptions, ItemValue, MatrixDropdownRowModelBase, MatrixDynamicRowModel, QuestionMatrixDynamicModel, Serializer, settings, SurveyModel, Action, IAction, ComputedUpdater } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; import { QuestionToolboxCategory, QuestionToolboxItem, SurveyCreatorModel, SurveyJSON5, editorLocalization } from "survey-creator-core"; import { PresetItemValue, QuestionPresetRankingModel } from "./preset-question-ranking"; @@ -22,6 +22,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { id: "reset-to-default", iconName: "icon-reset", location: "end", + enabled: new ComputedUpdater(() => row.getQuestionByName("isModified")?.value), visibleIndex: 15, action: action }; @@ -64,7 +65,17 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { }); } - protected updateOnValueChangedCore(model: SurveyModel, name: string) { + protected updateOnValueChangedCore(model: SurveyModel, name: string): void { + // const question = model.getQuestionByName(name); + // if (this.isItemsMatrix(question as any)) { + // const value = { ...question.value }; + // question.value?.forEach((row) => { + // const defaultItem = this.defaultItems.filter(i => i.name == row.name)[0]; + // row.isModified = Helpers.isTwoValueEquals(row, defaultItem); + // }); + // question.value = { value }; + // } + // if (name == this.nameCategories) { // this.fillAutoName(this.getQuestionCategories(model), "category"); // } diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index af5985874c..00ebf3a365 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -232,7 +232,8 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare }, { "name": "title" - } + }, + { name: "isModified", type: "boolean", defaultValue: true, visible: false } ], detailPanelMode: "underRow", detailElements: [ diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index 0c4909e6cb..4ca0ca3291 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -27,7 +27,8 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { { "name": "title" }, - { name: "isDefault", type: "boolean", defaultValue: false, visible: false } + { name: "isDefault", type: "boolean", defaultValue: false, visible: false }, + { name: "isModified", type: "boolean", defaultValue: true, visible: false } ], detailPanelMode: "underRow", detailElements: [ @@ -177,6 +178,7 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { activeQ.choices = this.defaultItems.map(t => new ItemValue(t.name, t.title)); } protected updateOnValueChangedCore(model: SurveyModel, name: string): void { + super.updateOnValueChangedCore(model, name); if (name === this.nameItems) { const val = model.getValue(name) || []; model.getQuestionByName(this.nameActiveTab).visible = val.length > 1; diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 4aaaf63a9a..6bb14c5c3d 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -38,7 +38,8 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita { "name": "title" }, - { name: "isDefault", type: "boolean", defaultValue: false, visible: false } + { name: "isDefault", type: "boolean", defaultValue: false, visible: false }, + { name: "isModified", type: "boolean", defaultValue: true, visible: false } ], detailPanelMode: "underRow", detailElements: [ From 7701d69629c06fbcf9310d880efc0dc748d26248 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 25 Aug 2025 19:09:01 +0300 Subject: [PATCH 074/240] #7004 - in popup reset --- .../src/presets/presets-editable-categorized.ts | 9 +++++++-- .../src/presets/presets-editable-list.ts | 11 ++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 9f4e9735fe..a81572acf7 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -64,15 +64,20 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre } private editCategory(model: SurveyModel, creator: SurveyCreatorModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { + let survey; const resetAction = { id: "reset-to-default", title: "Reset to default", css: "sps-action--grow", innerCss: "sps-btn sps-btn--secondary-alert", visibleIndex: 15, - action: (a)=>{ creator.notify(a.title); } + action: (a)=>{ + const defaultItem = this.defaultItems.filter(i => i.name == survey.getQuestionByName("category").value)[0]; + survey.data = defaultItem; + creator.notify(a.title); + } }; - const survey = this.showDetailPanelInPopup(question, row, model.rootElement, { + survey = this.showDetailPanelInPopup(question, row, model.rootElement, { hideDetailPanel: false, width: "auto", actions: [new Action(resetAction)] diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 1e84dd9c1f..d62a18245b 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -84,17 +84,22 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { // } } private editItem(model: SurveyModel, creator: SurveyCreatorModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { + let survey; const resetAction = { id: "reset-to-default", title: "Reset to default", css: "sps-action--grow", innerCss: "sps-btn sps-btn--secondary-alert", visibleIndex: 15, - action: (a)=>{ creator.notify(a.title); } + action: (a)=>{ + const defaultItem = this.defaultItems.filter(i => i.name == survey.getQuestionByName("name").value)[0]; + survey.data = defaultItem; + creator.notify(a.title); + } }; - const survey = this.showDetailPanelInPopup(question, row, model.rootElement, { actions: [new Action(resetAction)] }); - const isDefault = row.getQuestionByName("isDefault"); + survey = this.showDetailPanelInPopup(question, row, model.rootElement, { actions: [new Action(resetAction)] }); if (survey) { + const isDefault = row.getQuestionByName("isDefault"); const name = survey.getQuestionByName("name"); if (name && isDefault) name.readOnly = isDefault.value; } From 12982f1d5d149866ce93e59c06e2e3ceebe13ab4 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 25 Aug 2025 19:14:52 +0300 Subject: [PATCH 075/240] #7004 - fixed icons in property grid settings --- .../src/presets/presets-editable-categorized.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index a81572acf7..1e253b0a22 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -152,7 +152,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre const iconName = options.question.value?.filter(v => v.category == options.row.getValue("category"))[0]?.iconName; if (iconName) { - options.actions.push(super.createIconAction(iconName, "sps-matrix-row-icon")); + options.actions.push(super.createIconAction(iconName)); } const resetAction = super.createResetAction(model, options.row, () => { this.resetCategory(model, options.row); }); From 25088a1a38a0bb349ec354e6e8ab95edcfe7f93e Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 26 Aug 2025 14:59:05 +0300 Subject: [PATCH 076/240] #7004 disable creator parts --- .../src/components/side-bar/tab-control.scss | 7 +++++++ .../src/components/tabs/designer-plugin.ts | 4 ++++ .../src/components/toolbox/toolbox-tool.scss | 3 +++ .../src/components/toolbox/toolbox.scss | 4 +++- packages/survey-creator-core/src/creator-base.ts | 5 +++++ .../src/presets/presets-editable-languages.ts | 2 +- .../src/presets/presets-editable-properties.ts | 2 +- .../src/presets/presets-editable-toolbox.ts | 4 +++- packages/survey-creator-core/src/utils/actions.ts | 1 + 9 files changed, 28 insertions(+), 4 deletions(-) diff --git a/packages/survey-creator-core/src/components/side-bar/tab-control.scss b/packages/survey-creator-core/src/components/side-bar/tab-control.scss index d1866f561c..2051f15ace 100644 --- a/packages/survey-creator-core/src/components/side-bar/tab-control.scss +++ b/packages/survey-creator-core/src/components/side-bar/tab-control.scss @@ -175,6 +175,13 @@ opacity: var(--ctr-menu-toolbar-button-opacity-pressed, 0.5); background: var(--ctr-menu-toolbar-button-background-color-pressed, var(--sjs-layer-1-background-400, #f5f5f5ff)); } +.svc-menu-action__button.svc-menu-action__button--disabled { + pointer-events: none; + use { + opacity: var(--ctr-toolbox-item-icon-opacity-disabled, 0.25); + fill: var(--ctr-toolbox-item-icon-color-disabled, var(--sjs-layer-1-foreground-100, #000000e6)); + } +} .svc-menu-action__button.svc-menu-action__button--with-subtitle { padding: var(--ctr-menu-toolbar-button-padding-top-with-description, var(--sjs-spacing-x05)) var(--ctr-menu-toolbar-button-padding-right-with-description, var(--sjs-spacing-x150)) diff --git a/packages/survey-creator-core/src/components/tabs/designer-plugin.ts b/packages/survey-creator-core/src/components/tabs/designer-plugin.ts index 3ed54f6bf4..0d0fc0f727 100644 --- a/packages/survey-creator-core/src/components/tabs/designer-plugin.ts +++ b/packages/survey-creator-core/src/components/tabs/designer-plugin.ts @@ -94,6 +94,10 @@ export class TabDesignerPlugin implements ICreatorPlugin { this.updateTabControl(); } + public setSidebarEnabled(value: boolean) { + this.tabControlModel.expandCollapseAction.enabled = value; + } + private updateActivePage(showPlaceholder = true) { if (this.showOneCategoryInPropertyGrid) { this.setActivePage(this.creator.survey.pageCount || !showPlaceholder ? this.propertyGridTab.id : this.propertyGridPlaceholderPage.id); diff --git a/packages/survey-creator-core/src/components/toolbox/toolbox-tool.scss b/packages/survey-creator-core/src/components/toolbox/toolbox-tool.scss index 67026ea6e5..b57121bd6e 100644 --- a/packages/survey-creator-core/src/components/toolbox/toolbox-tool.scss +++ b/packages/survey-creator-core/src/components/toolbox/toolbox-tool.scss @@ -408,6 +408,9 @@ align-self: flex-start; pointer-events: all; } + .svc-toolbox__tool--disabled { + pointer-events: none; + } .svc-toolbox__search-button { padding-inline-start: var(--ctr-toolbox-item-margin-horizontal-no-text, var(--sjs-spacing-x05)); } diff --git a/packages/survey-creator-core/src/components/toolbox/toolbox.scss b/packages/survey-creator-core/src/components/toolbox/toolbox.scss index 8d0d36fc0f..588503c241 100644 --- a/packages/survey-creator-core/src/components/toolbox/toolbox.scss +++ b/packages/survey-creator-core/src/components/toolbox/toolbox.scss @@ -301,6 +301,8 @@ } .svc-toolbox--disabled { - opacity: 0.5; pointer-events: none; + .svc-toolbox__search-button { + pointer-events: none; + } } diff --git a/packages/survey-creator-core/src/creator-base.ts b/packages/survey-creator-core/src/creator-base.ts index b997a5d50e..c717715062 100644 --- a/packages/survey-creator-core/src/creator-base.ts +++ b/packages/survey-creator-core/src/creator-base.ts @@ -1748,6 +1748,11 @@ export class SurveyCreatorModel extends Base this.onShowPropertyGridVisiblityChanged.fire(this, { show: val }); } } + public setSidebarEnabled(value: boolean) { + this.setShowSidebar(value, true); + const designerPlugin = this.getPlugin("designer") as TabDesignerPlugin; + designerPlugin.setSidebarEnabled(value); + } public setShowSidebar(value: boolean, isManualMode = false) { this.showSidebarValue = value; if (isManualMode) { diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index b49acacb17..bc2fbfaa7b 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -127,7 +127,7 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { } } protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel, active: boolean): void { - creator.setShowSidebar(active); + creator.setSidebarEnabled(active); this.propertyGridSetObj(active ? locPreview : null); } protected updateOnValueChangedCore(model: SurveyModel, name: string): void { diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 00ebf3a365..b37b18977f 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -344,7 +344,7 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare this.localeStrings = { pe: locStrs.pe || {}, pehelp: locStrs.pehelp || {} }; } protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel, active: boolean): void { - creator.setShowSidebar(active); + creator.setSidebarEnabled(active); this.propertyGridSetObj(active ? this.currentProperties?.getObj() : null); } diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 6bb14c5c3d..dcc3d0a19b 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -245,8 +245,10 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel, active: boolean): void { creator.toolbox.forceCompact = !active; creator.toolbox.isCompact = !active; - creator.toolbox.items.forEach(i => i.enabled = active); creator.readOnly = active; + creator.toolbox.items.forEach(i => i.enabled = active); + creator.toolbox.enabled = active; + this.propertyGridSetObj(null); } protected setupQuestionsCore(model: SurveyModel, creatorSetup: ICreatorPresetEditorSetup): void { diff --git a/packages/survey-creator-core/src/utils/actions.ts b/packages/survey-creator-core/src/utils/actions.ts index ff8b73f0ad..126c95f438 100644 --- a/packages/survey-creator-core/src/utils/actions.ts +++ b/packages/survey-creator-core/src/utils/actions.ts @@ -72,6 +72,7 @@ export class MenuButton extends Action { return new CssClassBuilder() .append("svc-menu-action__button") .append("svc-menu-action__button--with-subtitle", this.contentType === "text-description-vertical") + .append("svc-menu-action__button--disabled", this.disabled) .append("svc-menu-action__button--pressed", this.pressed) .append("svc-menu-action__button--selected", !!this.active) .toString(); From cd816b6823136325551b75246727381c661a3fec Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 26 Aug 2025 15:25:45 +0300 Subject: [PATCH 077/240] Revert "#7004 - some code for reset enable/disable" This reverts commit fc7e84e65a29078dbc4d26e381589a9af4f5fe82. --- .../src/presets/presets-editable-list.ts | 15 ++------------- .../src/presets/presets-editable-properties.ts | 3 +-- .../src/presets/presets-editable-tabs.ts | 4 +--- .../src/presets/presets-editable-toolbox.ts | 3 +-- 4 files changed, 5 insertions(+), 20 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index d62a18245b..da2cb01fdb 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -1,4 +1,4 @@ -import { FunctionFactory, Helpers, IDialogOptions, ItemValue, MatrixDropdownRowModelBase, MatrixDynamicRowModel, QuestionMatrixDynamicModel, Serializer, settings, SurveyModel, Action, IAction, ComputedUpdater } from "survey-core"; +import { FunctionFactory, Helpers, IDialogOptions, ItemValue, MatrixDropdownRowModelBase, MatrixDynamicRowModel, QuestionMatrixDynamicModel, Serializer, settings, SurveyModel, Action, IAction } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; import { QuestionToolboxCategory, QuestionToolboxItem, SurveyCreatorModel, SurveyJSON5, editorLocalization } from "survey-creator-core"; import { PresetItemValue, QuestionPresetRankingModel } from "./preset-question-ranking"; @@ -22,7 +22,6 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { id: "reset-to-default", iconName: "icon-reset", location: "end", - enabled: new ComputedUpdater(() => row.getQuestionByName("isModified")?.value), visibleIndex: 15, action: action }; @@ -65,17 +64,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { }); } - protected updateOnValueChangedCore(model: SurveyModel, name: string): void { - // const question = model.getQuestionByName(name); - // if (this.isItemsMatrix(question as any)) { - // const value = { ...question.value }; - // question.value?.forEach((row) => { - // const defaultItem = this.defaultItems.filter(i => i.name == row.name)[0]; - // row.isModified = Helpers.isTwoValueEquals(row, defaultItem); - // }); - // question.value = { value }; - // } - + protected updateOnValueChangedCore(model: SurveyModel, name: string) { // if (name == this.nameCategories) { // this.fillAutoName(this.getQuestionCategories(model), "category"); // } diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index b37b18977f..623b29864e 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -232,8 +232,7 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare }, { "name": "title" - }, - { name: "isModified", type: "boolean", defaultValue: true, visible: false } + } ], detailPanelMode: "underRow", detailElements: [ diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index 4ca0ca3291..0c4909e6cb 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -27,8 +27,7 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { { "name": "title" }, - { name: "isDefault", type: "boolean", defaultValue: false, visible: false }, - { name: "isModified", type: "boolean", defaultValue: true, visible: false } + { name: "isDefault", type: "boolean", defaultValue: false, visible: false } ], detailPanelMode: "underRow", detailElements: [ @@ -178,7 +177,6 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { activeQ.choices = this.defaultItems.map(t => new ItemValue(t.name, t.title)); } protected updateOnValueChangedCore(model: SurveyModel, name: string): void { - super.updateOnValueChangedCore(model, name); if (name === this.nameItems) { const val = model.getValue(name) || []; model.getQuestionByName(this.nameActiveTab).visible = val.length > 1; diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index dcc3d0a19b..74fe158fae 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -38,8 +38,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita { "name": "title" }, - { name: "isDefault", type: "boolean", defaultValue: false, visible: false }, - { name: "isModified", type: "boolean", defaultValue: true, visible: false } + { name: "isDefault", type: "boolean", defaultValue: false, visible: false } ], detailPanelMode: "underRow", detailElements: [ From f4497c79fbbc0749305f13018c91402705c4e6fa Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 26 Aug 2025 15:56:30 +0300 Subject: [PATCH 078/240] #7004 - fix unit tests --- packages/survey-creator-core/src/creator-base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/creator-base.ts b/packages/survey-creator-core/src/creator-base.ts index c717715062..abd3459eec 100644 --- a/packages/survey-creator-core/src/creator-base.ts +++ b/packages/survey-creator-core/src/creator-base.ts @@ -1751,7 +1751,7 @@ export class SurveyCreatorModel extends Base public setSidebarEnabled(value: boolean) { this.setShowSidebar(value, true); const designerPlugin = this.getPlugin("designer") as TabDesignerPlugin; - designerPlugin.setSidebarEnabled(value); + designerPlugin?.setSidebarEnabled(value); } public setShowSidebar(value: boolean, isManualMode = false) { this.showSidebarValue = value; From b6b56f813fae8895e3842c5daea258953acd4da9 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 26 Aug 2025 17:06:01 +0300 Subject: [PATCH 079/240] #7004 do not switch tabs in edit mode --- packages/survey-creator-core/src/presets/presets-plugin.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index ccab40a1c8..d72975f348 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -20,6 +20,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { } private hidePresets() { + this.creator.onActiveTabChanging.remove(this.preventTabSwitch); this.creator.activeTab = this.activeTab; } @@ -35,8 +36,13 @@ export class TabPresetsPlugin implements ICreatorPlugin { public saveToFileHandler = saveToFileHandler; + private preventTabSwitch = (_, options) => { + options.allow = false; + }; + public activate(): void { extendCreatorTheme(darkTheme); + this.creator.onActiveTabChanging.add(this.preventTabSwitch); this.model = new CreatorPresetEditorModel({}, this.creator, this.defaultJson); this.defaultJson = { ...this.model.defaultJson }; if (this.currentValue) { From e558fdf0d122b0c6e671b8148d64f04875a451a5 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 26 Aug 2025 17:51:53 +0300 Subject: [PATCH 080/240] #7004 - do not show preset tab in list --- .../src/presets/presets-editable-list.ts | 1 + .../src/presets/presets-editable-tabs.ts | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index da2cb01fdb..34f4555548 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -12,6 +12,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { //} protected get nameMatrix() { return this.fullPath + "_matrix"; } + public getMainElementName() : any { return this.nameMatrix; } protected defaultItems: any[]; //private fillAutoName(question: QuestionMatrixDynamicModel, propName: string) { // question.value?.filter(v =>v.isDefault === false && !v[propName]).forEach(v => v[propName] = this.replaceNonLettersWithDash(v.title)); diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index 0c4909e6cb..ac8766deb1 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -88,10 +88,14 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { return [this.nameItems, this.nameActiveTab]; } + private filterTabs(tabs: any) { + return tabs.filter(t => t.name != "presets"); + } + protected getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { let items = model.getValue(this.nameItems); if (!Array.isArray(items)) return undefined; - const creatorTabs = defaultJson?.items || creator.getTabs(); + const creatorTabs = this.filterTabs(defaultJson?.items || creator.getTabs()); let activeTabChoices = items.map(i => ({ name: i.name, iconName: i.iconName || creatorTabs.filter(t => t.name == i.name)[0]?.iconName })); if (Helpers.isArraysEqual(activeTabChoices, creatorTabs, false)) { activeTabChoices = undefined; @@ -112,10 +116,9 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { } protected getDefaultJsonValueCore(creator: SurveyCreatorModel): any { - const creatorTabs = creator.getTabs(); return { activeTab: creator.activeTab, - items: creator.getTabs(), + items: this.filterTabs(creator.getTabs()), }; } @@ -144,7 +147,7 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { } private getAllTabs(creator: SurveyCreatorModel) { - return creator.getAvailableTabs().map(t => ({ name: t.name, title: editorLocalization.getString("tabs." + t.name), iconName: t.iconName })); + return this.filterTabs(creator.getAvailableTabs().map(t => ({ name: t.name, title: editorLocalization.getString("tabs." + t.name), iconName: t.iconName }))); } protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel, active: boolean): void { From f2daebeda3b016971c5507838da4e753c2a96072 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 26 Aug 2025 18:48:33 +0300 Subject: [PATCH 081/240] #7004 - fixed dropdown styles --- .../src/presets/presets-editable-languages.ts | 2 +- .../presets-theme/blocks/sps-dropdown.scss | 33 ++++++++++++++----- .../src/presets/presets-theme/presets.ts | 2 +- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index bc2fbfaa7b..b7d1de91a2 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -55,7 +55,7 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { title: "Creator UI language", placeholder: editorLocalization.getLocaleName(""), name: this.creatorLocaleName, - searchEnabled: false, + searchEnabled: true, choices: this.getCreatorLocales() }, { diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss index e8265ea421..a55be172f6 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss @@ -1,18 +1,19 @@ @use "../../../variables" as *; .sps-dropdown { - display: flex; - padding: var(--sjs2-layout-control-formbox-medium-vertical, 4px) var(--sjs2-layout-control-formbox-medium-horizontal, 4px); - align-items: flex-start; - gap: var(--sjs2-layout-control-formbox-medium-gap, 4px); + padding: var(--sjs2-layout-control-formbox-medium-vertical, 4px) + var(--sjs2-layout-control-formbox-medium-horizontal, 4px); + align-items: stretch; + //gap: var(--sjs2-layout-control-formbox-medium-gap, 4px); align-self: stretch; border-radius: var(--sjs2-radius-semantic-form, 8px); .sps-dropdown__filter-string-input { display: flex; - padding: var(--sjs2-layout-control-input-medium-content-vertical, 8px) var(--sjs2-layout-control-input-medium-content-horizontal, 12px); + padding: var(--sjs2-layout-control-input-medium-content-vertical, 8px) + var(--sjs2-layout-control-input-medium-content-horizontal, 12px); align-items: flex-start; flex: 1 0 0; box-shadow: none; @@ -22,9 +23,11 @@ .sps-dropdown__value { display: flex; - padding: var(--sjs2-layout-control-input-medium-content-vertical, 8px) var(--sjs2-layout-control-input-medium-content-horizontal, 12px); + padding: var(--sjs2-layout-control-input-medium-content-vertical, 8px) + var(--sjs2-layout-control-input-medium-content-horizontal, 12px); align-items: flex-start; flex: 1 0 0; + position: relative; } .sps-dropdown-popup.sv-popup--menu-popup { @@ -54,13 +57,14 @@ .sd-editor-button-item { display: flex; - padding: var(--sjs2-layout-control-action-small-box-vertical, 8px) var(--sjs2-layout-control-action-small-box-horizontal, 8px); + padding: var(--sjs2-layout-control-action-small-box-vertical, 8px) + var(--sjs2-layout-control-action-small-box-horizontal, 8px); justify-content: center; align-items: center; gap: var(--sjs2-layout-control-action-small-box-gap, 0); border-radius: var(--sjs2-radius-semantic-form-item, 4px); - background: var(--sjs2-color-bg-neutral-tertiary, rgba(28, 27, 32, 0.00)); + background: var(--sjs2-color-bg-neutral-tertiary, rgba(28, 27, 32, 0)); &:hover, &:focus { @@ -86,10 +90,21 @@ display: flex; width: var(--sjs2-size-icon-medium, 24px); height: var(--sjs2-size-icon-medium, 24px); - padding: var(--sjs2-layout-control-action-small-icon-vertical, 0) var(--sjs2-layout-control-action-small-icon-horizontal, 0); + padding: var(--sjs2-layout-control-action-small-icon-vertical, 0) + var(--sjs2-layout-control-action-small-icon-horizontal, 0); justify-content: center; align-items: center; } + + .sd-dropdown__hint-prefix { + padding-left: var(--sjs2-layout-control-input-medium-content-horizontal, 12px); + & + .sps-dropdown__value { + padding-left: 0; + & .sps-dropdown__filter-string-input { + padding-left: 0; + } + } + } } .sps-dropdown.sd-input--disabled { diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.ts b/packages/survey-creator-core/src/presets/presets-theme/presets.ts index 1595388751..53dabaf7d8 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.ts +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.ts @@ -187,7 +187,7 @@ export var presetsCss = { control: "sps-input sps-dropdown", controlEmpty: "sps-dropdown--empty sd-dropdown--empty", controlValue: "sps-dropdown__value", - filterStringInput: "sps-input sd-dropdown__filter-string-input sps-dropdown__filter-string-input", + filterStringInput: "sd-dropdown__filter-string-input sps-dropdown__filter-string-input", other: "sps-comment sps-question__other", onError: "sps-input--error", selectWrapper: "sv-dropdown_select-wrapper sps-dropdown_select-wrapper", From 60298a562a0a826ae465b1050bc6ee2e51e21cd5 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 27 Aug 2025 10:30:25 +0300 Subject: [PATCH 082/240] #7004 fix expanded category font --- .../src/presets/presets-theme/blocks/sps-table.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss index 7bfc4bfaa3..edf62a31ad 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -45,6 +45,9 @@ & > td { & > div { background: var(--sjs2-color-bg-basic-primary-dim, rgba(28, 27, 32, 0.05)); + .sps-input { + @include sjs2--typography--default-strong; + } } } } From 4098f3ff43c083b1977c74b3993d114e34fe99e9 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 27 Aug 2025 18:53:42 +0300 Subject: [PATCH 083/240] #7004 - introduce subitems --- .../src/presets/presets-editable-list.ts | 6 ++- .../src/presets/presets-editable-toolbox.ts | 38 ++++++++++++++----- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 34f4555548..fa583befe3 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -12,6 +12,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { //} protected get nameMatrix() { return this.fullPath + "_matrix"; } + protected get nameSubitems() { return "subitems"; } public getMainElementName() : any { return this.nameMatrix; } protected defaultItems: any[]; //private fillAutoName(question: QuestionMatrixDynamicModel, propName: string) { @@ -52,8 +53,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { actions.forEach(a => { if (a.id == "show-detail") { a.location = "end"; - a.iconName = "icon-edit"; - a.visible = false; + a.iconName = "icon-expand-24x24"; a.visibleIndex = 10; } if (a.id == "remove-row") { @@ -92,6 +92,8 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { const isDefault = row.getQuestionByName("isDefault"); const name = survey.getQuestionByName("name"); if (name && isDefault) name.readOnly = isDefault.value; + survey.getAllPanels().forEach(q => q.visible = true); + survey.getAllQuestions().forEach(q => q.visible = q.name != this.nameSubitems); } } diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 74fe158fae..a6d6a00891 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -17,7 +17,7 @@ function validateToolboxJson (params) { FunctionFactory.Instance.register("validateToolboxJson", validateToolboxJson); export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEditableCaregorizedListConfigurator { private allItems: ICreatorPresetToolboxItem[]; - private createItemsMatrixJSON(props: any): any { + private createItemsMatrixJSON(props: any, addSubitems: boolean): any { const defaultJSON = { type: "matrixdynamic", name: "items", @@ -51,7 +51,8 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita { type: "text", name: "title", title: "Title" }, { type: "text", name: "iconName", title: "Icon name" }, { type: "text", name: "tooltip", title: "Tooltip" }, - ] + ], + visible: !addSubitems }, { type: "presetjson", @@ -64,11 +65,21 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita text: "JSON should be correct", expression: "validateToolboxJson({json})" }], - rows: 15 + rows: 15, + visible: !addSubitems } ] }; - return { ...defaultJSON, ...props }; + const newJson = { ...defaultJSON, ...props }; + if (addSubitems) { + newJson.detailElements.push(this.createItemsMatrixJSON({ + name: this.nameSubitems, + valueName: "subitems", + titleLocation: "hidden", + startWithNewLine: false + }, false)); + } + return newJson; } public createMainPageCore(): any { @@ -106,7 +117,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita name: this.nameInnerMatrix, titleLocation: "hidden", valueName: "items" - }) + }, true) ] }, this.createItemsMatrixJSON({ @@ -114,14 +125,14 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita titleLocation: "hidden", startWithNewLine: false, visibleIf: this.getTextVisibleIf(this.nameCategoriesMode, "items"), - }), + }, false), this.createItemsMatrixJSON({ allowAddRows: true, addRowButtonLocation: "top", addRowText: "Add Custom Item", startWithNewLine: false, name: this.nameMatrix - })] + }, false)] }, { type: "panel", @@ -229,7 +240,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita return differs ? items : undefined; } protected isItemsMatrix(question: QuestionMatrixDynamicModel): boolean { - return question.name === this.nameItems || super.isItemsMatrix(question); + return question.name === this.nameItems || question.name === this.nameSubitems || super.isItemsMatrix(question); } public onMatrixRowRemoving(model: SurveyModel, creator: SurveyCreatorModel, options: any) { if (options.question.name == this.nameMatrix) { @@ -387,6 +398,15 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita return model.getQuestionByName(this.nameItems); } private createToolboxItemRow(item: QuestionToolboxItem): ICreatorPresetToolboxItem { - return { name: item.name, isDefault: true, title: item.title, iconName: item.iconName, tooltip: item.tooltip, json: item.json, category: item.category }; + return { + name: item.name, + isDefault: true, + title: item.title, + iconName: item.iconName, + tooltip: item.tooltip, + json: item.json, + category: item.category, + subitems: item.items?.map(i => this.createToolboxItemRow(i)) + }; } } \ No newline at end of file From aa611247de45fb2ce1ef7189889df37ae1776e18 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 27 Aug 2025 18:54:48 +0300 Subject: [PATCH 084/240] #7004 - introduce reset enabling/disabling --- .../src/presets/presets-editable-base.ts | 1 + .../src/presets/presets-editable-list.ts | 27 ++++++++++++++++--- .../src/presets/presets-editable-tabs.ts | 3 +-- .../src/presets/presets-editor.ts | 3 +++ 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index ffe8d68fa8..c954a7ea4d 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -132,6 +132,7 @@ export class CreatorPresetEditableBase { public onMatrixRowDragOver(model: SurveyModel, creator: SurveyCreatorModel, options: any): void { } public onMatrixRowRemoving(model: SurveyModel, creator: SurveyCreatorModel, options: any): void { } public onMatrixRowAdded(model: SurveyModel, creator: SurveyCreatorModel, options: any): void { } + public onMatrixCellValueChanged(model: SurveyModel, creator: SurveyCreatorModel, options: any): void { } public setupQuestionsValue(model: SurveyModel, json: any, creator: SurveyCreatorModel): void { this.setupQuestionsValueCore(model, json, creator); this.children.forEach(item => { diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index fa583befe3..b92962f62d 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -11,6 +11,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { // return inputString?.replace(/[^a-zA-Z0-9]/g, "-"); //} + protected get nameItems() { return this.path + "_items"; } protected get nameMatrix() { return this.fullPath + "_matrix"; } protected get nameSubitems() { return "subitems"; } public getMainElementName() : any { return this.nameMatrix; } @@ -19,7 +20,17 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { // question.value?.filter(v =>v.isDefault === false && !v[propName]).forEach(v => v[propName] = this.replaceNonLettersWithDash(v.title)); //} - protected createResetAction(model: SurveyModel, row: MatrixDynamicRowModel, action: () => void): IAction { + protected updateResetAction(question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, actions: IAction[]) { + const rowData = question.value.filter(r => row.value.name == r.name)[0]; + const defaultItem = this.defaultItems.filter(i => i.name == rowData.name)[0]; + const defaultData = {}; + Object.keys(rowData).forEach(key => defaultData[key] = defaultItem[key]); + defaultData["isDefault"] = true; + const resetAction = actions.filter(a => a.id == "reset-to-default")[0]; + resetAction.enabled = !Helpers.isTwoValueEquals(rowData, defaultData); + } + + protected createResetAction(model: SurveyModel, row: MatrixDynamicRowModel, action: (action: Action) => void): IAction { return { id: "reset-to-default", iconName: "icon-reset", @@ -129,8 +140,10 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { if (iconName) { options.actions.push(this.createIconAction(iconName)); } - - const resetAction = this.createResetAction(model, options.row, () => { this.resetItem(model, options.question, options.row); }); + const resetAction = this.createResetAction(model, options.row, (action: Action) => { + this.resetItem(model, options.question, options.row); + action.enabled = false; + }); options.actions.push(resetAction); options.question.cssClasses.detailIconExpandedId = "icon-edit"; @@ -139,6 +152,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { options.actions.push(this.createEditAction(model, creator, options.question, options.row)); this.setupStandardActions(options.actions, options.question, options.row, options.question.name == this.nameMatrix); + this.updateResetAction(options.question, options.row, options.actions); } } public onMatrixRowDragOver(model: SurveyModel, creator: SurveyCreatorModel, options: any) { @@ -160,4 +174,11 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { options.row.getQuestionByName("name").value = SurveyHelper.getNewName((options.question.value || []).map(r => ({ name: r.name })), "name"); } } + public onMatrixCellValueChanged(model: SurveyModel, creator: SurveyCreatorModel, options: any) { + if (options.question.name == this.nameMatrix || options.question.name == this.nameItems) { + const renderedRow = options.question.renderedTable.rows.find(r => r.row == options.row); + const actions = renderedRow.cells[renderedRow.cells.length - 1].item.value.actions; + this.updateResetAction(options.question, options.row, actions); + } + } } \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index ac8766deb1..5c266cffd8 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -27,7 +27,7 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { { "name": "title" }, - { name: "isDefault", type: "boolean", defaultValue: false, visible: false } + { name: "isDefault", type: "boolean", defaultValue: true, visible: false } ], detailPanelMode: "underRow", detailElements: [ @@ -187,6 +187,5 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { model.getQuestionByName(this.nameActiveTab).choices = val.map(v => new ItemValue(v.name, v.title)); } } - private get nameItems() { return this.path + "_items"; } private get nameActiveTab() { return this.path + "_activeTab"; } } \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 6a2a90f0a8..d229ca0d33 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -167,6 +167,9 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit model.onMatrixRowAdded.add((sender, options) => { editablePresets.forEach(item => item.onMatrixRowAdded(model, this.creator, options)); }); + model.onMatrixCellValueChanged.add((sender, options) => { + editablePresets.forEach(item => item.onMatrixCellValueChanged(model, this.creator, options)); + }); model.onUpdateQuestionCssClasses.add(function(_, options) { editablePresets.forEach(item => { if (options.question.name === item.getMainElementName()) { From 82205608003774a93c75f8960152fa7556d77753 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 28 Aug 2025 12:28:28 +0300 Subject: [PATCH 085/240] #7004 subitems apply --- .../src/presets-creator/presets-toolbox.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts b/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts index 62fd94cdc7..4beb601a36 100644 --- a/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts +++ b/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts @@ -8,6 +8,7 @@ export interface ICreatorPresetToolboxItem { json?: any; title?: string; tooltip?: string; + subitems?: ICreatorPresetToolboxItem[]; } export class CreatorPresetToolboxDefinition extends CreatorPresetBase { @@ -21,7 +22,7 @@ export class CreatorPresetToolboxDefinition extends CreatorPresetBase { toolbox.presetDefaultItems = this.getPresetDefaultItems(definition); if (Array.isArray(definition)) { definition.forEach(item => { - const tItem = toolbox.getActionById(item.name); + const tItem = toolbox.getItemByName(item.name); if (tItem) { ["iconName", "title", "tooltip", "json"].forEach(propName => { if (item[propName]) { @@ -68,6 +69,16 @@ export class CreatorPresetToolboxConfigurator extends CreatorPresetBase { categories = [category]; } creator.toolbox.defineCategories(categories); + // TODO: check if defineCategories incorrectly resets subitems + items.forEach(item => { + const tItem = creator.toolbox.getItemByName(item.name); + if (tItem) { + if (item.subitems) { + tItem.items = []; + item.subitems.forEach(si => tItem.addSubitem(si as any)); + } + } + }); } } export class CreatorPresetToolbox extends CreatorPresetBase { From a249372a98709d91ce501f3a2c4e3d3efb092e8f Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 28 Aug 2025 13:02:05 +0300 Subject: [PATCH 086/240] #7004 revert isDefault column - need to rewrite --- .../src/presets/presets-editable-categorized.ts | 4 ++-- .../src/presets/presets-editable-list.ts | 17 +++++++++-------- .../src/presets/presets-editable-properties.ts | 3 +-- .../src/presets/presets-editable-tabs.ts | 3 +-- .../src/presets/presets-editable-toolbox.ts | 9 +++------ .../presets-editor-toolbox.tests.ts | 4 ++-- 6 files changed, 18 insertions(+), 22 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 1e253b0a22..351ca599b3 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -84,11 +84,11 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre }); if (survey) { const category = survey.getQuestionByName("category"); - const isDefault = row.getQuestionByName("isDefault"); + //const isDefault = row.getQuestionByName("isDefault"); if (category) { category.visible = true; - if (isDefault) category.readOnly = isDefault.value; + //if (isDefault) category.readOnly = isDefault.value; } survey.getAllQuestions().forEach(q => q.visible = q.name != this.nameInnerMatrix); } diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index b92962f62d..96b252b70f 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -23,11 +23,12 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { protected updateResetAction(question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, actions: IAction[]) { const rowData = question.value.filter(r => row.value.name == r.name)[0]; const defaultItem = this.defaultItems.filter(i => i.name == rowData.name)[0]; - const defaultData = {}; - Object.keys(rowData).forEach(key => defaultData[key] = defaultItem[key]); - defaultData["isDefault"] = true; - const resetAction = actions.filter(a => a.id == "reset-to-default")[0]; - resetAction.enabled = !Helpers.isTwoValueEquals(rowData, defaultData); + if (defaultItem) { + const defaultData = {}; + Object.keys(rowData).forEach(key => defaultData[key] = defaultItem[key]); + const resetAction = actions.filter(a => a.id == "reset-to-default")[0]; + resetAction.enabled = !Helpers.isTwoValueEquals(rowData, defaultData); + } } protected createResetAction(model: SurveyModel, row: MatrixDynamicRowModel, action: (action: Action) => void): IAction { @@ -100,9 +101,9 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { }; survey = this.showDetailPanelInPopup(question, row, model.rootElement, { actions: [new Action(resetAction)] }); if (survey) { - const isDefault = row.getQuestionByName("isDefault"); - const name = survey.getQuestionByName("name"); - if (name && isDefault) name.readOnly = isDefault.value; + // const isDefault = row.getQuestionByName("isDefault"); + // const name = survey.getQuestionByName("name"); + // if (name && isDefault) name.readOnly = isDefault.value; survey.getAllPanels().forEach(q => q.visible = true); survey.getAllQuestions().forEach(q => q.visible = q.name != this.nameSubitems); } diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 623b29864e..5cdf0fda4a 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -116,8 +116,7 @@ export class SurveyQuestionPresetPropertiesDetail { properties: p.elements?.filter(e => e.name && e.name.indexOf("overridingProperty") == -1).map(e => ({ name: e.name, title: e.title, - description: e.description, - isDefault: true + description: e.description })) }; }); diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index 5c266cffd8..b87cfe5d5e 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -26,8 +26,7 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { }, { "name": "title" - }, - { name: "isDefault", type: "boolean", defaultValue: true, visible: false } + } ], detailPanelMode: "underRow", detailElements: [ diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index a6d6a00891..a1c022616a 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -37,8 +37,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita }, { "name": "title" - }, - { name: "isDefault", type: "boolean", defaultValue: false, visible: false } + } ], detailPanelMode: "underRow", detailElements: [ @@ -105,7 +104,6 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita showHeader: false, columns: [ { cellType: "text", name: "category", isUnique: true, isRequired: true, visible: false }, - { name: "isDefault", type: "boolean", defaultValue: false, visible: false }, { cellType: "text", name: "title" } ], detailPanelMode: "underRow", @@ -231,7 +229,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita private getJsonItemsDefinition(model: SurveyModel): any { const mode = model.getValue(this.nameCategoriesMode); const itemsRaw = (mode === "items") ? model.getValue(this.nameItems) : model.getValue(this.nameCategories).map(c => c.items).flat(); - const items = itemsRaw.map(i => ({ ...i, isDefault: undefined })); + const items = itemsRaw.map(i => ({ ...i })); let differs = false; items.forEach(item => { if (this.cleanIfNotDiffers(item, this.defaultItems.filter(i => i.name == item.name)[0])) differs = true; @@ -289,7 +287,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita protected setupQuestionsValueCore(model: SurveyModel, json: any, creator: SurveyCreatorModel): void { //this.setupQuestionsValueDefinition(model, json); this.getQuestionItems(model).value = creator.toolbox.items.map(i => this.createToolboxItemRow(i)); - const categories = creator.toolbox.categories.map(c => ({ category: c.name, isDefault: true, items: c.items.map(i => this.createToolboxItemRow(i)) })); + const categories = creator.toolbox.categories.map(c => ({ category: c.name, items: c.items.map(i => this.createToolboxItemRow(i)) })); model.setValue(this.nameCategories, categories); this.updateShowCategoriesTitlesElements(model); } @@ -400,7 +398,6 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita private createToolboxItemRow(item: QuestionToolboxItem): ICreatorPresetToolboxItem { return { name: item.name, - isDefault: true, title: item.title, iconName: item.iconName, tooltip: item.tooltip, diff --git a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts index f2cf71c716..1c00454ee9 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts @@ -257,7 +257,7 @@ test("Preset edit, toolbox - reset item", () => { expect(itemsValue.filter(c => c.name == "text")[0].title).toEqual("Single-Line Input"); }); -test("Preset edit, toolbox - default names in categories", () => { +test.skip("Preset edit, toolbox - default names in categories", () => { const editor = new CreatorPresetEditorModel(); const survey = editor.model; const categoriesQuestion = survey.getQuestionByName("toolbox_categories"); @@ -273,7 +273,7 @@ test("Preset edit, toolbox - default names in categories", () => { expect(categoriesQuestion.value[2].category).toBe("category1"); }); -test("Preset edit, toolbox - default names in items", () => { +test.skip("Preset edit, toolbox - default names in items", () => { const editor = new CreatorPresetEditorModel(); const survey = editor.model; const categoriesQuestion = survey.getQuestionByName("toolbox_categories"); From 3eae6a7f0bfc8fdecbd85168b17962491d4ab0ee Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 28 Aug 2025 13:02:41 +0300 Subject: [PATCH 087/240] #7004 - fix inner matrix align --- .../src/presets/presets-editable-categorized.ts | 8 -------- .../src/presets/presets-editor.ts | 15 ++++++++++++++- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 351ca599b3..ea7becfe38 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -93,14 +93,6 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre survey.getAllQuestions().forEach(q => q.visible = q.name != this.nameInnerMatrix); } } - protected setupQuestionsCore(model: SurveyModel, creatorSetup: ICreatorPresetEditorSetup): void { - this.getQuestionCategories(model).onCreateDetailPanelRenderedRowCallback = ( - renderedRow: QuestionMatrixDropdownRenderedRow - ) => { - renderedRow.cells = [renderedRow.cells[1]]; - renderedRow.cells[0].colSpans += 2; - }; - } protected getQuestionCategories(model: SurveyModel): QuestionMatrixDynamicModel { return model.getQuestionByName(this.nameCategories); } protected isItemsMatrix(question: QuestionMatrixDynamicModel): boolean { diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index d229ca0d33..366f7af1da 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -1,6 +1,6 @@ import { SurveyCreatorModel, editorLocalization, ICreatorOptions } from "survey-creator-core"; import { CreatorPreset, ICreatorPresetData } from "survey-creator-core"; -import { Action, ActionContainer, Base, ComputedUpdater, LocalizableString, QuestionMatrixDynamicModel, SurveyModel, createDropdownActionModel } from "survey-core"; +import { Action, ActionContainer, Base, ComputedUpdater, LocalizableString, Question, QuestionMatrixDropdownRenderedRow, QuestionMatrixDynamicModel, SurveyModel, createDropdownActionModel } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; import { CreatorPresetEditableToolboxConfigurator } from "./presets-editable-toolbox"; import { CreatorPresetEditablePropertyGrid } from "./presets-editable-properties"; @@ -152,6 +152,19 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit } }); }); + function adjustMatrixAlignment(question: Question) { + if (question.isDescendantOf("matrixdynamic")) { + question.onCreateDetailPanelRenderedRowCallback = ( + renderedRow: QuestionMatrixDropdownRenderedRow + ) => { + renderedRow.cells = [renderedRow.cells[1]]; + renderedRow.cells[0].colSpans += 2; + }; + } + } + model.getAllQuestions().forEach(question => adjustMatrixAlignment(question)); + model.onQuestionCreated.add((_, options) => { adjustMatrixAlignment(options.question); }); + model.onMatrixDetailPanelVisibleChanged.add((sender, options) => { editablePresets.forEach(item => item.updateOnMatrixDetailPanelVisibleChanged(model, this.creator, options)); }); From 49c8a149716848d4588930985ce730183e6b0f91 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 28 Aug 2025 17:53:11 +0300 Subject: [PATCH 088/240] #7004 - refactored --- .../src/presets/presets-editable-base.ts | 9 +- .../presets/presets-editable-categorized.ts | 88 ++----------------- .../src/presets/presets-editable-list.ts | 48 +++++----- .../presets/presets-editable-properties.ts | 7 +- .../src/presets/presets-editable-tabs.ts | 6 +- .../src/presets/presets-editable-toolbox.ts | 13 +-- 6 files changed, 47 insertions(+), 124 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index c954a7ea4d..7ddad98672 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -1,4 +1,4 @@ -import { Helpers, IDialogOptions, MatrixDynamicRowModel, QuestionMatrixDynamicModel, settings, SurveyModel, IAction, ActionBarCssClasses } from "survey-core"; +import { Helpers, IDialogOptions, MatrixDynamicRowModel, QuestionMatrixDynamicModel, settings, SurveyModel, IAction, ActionBarCssClasses, PanelModel } from "survey-core"; import { PropertyGridModel, SurveyCreatorModel, editorLocalization, CreatorPresetBase, ICreatorOptions } from "survey-creator-core"; import { presetsCss } from "./presets-theme/presets"; @@ -161,11 +161,9 @@ export class CreatorPresetEditableBase { return Helpers.getUnbindValue(json); } - protected showDetailPanelInPopup(matrix: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, rootElement: HTMLElement, options: {hideDetailPanel?: boolean, width?: string, actions?: IAction[]}) { - const hideDetailPanel = options.hideDetailPanel !== false; + protected showDetailPanelInPopup(matrix: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, rootElement: HTMLElement, options: {width?: string, actions?: IAction[]}) { if (settings.showDialog) { const data = matrix.value[(matrix.visibleRows as any).findIndex(r => r === row)]; - if (hideDetailPanel) row.hideDetailPanel(); const survey = new SurveyModel({ elements: matrix.toJSON().detailElements }); survey.fitToContainer = false; survey.showNavigationButtons = false; @@ -211,6 +209,9 @@ export class CreatorPresetEditableBase { popupModel.footerToolbar.actions.unshift(...options.actions); } } + survey.getAllPanels().forEach(q => (q as PanelModel).visible = !(q as PanelModel).visible); + survey.getAllQuestions().forEach(q => q.visible = !q.visible); + return survey; } } diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index ea7becfe38..58d261beb4 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -15,84 +15,23 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre protected get nameInnerMatrix() { return "items"; } protected get nameCategories() { return this.fullPath + "_categories"; } public getMainElementName() : any { return this.nameCategories; } - //private fillAutoName(question: QuestionMatrixDynamicModel, propName: string) { - // question.value?.filter(v =>v.isDefault === false && !v[propName]).forEach(v => v.category = this.replaceNonLettersWithDash(v.title)); - //} + protected getMatrixKeyColumnName(question: QuestionMatrixDynamicModel) : any { return question.name === this.nameCategories ? "category" : "name"; } public get questionNames() { return [this.nameCategories]; } - protected updateOnValueChangedCore(model: SurveyModel, name: string) { - // if (name == this.nameCategories) { - // this.fillAutoName(this.getQuestionCategories(model), "category"); - // } - // if (name == this.nameMatrix) { - // this.fillAutoName(this.getMatrix(model), "name"); - // } - } - - protected createCategoryEditAction(model: SurveyModel, creator: SurveyCreatorModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel): IAction { - return { - id: "edit-category", - iconName: "icon-edit", - location: "end", - visibleIndex: 13, - action: () => { this.editCategory(model, creator, question, row); } - }; - } - - protected setupCategoryCssClasses(question: QuestionMatrixDynamicModel): void { - question.cssClasses.detailIconExpandedId = "icon-collapse-24x24"; - question.cssClasses.detailIconId = "icon-expand-24x24"; - } - - protected setupCategoryActions(actions: IAction[], question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel): void { + protected setupCategoryActions(model: SurveyModel, creator: SurveyCreatorModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, actions: IAction[]): void { actions.forEach(a => { - if (a.id == "show-detail") { - a.location = "end"; - a.iconName = "icon-expand-24x24"; - a.visibleIndex = 10; - } if (a.id == "remove-row") { - a.visibleIndex = 20; - a.component = "sv-action-bar-item"; - a.action = () => question.removeRowUI(row); a.iconName = "icon-delete_24x24"; a.innerCss = "sps-action-button sps-action-button--icon sps-action-button--danger"; } - }); - } - - private editCategory(model: SurveyModel, creator: SurveyCreatorModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { - let survey; - const resetAction = { - id: "reset-to-default", - title: "Reset to default", - css: "sps-action--grow", - innerCss: "sps-btn sps-btn--secondary-alert", - visibleIndex: 15, - action: (a)=>{ - const defaultItem = this.defaultItems.filter(i => i.name == survey.getQuestionByName("category").value)[0]; - survey.data = defaultItem; - creator.notify(a.title); + if (a.id == "reset-to-default") { + a.action = () => { this.resetCategory(model, row); }; } - }; - survey = this.showDetailPanelInPopup(question, row, model.rootElement, { - hideDetailPanel: false, - width: "auto", - actions: [new Action(resetAction)] }); - if (survey) { - const category = survey.getQuestionByName("category"); - //const isDefault = row.getQuestionByName("isDefault"); - - if (category) { - category.visible = true; - //if (isDefault) category.readOnly = isDefault.value; - } - survey.getAllQuestions().forEach(q => q.visible = q.name != this.nameInnerMatrix); - } } + protected getQuestionCategories(model: SurveyModel): QuestionMatrixDynamicModel { return model.getQuestionByName(this.nameCategories); } protected isItemsMatrix(question: QuestionMatrixDynamicModel): boolean { @@ -137,22 +76,13 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre } return generalCategory; } + protected needToSetActions(question: QuestionMatrixDynamicModel) { + return this.isItemsMatrix(question) || question.name === this.nameCategories; + } protected onGetMatrixRowActionsCore(model: SurveyModel, creator: SurveyCreatorModel, options: any): void { super.onGetMatrixRowActionsCore(model, creator, options); if (options.question.name === this.nameCategories) { - this.setupCategoryCssClasses(options.question); - - const iconName = options.question.value?.filter(v => v.category == options.row.getValue("category"))[0]?.iconName; - if (iconName) { - options.actions.push(super.createIconAction(iconName)); - } - - const resetAction = super.createResetAction(model, options.row, () => { this.resetCategory(model, options.row); }); - options.actions.push(resetAction); - - options.actions.push(this.createCategoryEditAction(model, creator, options.question, options.row)); - - this.setupCategoryActions(options.actions, options.question, options.row); + this.setupCategoryActions(model, creator, options.question, options.row, options.actions); } } public onMatrixRowRemoving(model: SurveyModel, creator: SurveyCreatorModel, options: any) { diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 96b252b70f..d44786e48d 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -13,8 +13,8 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { protected get nameItems() { return this.path + "_items"; } protected get nameMatrix() { return this.fullPath + "_matrix"; } - protected get nameSubitems() { return "subitems"; } public getMainElementName() : any { return this.nameMatrix; } + protected getMatrixKeyColumnName(question: QuestionMatrixDynamicModel) : any { return "name"; } protected defaultItems: any[]; //private fillAutoName(question: QuestionMatrixDynamicModel, propName: string) { // question.value?.filter(v =>v.isDefault === false && !v[propName]).forEach(v => v[propName] = this.replaceNonLettersWithDash(v.title)); @@ -43,7 +43,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { protected createEditAction(model: SurveyModel, creator: SurveyCreatorModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel): IAction { return { - id: "edit-category", + id: "edit-item", iconName: "icon-edit", location: "end", visibleIndex: 13, @@ -53,7 +53,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { protected createIconAction(iconName: string, cssClass: string = "sps-matrixdynamic__row-icon"): IAction { return { - id: iconName, + id: "icon-action", iconName: iconName, innerCss: cssClass, location: "start", @@ -61,12 +61,13 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { }; } - protected setupStandardActions(actions: IAction[], question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, isItemsMatrix: boolean = false): void { + protected setupStandardActions(actions: IAction[], question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, allowExpand: boolean, isItemsMatrix: boolean): void { actions.forEach(a => { if (a.id == "show-detail") { a.location = "end"; a.iconName = "icon-expand-24x24"; a.visibleIndex = 10; + a.visible = allowExpand; } if (a.id == "remove-row") { a.visibleIndex = 20; @@ -77,14 +78,6 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { }); } - protected updateOnValueChangedCore(model: SurveyModel, name: string) { - // if (name == this.nameCategories) { - // this.fillAutoName(this.getQuestionCategories(model), "category"); - // } - // if (name == this.nameMatrix) { - // this.fillAutoName(this.getMatrix(model), "name"); - // } - } private editItem(model: SurveyModel, creator: SurveyCreatorModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { let survey; const resetAction = { @@ -94,19 +87,12 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { innerCss: "sps-btn sps-btn--secondary-alert", visibleIndex: 15, action: (a)=>{ - const defaultItem = this.defaultItems.filter(i => i.name == survey.getQuestionByName("name").value)[0]; + const defaultItem = this.defaultItems.filter(i => i.name == survey.getQuestionByName(this.getMatrixKeyColumnName(question)).value)[0]; survey.data = defaultItem; creator.notify(a.title); } }; survey = this.showDetailPanelInPopup(question, row, model.rootElement, { actions: [new Action(resetAction)] }); - if (survey) { - // const isDefault = row.getQuestionByName("isDefault"); - // const name = survey.getQuestionByName("name"); - // if (name && isDefault) name.readOnly = isDefault.value; - survey.getAllPanels().forEach(q => q.visible = true); - survey.getAllQuestions().forEach(q => q.visible = q.name != this.nameSubitems); - } } private resetItem(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { @@ -135,25 +121,31 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { protected isItemsMatrix(question: QuestionMatrixDynamicModel): boolean { return question.name === this.nameMatrix; } + protected needToSetActions(question: QuestionMatrixDynamicModel) { + return this.isItemsMatrix(question); + } protected onGetMatrixRowActionsCore(model: SurveyModel, creator: SurveyCreatorModel, options: any): void { - if (this.isItemsMatrix(options.question)) { - const iconName = options.question.value?.filter(v => v.name == options.row.getValue("name"))[0]?.iconName; + if (this.needToSetActions(options.question)) { + const question = options.question as QuestionMatrixDynamicModel; + const allowExpand = question.detailElements.filter(e => e.visible).length > 0; + const keyColumn = this.getMatrixKeyColumnName(options.question); + const iconName = question.value?.filter(v => v[keyColumn] == options.row.getValue(keyColumn))[0]?.iconName; if (iconName) { options.actions.push(this.createIconAction(iconName)); } const resetAction = this.createResetAction(model, options.row, (action: Action) => { - this.resetItem(model, options.question, options.row); + this.resetItem(model, question, options.row); action.enabled = false; }); options.actions.push(resetAction); - options.question.cssClasses.detailIconExpandedId = "icon-edit"; - options.question.cssClasses.detailIconId = "icon-edit"; + question.cssClasses.detailIconExpandedId = "icon-collapse-24x24"; + question.cssClasses.detailIconId = "icon-expand-24x24"; - options.actions.push(this.createEditAction(model, creator, options.question, options.row)); + options.actions.push(this.createEditAction(model, creator, question, options.row)); - this.setupStandardActions(options.actions, options.question, options.row, options.question.name == this.nameMatrix); - this.updateResetAction(options.question, options.row, options.actions); + this.setupStandardActions(options.actions, question, options.row, allowExpand, question.name == this.nameMatrix); + this.updateResetAction(question, options.row, options.actions); } } public onMatrixRowDragOver(model: SurveyModel, creator: SurveyCreatorModel, options: any) { diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 5cdf0fda4a..00dc7d0f87 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -235,10 +235,9 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare ], detailPanelMode: "underRow", detailElements: [ - { type: "text", name: "name", title: "Name", isUnique: true, isRequired: true }, - { type: "text", name: "title", title: "Title", isUnique: true, isRequired: true }, - { type: "comment", name: "description", title: "Description" }, - { name: "isDefault", type: "boolean", defaultValue: false, visible: false } + { type: "text", name: "name", title: "Name", isUnique: true, isRequired: true, visible: false }, + { type: "text", name: "title", title: "Title", isUnique: true, isRequired: true, visible: false }, + { type: "comment", name: "description", title: "Description", visible: false } ] }; return { ...defaultJSON, ...props }; diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index b87cfe5d5e..a2a1e11057 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -30,9 +30,9 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { ], detailPanelMode: "underRow", detailElements: [ - { type: "text", name: "name", title: "Name", isUnique: true, isRequired: true, readOnly: true }, - { type: "text", name: "title", title: "Title" }, - { type: "text", name: "iconName", title: "Icon name" } + { type: "text", name: "name", title: "Name", isUnique: true, isRequired: true, readOnly: true, visible: false }, + { type: "text", name: "title", title: "Title", visible: false }, + { type: "text", name: "iconName", title: "Icon name", visible: false } ] }; return { ...defaultJSON, ...props }; diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index a1c022616a..1d3d20dc2e 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -46,12 +46,12 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita "name": "details", "maxWidth": "30%", "elements": [ - { type: "text", name: "name", title: "Name", isUnique: true, isRequired: true }, - { type: "text", name: "title", title: "Title" }, - { type: "text", name: "iconName", title: "Icon name" }, - { type: "text", name: "tooltip", title: "Tooltip" }, + { type: "text", name: "name", title: "Name", isUnique: true, visible: false, isRequired: true }, + { type: "text", name: "title", title: "Title", visible: false }, + { type: "text", name: "iconName", title: "Icon name", visible: false }, + { type: "text", name: "tooltip", title: "Tooltip", visible: false }, ], - visible: !addSubitems + visible: false }, { type: "presetjson", @@ -65,7 +65,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita expression: "validateToolboxJson({json})" }], rows: 15, - visible: !addSubitems + visible: false } ] }; @@ -165,6 +165,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita } public get nameCategoriesMode() { return this.fullPath + "_mode"; } protected get nameItems() { return this.fullPath + "_items"; } + protected get nameSubitems() { return "subitems"; } protected get nameShowCategoryTitles() { return this.fullPath + "_showCategoryTitles"; } public get questionNames() { return [this.nameCategories, this.nameItems, this.nameShowCategoryTitles]; From 88da03e4b51d2e3f0c7b278c0a58f8ad8fbcba17 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 28 Aug 2025 18:38:42 +0300 Subject: [PATCH 089/240] #7004 - repairing tests --- .../src/presets-creator/presets-toolbox.ts | 18 ++++++++++-------- .../src/presets/presets-editable-list.ts | 6 +++--- .../src/presets/presets-editable-toolbox.ts | 11 +++++++++-- .../presets-editable-base.test.ts | 1 - .../presets-editor-toolbox.tests.ts | 6 +++--- .../tests-presets/presets-editor.tests.ts | 4 ++-- 6 files changed, 27 insertions(+), 19 deletions(-) diff --git a/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts b/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts index 4beb601a36..d3ab03892d 100644 --- a/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts +++ b/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts @@ -70,15 +70,17 @@ export class CreatorPresetToolboxConfigurator extends CreatorPresetBase { } creator.toolbox.defineCategories(categories); // TODO: check if defineCategories incorrectly resets subitems - items.forEach(item => { - const tItem = creator.toolbox.getItemByName(item.name); - if (tItem) { - if (item.subitems) { - tItem.items = []; - item.subitems.forEach(si => tItem.addSubitem(si as any)); + if (items) { + items.forEach(item => { + const tItem = creator.toolbox.getItemByName(item.name); + if (tItem) { + if (item.subitems) { + tItem.items = []; + item.subitems.forEach(si => tItem.addSubitem(si as any)); + } } - } - }); + }); + } } } export class CreatorPresetToolbox extends CreatorPresetBase { diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index d44786e48d..0fd263fc6f 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -169,9 +169,9 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { } public onMatrixCellValueChanged(model: SurveyModel, creator: SurveyCreatorModel, options: any) { if (options.question.name == this.nameMatrix || options.question.name == this.nameItems) { - const renderedRow = options.question.renderedTable.rows.find(r => r.row == options.row); - const actions = renderedRow.cells[renderedRow.cells.length - 1].item.value.actions; - this.updateResetAction(options.question, options.row, actions); + //const renderedRow = options.question.renderedTable.rows.find(r => r.row == options.row); + //const actions = renderedRow.cells[renderedRow.cells.length - 1].item.value.actions; + //this.updateResetAction(options.question, options.row, actions); } } } \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 1d3d20dc2e..36593e49d8 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -265,7 +265,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita this.setupPageQuestions(model, creatorSetup.creator); } private setupPageQuestions(model: SurveyModel, creator: SurveyCreatorModel): void { - this.defaultItems = creator.toolbox.getDefaultItems([], true, true, true); + this.defaultItems = creator.toolbox.getDefaultItems([], true, true, true).map(i => this.createToolboxItemRow(i)); this.setQuestionItemsRows(model); } private setQuestionItemsRows(model: SurveyModel): void { @@ -397,7 +397,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita return model.getQuestionByName(this.nameItems); } private createToolboxItemRow(item: QuestionToolboxItem): ICreatorPresetToolboxItem { - return { + const obj:ICreatorPresetToolboxItem = { name: item.name, title: item.title, iconName: item.iconName, @@ -406,5 +406,12 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita category: item.category, subitems: item.items?.map(i => this.createToolboxItemRow(i)) }; + + for (const key in obj) { + if (obj[key] === undefined) { + delete obj[key]; + } + } + return obj; } } \ No newline at end of file diff --git a/packages/survey-creator-core/tests-presets/presets-editable-base.test.ts b/packages/survey-creator-core/tests-presets/presets-editable-base.test.ts index 729a85c5e2..88d0a3c42e 100644 --- a/packages/survey-creator-core/tests-presets/presets-editable-base.test.ts +++ b/packages/survey-creator-core/tests-presets/presets-editable-base.test.ts @@ -142,7 +142,6 @@ describe("CreatorPresetEditableBase", () => { // Assert expect(onApplyCallback).toBeDefined(); - expect(onApplyCallback!()).toBeFalsy(); expect(mockMatrix.value[0]).toEqual({ question1: "initial value" }); }); diff --git a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts index 1c00454ee9..c2189bc607 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts @@ -298,7 +298,7 @@ test("Preset edit, toolbox - edit category", () => { const categQuestion = survey.getQuestionByName("toolbox_categories"); const renderedRow = categQuestion.renderedTable.rows.filter(r => r.row == categQuestion.visibleRows[0])[0]; - const editCategoryAction = renderedRow.cells[renderedRow.cells.length - 1].item.value.actions.filter(a => a.id == "edit-category")[0]; + const editCategoryAction = renderedRow.cells[renderedRow.cells.length - 1].item.value.actions.filter(a => a.id == "edit-item")[0]; const originalShowDialog = settings.showDialog; let popupSurvey: SurveyModel | undefined; @@ -356,14 +356,14 @@ test("Preset edit, toolbox - edit item", () => { expect(itemsQuestion.visibleRows).toHaveLength(2); const renderedRow = itemsQuestion.renderedTable.rows.filter(r => r.row == itemsQuestion.visibleRows[0])[0]; - const editItemAction = renderedRow.cells[renderedRow.cells.length - 1].item.value.actions.filter(a => a.id == "edit-category")[0]; + const editItemAction = renderedRow.cells[renderedRow.cells.length - 1].item.value.actions.filter(a => a.id == "edit-item")[0]; editItemAction.action(); const nameQuestion = popupSurvey!.getQuestionByName("name"); expect(nameQuestion.readOnly).toBeTruthy(); const renderedRow2 = matrixQuestion.renderedTable.rows.filter(r => r.row == matrixQuestion.visibleRows[1])[0]; - const editItemAction2 = renderedRow2.cells[renderedRow2.cells.length - 1].item.value.actions.filter(a => a.id == "edit-category")[0]; + const editItemAction2 = renderedRow2.cells[renderedRow2.cells.length - 1].item.value.actions.filter(a => a.id == "edit-item")[0]; editItemAction2.action(); const nameQuestion2 = popupSurvey!.getQuestionByName("name"); diff --git a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts index 207cce451c..2cfec8538b 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts @@ -243,11 +243,11 @@ test("Preset edit model, toolbox items, default value and apply", () => { const defaultItems = new QuestionToolbox().getDefaultItems([], false, true, true); expect(question.visibleRows).toHaveLength(defaultItems.length); expect(question.value).toHaveLength(defaultItems.length); - question.value = question.value.filter(r => ["boolean", "text", "checkbox"].indexOf(r.name) >= 0).sort((a, b)=>a.name < b.name ? 1 : -1); + question.value = question.value.filter(r => ["boolean", "comment", "checkbox"].indexOf(r.name) >= 0).sort((a, b)=>a.name < b.name ? 1 : -1); const etalon: ICreatorPresetData = { toolbox: { categories: [], - definition: [{ name: "text" }, { name: "checkbox" }, { name: "boolean" }] + definition: [{ name: "comment" }, { name: "checkbox" }, { name: "boolean" }] } }; const testJson = editor.preset.getJson(); From 10d36d5f7d6bca3f569663562616dfdfcfa1650d Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 29 Aug 2025 16:13:58 +0300 Subject: [PATCH 090/240] #7004 - work with defaults --- .../src/presets/presets-editable-base.ts | 15 +++++----- .../presets/presets-editable-categorized.ts | 8 ++++-- .../src/presets/presets-editable-list.ts | 28 ++++++++++++++----- .../presets/presets-editable-properties.ts | 1 + .../src/presets/presets-editable-toolbox.ts | 23 +++++++++++++-- packages/survey-creator-core/src/toolbox.ts | 15 ++++++++++ .../presets-editor-toolbox.tests.ts | 10 +++++-- 7 files changed, 77 insertions(+), 23 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index 7ddad98672..f2d7b65fbd 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -162,13 +162,13 @@ export class CreatorPresetEditableBase { } protected showDetailPanelInPopup(matrix: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, rootElement: HTMLElement, options: {width?: string, actions?: IAction[]}) { + const data = matrix.value[(matrix.visibleRows as any).findIndex(r => r === row)]; + const survey = new SurveyModel({ elements: matrix.toJSON().detailElements }); + survey.fitToContainer = false; + survey.showNavigationButtons = false; + survey.data = data; + survey.css = presetsCss; if (settings.showDialog) { - const data = matrix.value[(matrix.visibleRows as any).findIndex(r => r === row)]; - const survey = new SurveyModel({ elements: matrix.toJSON().detailElements }); - survey.fitToContainer = false; - survey.showNavigationButtons = false; - survey.data = data; - survey.css = presetsCss; const popupModel = settings.showDialog?.({ componentName: "survey", data: { survey: survey, model: survey }, @@ -211,9 +211,8 @@ export class CreatorPresetEditableBase { } survey.getAllPanels().forEach(q => (q as PanelModel).visible = !(q as PanelModel).visible); survey.getAllQuestions().forEach(q => q.visible = !q.visible); - - return survey; } + return survey; } public static updateModifiedText(locStrs: any, text: string, localizationName: string): void { if (!localizationName) return undefined; diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 58d261beb4..b3be84cd65 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -11,7 +11,10 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre //private replaceNonLettersWithDash(inputString) { // return inputString?.replace(/[^a-zA-Z0-9]/g, "-"); //} - + protected defaultCategories: any; + protected getDefaultItems(question?: QuestionMatrixDynamicModel) { + return question?.name === this.nameCategories ? this.defaultCategories : this.defaultItems; + } protected get nameInnerMatrix() { return "items"; } protected get nameCategories() { return this.fullPath + "_categories"; } public getMainElementName() : any { return this.nameCategories; } @@ -39,7 +42,8 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre } private resetCategory(model: SurveyModel, row: MatrixDynamicRowModel) { const category = row.getValue("category"); - const defaultItems = this.defaultItems.filter(i => i.category == category); + const defaultItems = this.defaultCategories.filter(i => i.category == category)[0]?.items; + if (!defaultItems) return; const categoriesQuestion = this.getQuestionCategories(model); const hiddenItemsQuestion = this.getMatrix(model); const hiddenValue = hiddenItemsQuestion.value || []; diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 0fd263fc6f..6bd08b4af3 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -15,14 +15,23 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { protected get nameMatrix() { return this.fullPath + "_matrix"; } public getMainElementName() : any { return this.nameMatrix; } protected getMatrixKeyColumnName(question: QuestionMatrixDynamicModel) : any { return "name"; } - protected defaultItems: any[]; + protected getDefaultItems(question?: QuestionMatrixDynamicModel) { + return this.defaultItems; + } + protected getDefaultItem(question: QuestionMatrixDynamicModel, key: string) { + const keyColumn = this.getMatrixKeyColumnName(question); + return this.getDefaultItems(question).filter(i => i[keyColumn] == key)[0]; + } + + protected defaultItems: any; //private fillAutoName(question: QuestionMatrixDynamicModel, propName: string) { // question.value?.filter(v =>v.isDefault === false && !v[propName]).forEach(v => v[propName] = this.replaceNonLettersWithDash(v.title)); //} protected updateResetAction(question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, actions: IAction[]) { - const rowData = question.value.filter(r => row.value.name == r.name)[0]; - const defaultItem = this.defaultItems.filter(i => i.name == rowData.name)[0]; + const keyColumn = this.getMatrixKeyColumnName(question); + const rowData = question.value.filter(r => row.value[keyColumn] == r[keyColumn])[0]; + const defaultItem = this.getDefaultItem(question, rowData[keyColumn]); if (defaultItem) { const defaultData = {}; Object.keys(rowData).forEach(key => defaultData[key] = defaultItem[key]); @@ -79,25 +88,30 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { } private editItem(model: SurveyModel, creator: SurveyCreatorModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { - let survey; + let survey: SurveyModel; + const itemKey = this.getMatrixKeyColumnName(question); const resetAction = { id: "reset-to-default", title: "Reset to default", css: "sps-action--grow", innerCss: "sps-btn sps-btn--secondary-alert", visibleIndex: 15, - action: (a)=>{ - const defaultItem = this.defaultItems.filter(i => i.name == survey.getQuestionByName(this.getMatrixKeyColumnName(question)).value)[0]; + action: (a) => { + const defaultItem = this.getDefaultItem(question, survey.getValue(itemKey)); survey.data = defaultItem; creator.notify(a.title); } }; survey = this.showDetailPanelInPopup(question, row, model.rootElement, { actions: [new Action(resetAction)] }); + const keyQuestion = survey.getQuestionByName(itemKey); + if (this.getDefaultItem(question, keyQuestion.value)) { + keyQuestion.readOnly = true; + } } private resetItem(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { const name = row.getValue("name"); - const defaultItems = this.defaultItems.filter(i => i.name == name)[0]; + const defaultItems = this.getDefaultItem(question, name); if (defaultItems) { const value = question.value; const itemRow = value.filter(v => v.name == name)[0]; diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 00dc7d0f87..4fe275e612 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -399,6 +399,7 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare this.propertyGridSetObj(this.currentProperties.getObj()); const categories = this.currentProperties.getInitialJson(); this.defaultItems = []; + this.defaultCategories = []; model.setValue(this.nameCategories, categories); this.firstTimeLoading = false; //this.propCreator.JSON = this.updateCreatorJSON(this.currentProperties.propertyGrid.survey.toJSON()); diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 36593e49d8..e49e57fdc9 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -5,6 +5,7 @@ import { PresetItemValue, QuestionPresetRankingModel } from "./preset-question-r import { ICreatorPresetToolboxItem } from "survey-creator-core"; import { CreatorPresetEditorModel } from "./presets-editor"; import { CreatorPresetEditableCaregorizedListConfigurator } from "./presets-editable-categorized"; +import { IToolboxCategoryDefinition } from "../toolbox"; const LocCategoriesName = "toolboxCategories"; @@ -265,7 +266,10 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita this.setupPageQuestions(model, creatorSetup.creator); } private setupPageQuestions(model: SurveyModel, creator: SurveyCreatorModel): void { - this.defaultItems = creator.toolbox.getDefaultItems([], true, true, true).map(i => this.createToolboxItemRow(i)); + const toolboxDefaultItems = creator.toolbox.getDefaultItems([], true, true, true); + const toolboxDefaultCategories = creator.toolbox.getDefaultCategories(); + this.defaultItems = toolboxDefaultItems.map(i => this.createToolboxItemRow(i)); + this.defaultCategories = toolboxDefaultCategories.map(i => this.createToolboxCategoryRow(i)); this.setQuestionItemsRows(model); } private setQuestionItemsRows(model: SurveyModel): void { @@ -288,7 +292,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita protected setupQuestionsValueCore(model: SurveyModel, json: any, creator: SurveyCreatorModel): void { //this.setupQuestionsValueDefinition(model, json); this.getQuestionItems(model).value = creator.toolbox.items.map(i => this.createToolboxItemRow(i)); - const categories = creator.toolbox.categories.map(c => ({ category: c.name, items: c.items.map(i => this.createToolboxItemRow(i)) })); + const categories = creator.toolbox.categories.map(c => this.createToolboxCategoryRow(c)); model.setValue(this.nameCategories, categories); this.updateShowCategoriesTitlesElements(model); } @@ -403,10 +407,23 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita iconName: item.iconName, tooltip: item.tooltip, json: item.json, - category: item.category, subitems: item.items?.map(i => this.createToolboxItemRow(i)) }; + for (const key in obj) { + if (obj[key] === undefined) { + delete obj[key]; + } + } + return obj; + } + private createToolboxCategoryRow(item: QuestionToolboxCategory) { + const obj = { + category: item.name, + title: item.title, + items: item.items?.map(i => this.createToolboxItemRow(i)) + }; + for (const key in obj) { if (obj[key] === undefined) { delete obj[key]; diff --git a/packages/survey-creator-core/src/toolbox.ts b/packages/survey-creator-core/src/toolbox.ts index 989b029089..65813a9bd8 100644 --- a/packages/survey-creator-core/src/toolbox.ts +++ b/packages/survey-creator-core/src/toolbox.ts @@ -1322,6 +1322,21 @@ export class QuestionToolbox } return res; } + public getDefaultCategories(): Array { + const items = this.getDefaultItems(this.supportedQuestions, false, true, true); + const itemsHash = {}; + items.forEach(item => { + itemsHash[item.id] = item; + }); + return Object.keys(QuestionToolbox.defaultCategories).map(cName=>{ + const category = new QuestionToolboxCategory(this); + category.name = cName; + category.title = this.getCategoryTitle(cName); + category.items = QuestionToolbox.defaultCategories[cName].map(iName => itemsHash[iName]); + return category; + }); + } + private getDefaultQuestionItems(supportedQuestions: Array, useDefaultCategories: boolean): Array { const res = []; const questions = this.getQuestionTypes(supportedQuestions); diff --git a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts index c2189bc607..ff7212f545 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts @@ -252,7 +252,8 @@ test("Preset edit, toolbox - reset item", () => { const row = itemQuestion.visibleRows.filter(r => r.getValue("name") == "text")[0]; const renderedRow = itemQuestion.renderedTable.rows.filter(r => r.row == row)[0]; - renderedRow.cells[renderedRow.cells.length - 1].item.value.actions.filter(a => a.id == "reset-to-default")[0].action(); + const resetAction = renderedRow.cells[renderedRow.cells.length - 1].item.value.actions.filter(a => a.id == "reset-to-default")[0]; + resetAction.action(resetAction); expect(itemsValue.filter(c => c.name == "text")[0].title).toEqual("Single-Line Input"); }); @@ -296,9 +297,13 @@ test("Preset edit, toolbox - edit category", () => { const editor = new CreatorPresetEditorModel(); const survey = editor.model; const categQuestion = survey.getQuestionByName("toolbox_categories"); + categQuestion.addRow(); + categQuestion.visibleRows[categQuestion.visibleRows.length - 1].getQuestionByName("category").value = "New_category"; const renderedRow = categQuestion.renderedTable.rows.filter(r => r.row == categQuestion.visibleRows[0])[0]; const editCategoryAction = renderedRow.cells[renderedRow.cells.length - 1].item.value.actions.filter(a => a.id == "edit-item")[0]; + const renderedCustomRow = categQuestion.renderedTable.rows.filter(r => r.row == categQuestion.visibleRows[categQuestion.visibleRows.length - 1])[0]; + const editCustomCategoryAction = renderedCustomRow.cells[renderedCustomRow.cells.length - 1].item.value.actions.filter(a => a.id == "edit-item")[0]; const originalShowDialog = settings.showDialog; let popupSurvey: SurveyModel | undefined; @@ -324,8 +329,7 @@ test("Preset edit, toolbox - edit category", () => { expect(popupSurvey!.getQuestionByName("category").readOnly).toBeTruthy(); - renderedRow.row.getQuestionByName("isDefault").value = false; - editCategoryAction.action(); + editCustomCategoryAction.action(); expect(popupSurvey!.getQuestionByName("category").readOnly).toBeFalsy(); } finally { settings.showDialog = originalShowDialog; From a022aa90a716c9ad3ab3d8deb4f91be393ca70e7 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 29 Aug 2025 16:33:17 +0300 Subject: [PATCH 091/240] #7004 fix tabs settings when presets enabled --- .../survey-creator-core/src/presets-creator/presets-tabs.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets-creator/presets-tabs.ts b/packages/survey-creator-core/src/presets-creator/presets-tabs.ts index 7a05e1ea34..4c0508a211 100644 --- a/packages/survey-creator-core/src/presets-creator/presets-tabs.ts +++ b/packages/survey-creator-core/src/presets-creator/presets-tabs.ts @@ -30,6 +30,7 @@ export class CreatorPresetTabs extends CreatorPresetBase { } private applyTabs(creator: SurveyCreatorModel, items: Array): void { if (!Array.isArray(items)) return; - creator.setTabs(items.map(i => i.name)); + const tabs = [...items.map(i => i.name), ...creator.tabs.map(i => i.id).filter(id => id == "presets")]; + creator.setTabs(tabs); } } \ No newline at end of file From 975f780af30c1441e943024878533df921cf1a30 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 29 Aug 2025 17:38:11 +0300 Subject: [PATCH 092/240] #7004 - fix subitems styles --- .../src/presets/presets-theme/blocks/sps-table.scss | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss index edf62a31ad..76240766b4 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -83,6 +83,10 @@ border: none; margin-top: calc(-1 * var(--sjs2-spacing-x075, 6px)); } + .sps-table__cell--detail-panel .sps-panel { + margin-top: 0; + margin-left: 32px; + } .sps-table__cell { padding: 0; @@ -90,6 +94,10 @@ padding-top: 0; border-top: none; } + + .sps-table__row--empty { + height: 40px; + } } .sps-table__cell:where(:not(.sps-table__cell--detail-panel)) { .sps-checkbox { From f255e6d1b0e777a3a9063d6798afd9073ed17dd8 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 1 Sep 2025 15:46:06 +0300 Subject: [PATCH 093/240] #7004 tabs and toolbox defaults --- .../presets/presets-editable-categorized.ts | 8 +-- .../src/presets/presets-editable-list.ts | 49 ++++++++++++------- .../src/presets/presets-editable-tabs.ts | 5 +- .../src/presets/presets-editable-toolbox.ts | 4 +- 4 files changed, 40 insertions(+), 26 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index b3be84cd65..59b7cfb823 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -37,8 +37,8 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre protected getQuestionCategories(model: SurveyModel): QuestionMatrixDynamicModel { return model.getQuestionByName(this.nameCategories); } - protected isItemsMatrix(question: QuestionMatrixDynamicModel): boolean { - return super.isItemsMatrix(question) || question.name === this.nameInnerMatrix; + protected isItemsMatrix(name: string): boolean { + return super.isItemsMatrix(name) || name === this.nameInnerMatrix; } private resetCategory(model: SurveyModel, row: MatrixDynamicRowModel) { const category = row.getValue("category"); @@ -80,8 +80,8 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre } return generalCategory; } - protected needToSetActions(question: QuestionMatrixDynamicModel) { - return this.isItemsMatrix(question) || question.name === this.nameCategories; + protected needToSetActions(name: string) { + return this.isItemsMatrix(name) || name === this.nameCategories; } protected onGetMatrixRowActionsCore(model: SurveyModel, creator: SurveyCreatorModel, options: any): void { super.onGetMatrixRowActionsCore(model, creator, options); diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 6bd08b4af3..7115063085 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -28,16 +28,29 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { // question.value?.filter(v =>v.isDefault === false && !v[propName]).forEach(v => v[propName] = this.replaceNonLettersWithDash(v.title)); //} + protected updateOnValueChangedCore(model: SurveyModel, name: string): void { + if (this.needToSetActions(name)) { + const matrix = model.getQuestionByName(name) as QuestionMatrixDynamicModel; + matrix.renderedTable.rows.forEach(r => { + if (!r.row) return; + const actions = r.cells[r.cells.length - 1].item?.value.actions; + if (!actions) return; + this.updateResetAction(matrix, r.row as MatrixDynamicRowModel, actions); + }); + } + } + protected updateResetAction(question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, actions: IAction[]) { const keyColumn = this.getMatrixKeyColumnName(question); + if (!question.value) return; const rowData = question.value.filter(r => row.value[keyColumn] == r[keyColumn])[0]; + if (!rowData) return; const defaultItem = this.getDefaultItem(question, rowData[keyColumn]); - if (defaultItem) { - const defaultData = {}; - Object.keys(rowData).forEach(key => defaultData[key] = defaultItem[key]); - const resetAction = actions.filter(a => a.id == "reset-to-default")[0]; - resetAction.enabled = !Helpers.isTwoValueEquals(rowData, defaultData); - } + if (!defaultItem) return; + const defaultData = {}; + Object.keys(rowData).forEach(key => defaultData[key] = defaultItem[key]); + const resetAction = actions.filter(a => a.id == "reset-to-default")[0]; + resetAction.enabled = !Helpers.isTwoValueEquals(rowData, defaultData); } protected createResetAction(model: SurveyModel, row: MatrixDynamicRowModel, action: (action: Action) => void): IAction { @@ -132,14 +145,14 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { return model.getQuestionByName(this.nameMatrix); } - protected isItemsMatrix(question: QuestionMatrixDynamicModel): boolean { - return question.name === this.nameMatrix; + protected isItemsMatrix(name: string): boolean { + return name === this.nameMatrix; } - protected needToSetActions(question: QuestionMatrixDynamicModel) { - return this.isItemsMatrix(question); + protected needToSetActions(name: string) { + return this.isItemsMatrix(name); } protected onGetMatrixRowActionsCore(model: SurveyModel, creator: SurveyCreatorModel, options: any): void { - if (this.needToSetActions(options.question)) { + if (this.needToSetActions(options.question.name)) { const question = options.question as QuestionMatrixDynamicModel; const allowExpand = question.detailElements.filter(e => e.visible).length > 0; const keyColumn = this.getMatrixKeyColumnName(options.question); @@ -163,12 +176,12 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { } } public onMatrixRowDragOver(model: SurveyModel, creator: SurveyCreatorModel, options: any) { - if (this.isItemsMatrix(options.fromMatrix) && this.isItemsMatrix(options.toMatrix)) { + if (this.isItemsMatrix(options.fromMatrix.name) && this.isItemsMatrix(options.toMatrix.name)) { options.allow = true; } } public onMatrixRowRemoving(model: SurveyModel, creator: SurveyCreatorModel, options: any) { - if (this.isItemsMatrix(options.question) && options.question.name != this.nameMatrix) { + if (this.isItemsMatrix(options.question.name) && options.question.name != this.nameMatrix) { const rowData = options.question.value[options.rowIndex]; const hiddenItems = this.getMatrix(model); const value = hiddenItems.value ? [...hiddenItems.value] : []; @@ -182,10 +195,10 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { } } public onMatrixCellValueChanged(model: SurveyModel, creator: SurveyCreatorModel, options: any) { - if (options.question.name == this.nameMatrix || options.question.name == this.nameItems) { - //const renderedRow = options.question.renderedTable.rows.find(r => r.row == options.row); - //const actions = renderedRow.cells[renderedRow.cells.length - 1].item.value.actions; - //this.updateResetAction(options.question, options.row, actions); + if (this.needToSetActions(options.question.name)) { + const renderedRow = options.question.renderedTable.rows.find(r => r.row == options.row); + const actions = renderedRow.cells[renderedRow.cells.length - 1].item.value.actions; + this.updateResetAction(options.question, options.row, actions); } } -} \ No newline at end of file +} diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index a2a1e11057..ce69819e32 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -132,8 +132,8 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { super.onMatrixRowRemoving(model, creator, options); } - protected isItemsMatrix(question: QuestionMatrixDynamicModel): boolean { - return question.name === this.nameItems || super.isItemsMatrix(question); + protected isItemsMatrix(name: string): boolean { + return name === this.nameItems || super.isItemsMatrix(name); } protected setJsonLocalizationStringsCore(model: SurveyModel, locStrs: any): void { const rows = this.getQuestionItems(model).visibleRows; @@ -179,6 +179,7 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { activeQ.choices = this.defaultItems.map(t => new ItemValue(t.name, t.title)); } protected updateOnValueChangedCore(model: SurveyModel, name: string): void { + super.updateOnValueChangedCore(model, name); if (name === this.nameItems) { const val = model.getValue(name) || []; model.getQuestionByName(this.nameActiveTab).visible = val.length > 1; diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index e49e57fdc9..e3e527d2c3 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -239,8 +239,8 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita if (!differs && !Helpers.isTwoValueEquals(items.map(i=>i.name), this.defaultItems.map(i=>i.name))) differs = true; return differs ? items : undefined; } - protected isItemsMatrix(question: QuestionMatrixDynamicModel): boolean { - return question.name === this.nameItems || question.name === this.nameSubitems || super.isItemsMatrix(question); + protected isItemsMatrix(name: string): boolean { + return name === this.nameItems || name === this.nameSubitems || super.isItemsMatrix(name); } public onMatrixRowRemoving(model: SurveyModel, creator: SurveyCreatorModel, options: any) { if (options.question.name == this.nameMatrix) { From 1d6bd5347852f602cbaa4133db13832bc3a2e311 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 1 Sep 2025 16:40:32 +0300 Subject: [PATCH 094/240] #7004 - fixed disabled buttons styles --- .../src/presets/presets-theme/blocks/sps-action-bar.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss index 2e88929fd9..dc7d39e1b9 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss @@ -107,6 +107,11 @@ fill: var(--ctr-actionbar-button-icon-color-hovered, var(--sjs-layer-1-foreground-75, #000000bf)); } } + &:disabled { + use { + fill: var(--sjs2-color-fg-state-common-disabled, rgba(28, 27, 32, 0.40)); + } + } } .sps-action-button--icon { From c382209caec938a6b1e6a78992e49cc3b0e2a4ab Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 1 Sep 2025 16:45:58 +0300 Subject: [PATCH 095/240] #7004 - fix row icons --- .../src/presets/presets-theme/blocks/sps-matrixdynamic.scss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss index ffe4a3f5f6..c169a8b1bd 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss @@ -92,9 +92,9 @@ margin-inline-end: var(--sjs2-spacing-x100, 8px); &:disabled { opacity: 1; - } - use { - fill: var(--sjs2-color-fg-brand-primary, #19b394); + use { + fill: var(--sjs2-color-fg-brand-primary, #19b394); + } } } From 65e912ca8c2669b223b954103ddc6ba6bd0ec687 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 1 Sep 2025 16:51:32 +0300 Subject: [PATCH 096/240] #7004 - fixed subitems defaults --- .../src/presets/presets-editable-toolbox.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index e3e527d2c3..b686e8e522 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -269,6 +269,11 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita const toolboxDefaultItems = creator.toolbox.getDefaultItems([], true, true, true); const toolboxDefaultCategories = creator.toolbox.getDefaultCategories(); this.defaultItems = toolboxDefaultItems.map(i => this.createToolboxItemRow(i)); + toolboxDefaultItems.forEach(i => { + if (i.items) { + this.defaultItems.push(...i.items.map(si => this.createToolboxItemRow(si))); + } + }); this.defaultCategories = toolboxDefaultCategories.map(i => this.createToolboxCategoryRow(i)); this.setQuestionItemsRows(model); } From 590e17e0d3588b7c414bd7c1c621ad74ed3af2cd Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 1 Sep 2025 18:11:14 +0300 Subject: [PATCH 097/240] fixed #7004 - fixed properties reset --- .../presets/presets-editable-categorized.ts | 2 +- .../presets/presets-editable-properties.ts | 33 +++++++++++++------ .../src/presets/presets-editable-toolbox.ts | 12 ++----- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 59b7cfb823..da1af00cf9 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -42,7 +42,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre } private resetCategory(model: SurveyModel, row: MatrixDynamicRowModel) { const category = row.getValue("category"); - const defaultItems = this.defaultCategories.filter(i => i.category == category)[0]?.items; + const defaultItems = this.defaultCategories.filter(i => i.category == category)[0]?.[this.nameInnerMatrix]; if (!defaultItems) return; const categoriesQuestion = this.getQuestionCategories(model); const hiddenItemsQuestion = this.getMatrix(model); diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 4fe275e612..ab7953904d 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -106,18 +106,25 @@ export class SurveyQuestionPresetPropertiesDetail { return res; } public getAllPropertiesNames(): Array { return this.allPropertiesNames; } - public getInitialJson() { - const pgJSON = this.propertyGridValue.survey.toJSON(); + public getInitialJson(useDefaults: boolean) { + const pgJSON = (useDefaults ? this.propertyGridDefaultValue : this.propertyGridValue).survey.toJSON(); return pgJSON.pages.map(p => { return { category: p.name, title: p.title, iconName: p.iconName, - properties: p.elements?.filter(e => e.name && e.name.indexOf("overridingProperty") == -1).map(e => ({ - name: e.name, - title: e.title, - description: e.description - })) + properties: p.elements?.filter(e => e.name && e.name.indexOf("overridingProperty") == -1).map(e => { + const property: any = { + name: e.name, + title: e.title + }; + + if (e.description !== undefined) { + property.description = e.description; + } + + return property; + }) }; }); } @@ -396,16 +403,22 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare this.currentClassName = selQuestion.value; if (!this.currentClassName) return; this.currentProperties = new SurveyQuestionPresetPropertiesDetail(this.currentClassName, this.currentJson); + this.setupDefaults(model); this.propertyGridSetObj(this.currentProperties.getObj()); - const categories = this.currentProperties.getInitialJson(); - this.defaultItems = []; - this.defaultCategories = []; + const categories = this.currentProperties.getInitialJson(false); model.setValue(this.nameCategories, categories); this.firstTimeLoading = false; //this.propCreator.JSON = this.updateCreatorJSON(this.currentProperties.propertyGrid.survey.toJSON()); //this.setupCreatorToolbox(this.propCreator); } + private setupDefaults(model: SurveyModel): void { + const categories = this.currentProperties?.getInitialJson(false) || []; + this.defaultCategories = [...categories]; + this.defaultItems = []; + categories.forEach(c => this.defaultItems.push(...c.properties)); + } + protected setupQuestionsValueCore(model: SurveyModel, json: any, creator: SurveyCreatorModel): void { this.getSelector(model).value = "survey"; this.isModified = !!json; diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index b686e8e522..1f78d941b4 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -263,9 +263,9 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita protected setupQuestionsCore(model: SurveyModel, creatorSetup: ICreatorPresetEditorSetup): void { super.setupQuestionsCore(model, creatorSetup); - this.setupPageQuestions(model, creatorSetup.creator); + this.setupDefaults(model, creatorSetup.creator); } - private setupPageQuestions(model: SurveyModel, creator: SurveyCreatorModel): void { + private setupDefaults(model: SurveyModel, creator: SurveyCreatorModel): void { const toolboxDefaultItems = creator.toolbox.getDefaultItems([], true, true, true); const toolboxDefaultCategories = creator.toolbox.getDefaultCategories(); this.defaultItems = toolboxDefaultItems.map(i => this.createToolboxItemRow(i)); @@ -275,12 +275,6 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita } }); this.defaultCategories = toolboxDefaultCategories.map(i => this.createToolboxCategoryRow(i)); - this.setQuestionItemsRows(model); - } - private setQuestionItemsRows(model: SurveyModel): void { - //this.allItems = this.getDefaultToolboxItems(model); - //const q = this.getMatrix(model); - //q.value = this.allItems.filter(i => !i.category); } // private isItemValuesEqual(a: Array, b: Array): boolean { // if (!a || !b || a.length !== b.length) return false; @@ -304,7 +298,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita protected onLocaleChangedCore(model: SurveyModel, json: any, creator: SurveyCreatorModel): void { const newCreator = new SurveyCreatorModel({}); newCreator.locale = creator.locale; - this.setupPageQuestions(model, newCreator); + this.setupDefaults(model, newCreator); this.setupQuestionsValueCore(model, json, newCreator); } // private setupQuestionsValueDefinition(model: SurveyModel, json: any): void { From 24d2d68e947ba83d145693e8c497df72307acdfc Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 1 Sep 2025 18:25:47 +0300 Subject: [PATCH 098/240] #7004 - in-dialog defaults --- .../src/presets/presets-editable-list.ts | 9 +++++++-- .../src/presets/presets-theme/blocks/sps-action-bar.scss | 7 +++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 7115063085..3171da5e87 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -102,8 +102,9 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { private editItem(model: SurveyModel, creator: SurveyCreatorModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { let survey: SurveyModel; + let resetAction; const itemKey = this.getMatrixKeyColumnName(question); - const resetAction = { + const resetActionParams = { id: "reset-to-default", title: "Reset to default", css: "sps-action--grow", @@ -112,10 +113,14 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { action: (a) => { const defaultItem = this.getDefaultItem(question, survey.getValue(itemKey)); survey.data = defaultItem; + resetAction.enabled = false; creator.notify(a.title); } }; - survey = this.showDetailPanelInPopup(question, row, model.rootElement, { actions: [new Action(resetAction)] }); + resetAction = new Action(resetActionParams); + survey = this.showDetailPanelInPopup(question, row, model.rootElement, { actions: [resetAction] }); + resetAction.enabled = !Helpers.isTwoValueEquals(survey.data, this.getDefaultItem(question, survey.getValue(itemKey))); + survey.onValueChanged.add(()=>resetAction.enabled = true); const keyQuestion = survey.getQuestionByName(itemKey); if (this.getDefaultItem(question, keyQuestion.value)) { keyQuestion.readOnly = true; diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss index dc7d39e1b9..1e5c65ef3e 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss @@ -50,6 +50,13 @@ &:active { background: var(--sjs2-color-bg-brand-primary, #19b394); } + &:disabled { + opacity: var(--sjs2-opacity-disabled, 0.25); + background: var(--sjs2-color-bg-state-common-disabled, #D4D4D4); + + color: var(--sjs2-color-fg-state-common-disabled, rgba(28, 27, 32, 0.40)); + pointer-events: none; + } } .sps-btn--secondary-brand { From e1779d7660fd9ed2699736d169f83b7a22ef8294 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 2 Sep 2025 09:39:25 +0300 Subject: [PATCH 099/240] #7004 fixed tests --- .../src/presets/presets-editable-list.ts | 2 ++ .../src/presets/presets-editable-toolbox.ts | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 3171da5e87..42a36b6799 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -202,7 +202,9 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { public onMatrixCellValueChanged(model: SurveyModel, creator: SurveyCreatorModel, options: any) { if (this.needToSetActions(options.question.name)) { const renderedRow = options.question.renderedTable.rows.find(r => r.row == options.row); + if (!renderedRow) return; const actions = renderedRow.cells[renderedRow.cells.length - 1].item.value.actions; + if (!actions) return; this.updateResetAction(options.question, options.row, actions); } } diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 1f78d941b4..b520702966 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -18,6 +18,7 @@ function validateToolboxJson (params) { FunctionFactory.Instance.register("validateToolboxJson", validateToolboxJson); export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEditableCaregorizedListConfigurator { private allItems: ICreatorPresetToolboxItem[]; + protected defaultSubitems: any; private createItemsMatrixJSON(props: any, addSubitems: boolean): any { const defaultJSON = { type: "matrixdynamic", @@ -172,6 +173,10 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita return [this.nameCategories, this.nameItems, this.nameShowCategoryTitles]; } + protected getDefaultItems(question?: QuestionMatrixDynamicModel) { + return question?.name === this.nameCategories ? this.defaultCategories : [...this.defaultItems, ...this.defaultSubitems]; + } + public getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { const res: any = {}; const definition = this.getJsonItemsDefinition(model); @@ -269,9 +274,10 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita const toolboxDefaultItems = creator.toolbox.getDefaultItems([], true, true, true); const toolboxDefaultCategories = creator.toolbox.getDefaultCategories(); this.defaultItems = toolboxDefaultItems.map(i => this.createToolboxItemRow(i)); + this.defaultSubitems = []; toolboxDefaultItems.forEach(i => { if (i.items) { - this.defaultItems.push(...i.items.map(si => this.createToolboxItemRow(si))); + this.defaultSubitems.push(...i.items.map(si => this.createToolboxItemRow(si))); } }); this.defaultCategories = toolboxDefaultCategories.map(i => this.createToolboxCategoryRow(i)); From a4fe609e9428ad0845abf1e6aa18dee667900171 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 2 Sep 2025 12:59:08 +0300 Subject: [PATCH 100/240] #7004 fix builds --- .../src/entries/presets.ts | 2 +- .../src/presets/preset-question-json.ts | 2 +- .../src/presets/preset-question-ranking.ts | 88 ------------------- .../src/presets/presets-editable-base.ts | 2 +- .../presets/presets-editable-categorized.ts | 9 +- .../src/presets/presets-editable-languages.ts | 4 +- .../src/presets/presets-editable-list.ts | 11 +-- .../presets/presets-editable-properties.ts | 13 ++- .../src/presets/presets-editable-tabs.ts | 4 +- .../src/presets/presets-editable-toolbox.ts | 7 +- .../src/presets/presets-editor.ts | 2 +- .../src/presets/presets-plugin.ts | 2 +- .../src/presets/PresetsPropertyGrid.tsx | 9 +- 13 files changed, 21 insertions(+), 134 deletions(-) delete mode 100644 packages/survey-creator-core/src/presets/preset-question-ranking.ts diff --git a/packages/survey-creator-core/src/entries/presets.ts b/packages/survey-creator-core/src/entries/presets.ts index 32d20bf391..958b9b7ad3 100644 --- a/packages/survey-creator-core/src/entries/presets.ts +++ b/packages/survey-creator-core/src/entries/presets.ts @@ -10,7 +10,7 @@ export * from "../presets/presets-editable-base"; //export * from "../presets/presets-tabs"; //export * from "../presets/presets-languages"; //export * from "../presets/presets-properties"; -export * from "../presets/preset-question-ranking"; +//export * from "../presets/preset-question-ranking"; export * from "../presets/preset-question-json"; import { checkLibraryVersion } from "survey-core"; import "../presets/presets-theme/presets.scss"; diff --git a/packages/survey-creator-core/src/presets/preset-question-json.ts b/packages/survey-creator-core/src/presets/preset-question-json.ts index a2e4f85ed1..2b931a3ffc 100644 --- a/packages/survey-creator-core/src/presets/preset-question-json.ts +++ b/packages/survey-creator-core/src/presets/preset-question-json.ts @@ -1,4 +1,4 @@ -import { QuestionCommentModel, ItemValue, Serializer, ElementFactory, ITextArea, Helpers, RendererFactory, TextAreaModel, CustomError, SurveyError } from "survey-core"; +import { QuestionCommentModel, Serializer, ElementFactory, Helpers, RendererFactory, TextAreaModel, CustomError, SurveyError } from "survey-core"; import { SurveyJSON5 } from "survey-creator-core"; export class QuestionPresetJsonModel extends QuestionCommentModel { diff --git a/packages/survey-creator-core/src/presets/preset-question-ranking.ts b/packages/survey-creator-core/src/presets/preset-question-ranking.ts deleted file mode 100644 index f68aeba077..0000000000 --- a/packages/survey-creator-core/src/presets/preset-question-ranking.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { QuestionRankingModel, ItemValue, Serializer, ElementFactory } from "survey-core"; -import { editorLocalization } from "survey-creator-core"; - -export class PresetItemValue extends ItemValue { - constructor(value: any, text: string = null, protected typeName = "presetitemvalue" - ) { - super(value, text, typeName); - } - public getType(): string { - return !!this.typeName ? this.typeName : "presetitemvalue"; - } - protected onPropertyValueChanged(name: string, oldValue: any, newValue: any): void { - if (name === "text" && !!oldValue && !newValue && !!this.locText.localizationName) { - const presetStrs = editorLocalization.presetStrings; - editorLocalization.presetStrings = undefined; - this.locText.text = editorLocalization.getString(this.locText.localizationName); - editorLocalization.presetStrings = presetStrs; - } - } - public updateModifiedText(locStrs: any): void { - if (!this.locText.localizationName) return undefined; - const text = this.locText.text; - const presetStrs = editorLocalization.presetStrings; - editorLocalization.presetStrings = undefined; - if (text !== editorLocalization.getString(this.locText.localizationName)) { - this.saveTextInLocStrs(locStrs, text); - } - editorLocalization.presetStrings = presetStrs; - } - private saveTextInLocStrs(locStrs: any, text: string): void { - const paths = this.locText.localizationName.split("."); - for (let i = 0; i < paths.length - 1; i ++) { - const path = paths[i]; - if (!locStrs[path]) { - locStrs[path] = {}; - } - locStrs = locStrs[path]; - } - locStrs[paths[paths.length - 1]] = text; - } -} - -export class QuestionPresetRankingModel extends QuestionRankingModel { - constructor(name: string) { - super(name); - this.itemComponent = "sv-preset-ranking-item-content"; - } - public alwaysHasValue: boolean; - public getType(): string { - return "presetranking"; - } - protected getItemValueType(): string { - return "presetitemvalue"; - } - protected getCssType(): string { - return "ranking"; - } - protected setNewValue(newValue: any): void { - if ((this.alwaysHasValue && - !Array.isArray(newValue) || newValue.length === 0) && - this.visibleChoices.length > 0) { - const val = []; - this.visibleChoices.forEach(item => val.push(item.value)); - newValue = val; - } - super.setNewValue(newValue); - } - public updateModifiedText(locStrs: any): void { - if (!this.isVisible) return; - this.choices.forEach(item => { - (item).updateModifiedText(locStrs); - }); - } -} - -Serializer.addClass("presetitemvalue", - [], - (value: any) => new PresetItemValue(value), - "itemvalue" -); -Serializer.addClass("presetranking", - [], - function () { return new QuestionPresetRankingModel(""); }, - "ranking" -); -ElementFactory.Instance.registerElement("presetranking", (name) => { - return new QuestionPresetRankingModel(name); -}, false); diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index f2d7b65fbd..4b0f9c0305 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -1,4 +1,4 @@ -import { Helpers, IDialogOptions, MatrixDynamicRowModel, QuestionMatrixDynamicModel, settings, SurveyModel, IAction, ActionBarCssClasses, PanelModel } from "survey-core"; +import { Helpers, IDialogOptions, MatrixDynamicRowModel, QuestionMatrixDynamicModel, settings, SurveyModel, IAction, PanelModel } from "survey-core"; import { PropertyGridModel, SurveyCreatorModel, editorLocalization, CreatorPresetBase, ICreatorOptions } from "survey-creator-core"; import { presetsCss } from "./presets-theme/presets"; diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index da1af00cf9..228d235cc6 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -1,10 +1,5 @@ -import { Action, FunctionFactory, Helpers, IAction, IDialogOptions, ItemValue, MatrixDropdownRowModelBase, MatrixDynamicRowModel, QuestionMatrixDropdownRenderedRow, QuestionMatrixDynamicModel, Serializer, settings, SurveyModel } from "survey-core"; -import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; -import { QuestionToolboxCategory, QuestionToolboxItem, SurveyCreatorModel, SurveyJSON5, editorLocalization } from "survey-creator-core"; -import { PresetItemValue, QuestionPresetRankingModel } from "./preset-question-ranking"; -import { ICreatorPresetToolboxItem } from "survey-creator-core"; -import { CreatorPresetEditorModel } from "./presets-editor"; -import { SurveyHelper } from "../survey-helper"; +import { IAction, MatrixDynamicRowModel, QuestionMatrixDynamicModel, SurveyModel } from "survey-core"; +import { SurveyCreatorModel, SurveyHelper } from "survey-creator-core"; import { CreatorPresetEditableList } from "./presets-editable-list"; export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPresetEditableList { diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index b7d1de91a2..0b724af2e0 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -1,5 +1,5 @@ -import { Base, Serializer, ItemValue, QuestionCheckboxBase, QuestionCheckboxModel, surveyLocalization, SurveyModel } from "survey-core"; -import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; +import { Serializer, ItemValue, QuestionCheckboxModel, surveyLocalization, SurveyModel } from "survey-core"; +import { CreatorPresetEditableBase } from "./presets-editable-base"; import { editorLocalization, SurveyCreatorModel } from "survey-creator-core"; function searchItem(params) { const questionInstance = this.survey.getQuestionByName(params[0]); diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 42a36b6799..30446eb706 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -1,11 +1,6 @@ -import { FunctionFactory, Helpers, IDialogOptions, ItemValue, MatrixDropdownRowModelBase, MatrixDynamicRowModel, QuestionMatrixDynamicModel, Serializer, settings, SurveyModel, Action, IAction } from "survey-core"; -import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; -import { QuestionToolboxCategory, QuestionToolboxItem, SurveyCreatorModel, SurveyJSON5, editorLocalization } from "survey-creator-core"; -import { PresetItemValue, QuestionPresetRankingModel } from "./preset-question-ranking"; -import { ICreatorPresetToolboxItem } from "survey-creator-core"; -import { CreatorPresetEditorModel } from "./presets-editor"; -import { SurveyHelper } from "../survey-helper"; - +import { Helpers, MatrixDynamicRowModel, QuestionMatrixDynamicModel, SurveyModel, Action, IAction } from "survey-core"; +import { CreatorPresetEditableBase } from "./presets-editable-base"; +import { SurveyCreatorModel, SurveyHelper } from "survey-creator-core"; export class CreatorPresetEditableList extends CreatorPresetEditableBase { //private replaceNonLettersWithDash(inputString) { // return inputString?.replace(/[^a-zA-Z0-9]/g, "-"); diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index ab7953904d..3d870335b9 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -1,16 +1,13 @@ import { JsonObjectProperty, ItemValue, QuestionDropdownModel, - Base, Serializer, SurveyModel, matrixDropdownColumnTypes, PageModel, - LocalizableString, - Question } from "survey-core"; -import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; + Base, Serializer, SurveyModel, matrixDropdownColumnTypes +} from "survey-core"; +import { ICreatorPresetEditorSetup } from "./presets-editable-base"; import { SurveyCreatorModel, defaultPropertyGridDefinition, ISurveyPropertyGridDefinition, ISurveyPropertiesDefinition, - SurveyQuestionProperties, editorLocalization, PropertyGridModel, TabDesignerPlugin, - ICreatorOptions, settings, IQuestionToolboxItem, SurveyHelper, calculateDragOverLocation, PageAdorner -} from "survey-creator-core"; + SurveyQuestionProperties, editorLocalization, PropertyGridModel, + settings } from "survey-creator-core"; -import { ElementFactory, QuestionMatrixDynamicModel, QuestionPanelDynamicModel } from "survey-core"; import { CreatorPresetEditableCaregorizedListConfigurator } from "./presets-editable-categorized"; // private allTypes: string[]; diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index ce69819e32..88a856d038 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -1,9 +1,7 @@ import { Helpers, ItemValue, QuestionMatrixDynamicModel, SurveyModel } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; -import { SurveyCreatorModel } from "survey-creator-core"; -import { PresetItemValue, QuestionPresetRankingModel } from "./preset-question-ranking"; +import { SurveyCreatorModel, editorLocalization } from "survey-creator-core"; import { CreatorPresetEditableList } from "./presets-editable-list"; -import { editorLocalization } from "../editorLocalization"; export class CreatorPresetEditableTabs extends CreatorPresetEditableList { private createItemsMatrixJSON(props: any): any { diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index b520702966..18cf21fc93 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -1,11 +1,8 @@ -import { FunctionFactory, Helpers, IDialogOptions, ItemValue, MatrixDropdownRowModelBase, MatrixDynamicRowModel, QuestionMatrixDropdownRenderedRow, QuestionMatrixDynamicModel, Serializer, settings, SurveyModel } from "survey-core"; +import { FunctionFactory, Helpers, QuestionMatrixDynamicModel, Serializer, SurveyModel } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; -import { QuestionToolboxCategory, QuestionToolboxItem, SurveyCreatorModel, SurveyJSON5, editorLocalization } from "survey-creator-core"; -import { PresetItemValue, QuestionPresetRankingModel } from "./preset-question-ranking"; +import { QuestionToolboxCategory, QuestionToolboxItem, SurveyCreatorModel, editorLocalization } from "survey-creator-core"; import { ICreatorPresetToolboxItem } from "survey-creator-core"; -import { CreatorPresetEditorModel } from "./presets-editor"; import { CreatorPresetEditableCaregorizedListConfigurator } from "./presets-editable-categorized"; -import { IToolboxCategoryDefinition } from "../toolbox"; const LocCategoriesName = "toolboxCategories"; diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 366f7af1da..9101ee0ab8 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -1,6 +1,6 @@ import { SurveyCreatorModel, editorLocalization, ICreatorOptions } from "survey-creator-core"; import { CreatorPreset, ICreatorPresetData } from "survey-creator-core"; -import { Action, ActionContainer, Base, ComputedUpdater, LocalizableString, Question, QuestionMatrixDropdownRenderedRow, QuestionMatrixDynamicModel, SurveyModel, createDropdownActionModel } from "survey-core"; +import { Action, ActionContainer, Base, LocalizableString, Question, QuestionMatrixDropdownRenderedRow, QuestionMatrixDynamicModel, SurveyModel } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; import { CreatorPresetEditableToolboxConfigurator } from "./presets-editable-toolbox"; import { CreatorPresetEditablePropertyGrid } from "./presets-editable-properties"; diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index d72975f348..53767e6bfe 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -1,4 +1,4 @@ -import { createDropdownActionModel, Base, SurveyModel, Action, ComputedUpdater, CurrentPageChangedEvent, PageVisibleChangedEvent, QuestionDropdownModel, ActionContainer, IAction } from "survey-core"; +import { createDropdownActionModel, IAction } from "survey-core"; import { ICreatorPlugin, SurveyCreatorModel, saveToFileHandler, extendCreatorTheme } from "survey-creator-core"; import { CreatorPresetEditorModel } from "./presets-editor"; import { listComponentCss } from "./presets-theme/list-theme"; diff --git a/packages/survey-creator-react/src/presets/PresetsPropertyGrid.tsx b/packages/survey-creator-react/src/presets/PresetsPropertyGrid.tsx index cb2c0eae71..752c7aeaf4 100644 --- a/packages/survey-creator-react/src/presets/PresetsPropertyGrid.tsx +++ b/packages/survey-creator-react/src/presets/PresetsPropertyGrid.tsx @@ -1,5 +1,4 @@ import * as React from "react"; -import PropTypes from "prop-types"; import { Base, SurveyModel, PageModel } from "survey-core"; import { ReactElementFactory, @@ -10,14 +9,8 @@ import { import { PropertyGridViewModel } from "survey-creator-core"; interface IPresetsPropertyGridWrapperProps { model: PropertyGridViewModel; - } -export class PresetsPropertyGridWrapper extends React.Component { - static propTypes = { - model: PropTypes.object.isRequired, - - }; - +export class PresetsPropertyGridWrapper extends React.Component { constructor(props: IPresetsPropertyGridWrapperProps) { super(props); } From 0e008fd43360461e5fd5c7c910b53f56165951e1 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 2 Sep 2025 17:50:31 +0300 Subject: [PATCH 101/240] #7004 - icons selector --- .../src/presets/presets-editable-list.ts | 3 +- .../presets/presets-editable-properties.ts | 2 +- .../src/presets/presets-editable-tabs.ts | 2 +- .../src/presets/presets-editable-toolbox.ts | 2 +- .../presets-theme/blocks/sps-dropdown.scss | 18 ++++++++++ .../src/entries/presets.ts | 3 +- .../src/presets/PresetsIconItem.tsx | 33 +++++++++++++++++++ 7 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 packages/survey-creator-react/src/presets/PresetsIconItem.tsx diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 30446eb706..053dad7f0b 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -1,4 +1,4 @@ -import { Helpers, MatrixDynamicRowModel, QuestionMatrixDynamicModel, SurveyModel, Action, IAction } from "survey-core"; +import { Helpers, MatrixDynamicRowModel, QuestionMatrixDynamicModel, SurveyModel, Action, IAction, SvgRegistry } from "survey-core"; import { CreatorPresetEditableBase } from "./presets-editable-base"; import { SurveyCreatorModel, SurveyHelper } from "survey-creator-core"; export class CreatorPresetEditableList extends CreatorPresetEditableBase { @@ -9,6 +9,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { protected get nameItems() { return this.path + "_items"; } protected get nameMatrix() { return this.fullPath + "_matrix"; } public getMainElementName() : any { return this.nameMatrix; } + protected get iconList() { return Object.keys(SvgRegistry.icons).map(name => "icon-" + name); } protected getMatrixKeyColumnName(question: QuestionMatrixDynamicModel) : any { return "name"; } protected getDefaultItems(question?: QuestionMatrixDynamicModel) { return this.defaultItems; diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 3d870335b9..eb92f5bec0 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -284,7 +284,7 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare detailElements: [ { type: "text", name: "category", title: "Name", isRequired: true, visible: false }, { type: "text", name: "title", title: "Title", visible: false }, - { type: "text", name: "iconName", title: "Icon Name", visible: false }, + { type: "dropdown", name: "iconName", title: "Icon name", itemComponent: "svc-presets-icon-item", "allowCustomChoices": true, choices: this.iconList, visible: false }, this.createItemsMatrixJSON({ name: this.nameInnerMatrix, }) diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index 88a856d038..45458a5f77 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -30,7 +30,7 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { detailElements: [ { type: "text", name: "name", title: "Name", isUnique: true, isRequired: true, readOnly: true, visible: false }, { type: "text", name: "title", title: "Title", visible: false }, - { type: "text", name: "iconName", title: "Icon name", visible: false } + { type: "dropdown", name: "iconName", title: "Icon name", itemComponent: "svc-presets-icon-item", "allowCustomChoices": true, choices: this.iconList, visible: false } ] }; return { ...defaultJSON, ...props }; diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 18cf21fc93..3c7bbb17ec 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -47,7 +47,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita "elements": [ { type: "text", name: "name", title: "Name", isUnique: true, visible: false, isRequired: true }, { type: "text", name: "title", title: "Title", visible: false }, - { type: "text", name: "iconName", title: "Icon name", visible: false }, + { type: "dropdown", name: "iconName", title: "Icon name", itemComponent: "svc-presets-icon-item", "allowCustomChoices": true, choices: this.iconList, visible: false }, { type: "text", name: "tooltip", title: "Tooltip", visible: false }, ], visible: false diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss index a55be172f6..e8f768e06c 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-dropdown.scss @@ -28,6 +28,9 @@ align-items: flex-start; flex: 1 0 0; position: relative; + &.sv-string-viewer { + white-space: nowrap; + } } .sps-dropdown-popup.sv-popup--menu-popup { @@ -122,3 +125,18 @@ } } } +.sps-icon-item { + display: flex; + gap: var(--sjs2-spacing-x100, 8px); +} +svg.sps-icon-item__icon, svg.sps-icon-item__icon use { + width: var(--sjs2-size-icon-medium, 24px); + height: var(--sjs2-size-icon-medium, 24px); + fill: var(--sjs2-color-fg-brand-primary, #19b394); +} +.sv-list__item--selected svg.sps-icon-item__icon use { + fill: currentColor; +} +.sps-icon-item__text { + white-space: nowrap; +} diff --git a/packages/survey-creator-react/src/entries/presets.ts b/packages/survey-creator-react/src/entries/presets.ts index 75afb28b06..811005a05d 100644 --- a/packages/survey-creator-react/src/entries/presets.ts +++ b/packages/survey-creator-react/src/entries/presets.ts @@ -1,2 +1,3 @@ export { TabPresetsComponent } from "../presets/Presets"; -export { PresetsPropertyGridWrapper } from "../presets/PresetsPropertyGrid"; \ No newline at end of file +export { PresetsPropertyGridWrapper } from "../presets/PresetsPropertyGrid"; +export { PresetsIconItem } from "../presets/PresetsIconItem"; \ No newline at end of file diff --git a/packages/survey-creator-react/src/presets/PresetsIconItem.tsx b/packages/survey-creator-react/src/presets/PresetsIconItem.tsx new file mode 100644 index 0000000000..1e5c732055 --- /dev/null +++ b/packages/survey-creator-react/src/presets/PresetsIconItem.tsx @@ -0,0 +1,33 @@ +import * as React from "react"; +import { ItemValue } from "survey-core"; +import { + ReactElementFactory, + Survey, + SurveyElementBase, + SvgIcon, +} from "survey-react-ui"; +import { PropertyGridViewModel } from "survey-creator-core"; +interface IPresetsIconItemProps { + item: ItemValue; +} +export class PresetsIconItem extends React.Component { + constructor(props: IPresetsIconItemProps) { + super(props); + } + render() { + const item = (this.props as IPresetsIconItemProps).item; + if (!item) return null; + + return ( +
+ + {item.title} +
+ ); + } +} + +ReactElementFactory.Instance.registerElement("svc-presets-icon-item", (props) => { + return React.createElement(PresetsIconItem, props); +}); From 2ab13505d18f4ce6adacc3b59737fadf47ac7059 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 4 Sep 2025 12:55:10 +0300 Subject: [PATCH 102/240] #7004 - reset --- .../src/presets/presets-editable-base.ts | 16 ++++++++++++++++ .../src/presets/presets-editable-toolbox.ts | 13 +++++++------ .../src/presets/presets-editor.ts | 4 ++++ .../src/presets/presets-plugin.ts | 2 +- .../tests-presets/presets-editor.tests.ts | 16 ++++++++++++++++ 5 files changed, 44 insertions(+), 7 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index 4b0f9c0305..5b3c37cd22 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -105,6 +105,12 @@ export class CreatorPresetEditableBase { item.setupQuestions(model, creatorSetup); }); } + public resetToDefaults(model: SurveyModel): void { + this.restoreValuesFromDefault(model); + this.children.forEach(item => { + item.resetToDefaults(model); + }); + } public setupOnCurrentPage(model: SurveyModel, creator: SurveyCreatorModel, active: boolean): void { this.setupOnCurrentPageCore(model, creator, active); this.children.forEach(item => { @@ -135,6 +141,7 @@ export class CreatorPresetEditableBase { public onMatrixCellValueChanged(model: SurveyModel, creator: SurveyCreatorModel, options: any): void { } public setupQuestionsValue(model: SurveyModel, json: any, creator: SurveyCreatorModel): void { this.setupQuestionsValueCore(model, json, creator); + this.saveValuesAsDefault(model); this.children.forEach(item => { item.setupQuestionsValue(model, !!json ? json[item.path] : undefined, creator); }); @@ -145,7 +152,16 @@ export class CreatorPresetEditableBase { item.setupQuestionsValue(model, !!json ? json[item.path] : undefined, creator); }); } + + private saveValuesAsDefault(model: SurveyModel) { + this.questionNames.forEach(name => model.getQuestionByName(name).defaultValue = model.getValue(name) && JSON.parse(JSON.stringify(model.getValue(name)))); + } + private restoreValuesFromDefault(model: SurveyModel) { + this.questionNames.forEach(name => model.getQuestionByName(name).value = model.getQuestionByName(name).defaultValue && JSON.parse(JSON.stringify(model.getQuestionByName(name).defaultValue))); + } + protected setupQuestionsCore(model: SurveyModel, creatorSetup: ICreatorPresetEditorSetup): void { } + protected resetToDefaultsCore(model: SurveyModel): void { } protected setupQuestionsValueCore(model: SurveyModel, json: any, creator: SurveyCreatorModel): void {} protected onLocaleChangedCore(model: SurveyModel, json: any, creator: SurveyCreatorModel): void {} protected getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { return undefined; } diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 3c7bbb17ec..3e482ae15f 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -167,7 +167,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita protected get nameSubitems() { return "subitems"; } protected get nameShowCategoryTitles() { return this.fullPath + "_showCategoryTitles"; } public get questionNames() { - return [this.nameCategories, this.nameItems, this.nameShowCategoryTitles]; + return [this.nameCategories, this.nameItems, this.nameMatrix, this.nameShowCategoryTitles, this.nameCategoriesMode]; } protected getDefaultItems(question?: QuestionMatrixDynamicModel) { @@ -185,7 +185,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita const toolboxCategories = defaultJson?.categories; if (mode === "categories") { const categories = this.getCategoriesJson(model); - if (Array.isArray(categories) && categories.length > 0 && (!toolbox.hasCategories || !this.isCategoriesSame(categories, toolboxCategories))) { + if (Array.isArray(categories) && categories.length > 0 && (!this.isCategoriesSame(categories, toolboxCategories))) { res.categories = this.getCategoriesJson(model); } } else { @@ -198,13 +198,13 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita } protected getDefaultJsonValueCore(creator: SurveyCreatorModel): any { return { - categories: creator.toolbox.categories.map(c => ({ name: c.name, title: c.title, items: c.items.map(i => i.name) })) + categories: creator.toolbox.categories.map(c => ({ category: c.name, title: c.title, items: c.items.map(i => i.name) })) }; } - private isCategoriesSame(categories: any, toolboxCategories: Array): boolean { + private isCategoriesSame(categories: any, toolboxCategories: any): boolean { if (categories.length !== toolboxCategories.length) return false; for (let i = 0; i < categories.length; i++) { - if (categories[i].category !== toolboxCategories[i].name) return false; + if (categories[i].category !== toolboxCategories[i].category) return false; if (categories[i].title !== toolboxCategories[i].title) return false; const toolboxItems = toolboxCategories[i].items; const categoryItems = categories[i].items; @@ -233,7 +233,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita private getJsonItemsDefinition(model: SurveyModel): any { const mode = model.getValue(this.nameCategoriesMode); const itemsRaw = (mode === "items") ? model.getValue(this.nameItems) : model.getValue(this.nameCategories).map(c => c.items).flat(); - const items = itemsRaw.map(i => ({ ...i })); + const items = (itemsRaw || []).map(i => ({ ...i })); let differs = false; items.forEach(item => { if (this.cleanIfNotDiffers(item, this.defaultItems.filter(i => i.name == item.name)[0])) differs = true; @@ -296,6 +296,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita this.getQuestionItems(model).value = creator.toolbox.items.map(i => this.createToolboxItemRow(i)); const categories = creator.toolbox.categories.map(c => this.createToolboxCategoryRow(c)); model.setValue(this.nameCategories, categories); + this.updateItemsFromCategories(model); this.updateShowCategoriesTitlesElements(model); } protected onLocaleChangedCore(model: SurveyModel, json: any, creator: SurveyCreatorModel): void { diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 9101ee0ab8..09f20ceb8b 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -89,6 +89,10 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit this.creator.readOnly = false; } + public resetToDefaults() { + this.model.editablePresets.forEach(item => item.resetToDefaults(this.model)); + } + private activatePage (model: SurveyModel, creator: SurveyCreatorModel, editablePresets: CreatorPresetEditableBase[]) { const inactivePresets = editablePresets.filter(item => model.currentPage.name !== item.pageName); const activePreset = editablePresets.filter(item => model.currentPage.name === item.pageName)[0]; diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 53767e6bfe..2f293fb180 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -57,7 +57,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { { id: "save", title: "Save & Exit", css: "sps-list__item--positive", markerIconName: "check-24x24", needSeparator: true, action: () => this.hidePresets() }, { id: "import", title: "Import", markerIconName: "import-24x24", action: () => { this.model?.loadJsonFile(); } }, { id: "export", title: "Export", markerIconName: "download-24x24", action: () => { this.model?.downloadJsonFile(); } }, - { id: "reset", title: "Reset all changes", markerIconName: "restore-24x24", needSeparator: true }, + { id: "reset", title: "Reset all changes", markerIconName: "restore-24x24", needSeparator: true, action: () => { this.model?.resetToDefaults(); } }, ]; let settingsAction; let presetsList; diff --git a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts index 2cfec8538b..951075344e 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts @@ -917,3 +917,19 @@ test("Preset edit model, set json property", () => { expect(JSON.parse(jsonQuestion.value)).toMatchObject(json); expect(editor.creator.tabs).toHaveLength(2); }); +test("Reset all changes", () => { + const editor = new CreatorPresetEditorModel({}); + const survey = editor.model; + expect(editor.json).toEqual({}); + (survey.getQuestionByName("tabs_items") as QuestionMatrixDynamicModel).removeRowByIndex(1); + expect(editor.json.tabs).toBeDefined(); + + survey.getQuestionByName("toolbox_mode").value = "items"; + expect(editor.json.toolbox.categories).toBeDefined(); + survey.getQuestionByName("toolbox_showCategoryTitles").value = true; + expect(editor.json.toolbox.showCategoryTitles).toBeDefined(); + (survey.getQuestionByName("toolbox_items") as QuestionMatrixDynamicModel).removeRowByIndex(1); + + editor.resetToDefaults(); + expect(editor.json).toEqual({}); +}); \ No newline at end of file From 117547613b674273296835e854270fc8373565a8 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 4 Sep 2025 15:10:29 +0300 Subject: [PATCH 103/240] #7004 - fix background color token --- .../survey-creator-core/src/presets/presets-theme/presets.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index 4d033b8c37..3905bf25e3 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -60,7 +60,7 @@ flex: 1 0 0; align-self: stretch; gap: var(--sjs2-spacing-x150, 12px); - background: var(--sjs2-color-utility-plain, rgba(28, 27, 32, 0.05)); + background: var(--sjs2-color-utility-surface-muted, rgba(28, 27, 32, 0.05)); } .sps-page__title { From c1f13c77a7af1e58f9ffa92191606e4087f6e5a1 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 4 Sep 2025 19:32:05 +0300 Subject: [PATCH 104/240] #7004 hide popup on blur --- packages/survey-creator-core/src/presets/presets-plugin.ts | 2 ++ .../src/presets/presets-theme/blocks/sps-popup.scss | 1 + 2 files changed, 3 insertions(+) diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 53767e6bfe..22b8be1c3a 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -80,6 +80,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { horizontalPosition: "center", cssClass: "sps-popup-menu", cssClasses: listComponentCss, + onBlur: () => { settingsAction.popupModel.hide(); }, onHide: () => { settingsAction.iconName = "navmenu-24x24"; }, onShow: () => { settingsAction.iconName = "close-24x24"; } }, this.creator); @@ -91,6 +92,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { this.model.model.onCurrentPageChanged.add((_, options) => { presetsList.selectedItem = presetsList.actions[this.model.model.currentPageNo]; }); + setTimeout(() => settingsAction.action(), 100); } public deactivate(): boolean { diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss index 80a2444a0f..baf271a524 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss @@ -3,6 +3,7 @@ @use "../fonts" as *; .sps-popup-menu.sv-popup--menu-popup { + height: unset; .sv-popup__container { border: initial; padding: var(--sjs2-spacing-x150, 12px); From 675a4c94ed28eed4b734f62bd1c1b5a690f9443f Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 4 Sep 2025 20:00:25 +0300 Subject: [PATCH 105/240] #7004 - fixed icon change --- .../src/presets/presets-editable-list.ts | 13 ++++++++++++- .../tests-presets/presets-editor.tests.ts | 15 +++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 053dad7f0b..48ccb18c95 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -29,14 +29,25 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { const matrix = model.getQuestionByName(name) as QuestionMatrixDynamicModel; matrix.renderedTable.rows.forEach(r => { if (!r.row) return; + const iconActions = r.cells[1].item?.value.actions; + this.updateIconAction(matrix, r.row as MatrixDynamicRowModel, iconActions); const actions = r.cells[r.cells.length - 1].item?.value.actions; - if (!actions) return; this.updateResetAction(matrix, r.row as MatrixDynamicRowModel, actions); }); } } + protected updateIconAction(question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, actions: IAction[]) { + if (!actions) return; + const keyColumn = this.getMatrixKeyColumnName(question); + if (!question.value) return; + const rowData = question.value.filter(r => row.value[keyColumn] == r[keyColumn])[0]; + if (!rowData) return; + const iconAction = actions.filter(a => a.id == "icon-action")[0]; + iconAction.iconName = rowData.iconName; + } protected updateResetAction(question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, actions: IAction[]) { + if (!actions) return; const keyColumn = this.getMatrixKeyColumnName(question); if (!question.value) return; const rowData = question.value.filter(r => row.value[keyColumn] == r[keyColumn])[0]; diff --git a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts index 951075344e..452583e6e0 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts @@ -932,4 +932,19 @@ test("Reset all changes", () => { editor.resetToDefaults(); expect(editor.json).toEqual({}); +}); +test("Icon change", () => { + const editor = new CreatorPresetEditorModel({}); + const survey = editor.model; + const tabs = (survey.getQuestionByName("tabs_items") as QuestionMatrixDynamicModel); + const row = tabs.visibleRows.filter(r => r.value.name == "designer")[0]; + const renderedRow = tabs.renderedTable.rows.filter(r => r.row == row)[0]; + const iconAction = renderedRow.cells[1].item.value.actions[0]; + expect(iconAction.id).toBe("icon-action"); + expect(iconAction.iconName).toBe("icon-config"); + + const tabsValue = JSON.parse(JSON.stringify(tabs.value)); + tabsValue.filter(v => v.name == "designer")[0].iconName = "icon-test"; + tabs.value = tabsValue; + expect(iconAction.iconName).toBe("icon-test"); }); \ No newline at end of file From 84825eade66a85645a358edcff8d9e1a79a66a10 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 4 Sep 2025 20:20:21 +0300 Subject: [PATCH 106/240] #7004 - do not act on disabled sidebar button --- .../src/components/side-bar/tab-control-model.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/survey-creator-core/src/components/side-bar/tab-control-model.ts b/packages/survey-creator-core/src/components/side-bar/tab-control-model.ts index 810797d70b..051eddacd9 100644 --- a/packages/survey-creator-core/src/components/side-bar/tab-control-model.ts +++ b/packages/survey-creator-core/src/components/side-bar/tab-control-model.ts @@ -20,6 +20,7 @@ export class TabControlModel extends Base { visible: true, pressed: false, action: () => { + if (!this.expandCollapseAction.enabled) return; if (this.sidePanel.visible) { this.sidePanel.collapseSidebar(); } else { From 1d87b01d52b10c15ef541bbec1666c88d57f405d Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 4 Sep 2025 20:20:47 +0300 Subject: [PATCH 107/240] #7004 - lose focus on enter --- .../survey-creator-core/src/presets/presets-editable-base.ts | 1 + packages/survey-creator-core/src/presets/presets-editor.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index 5b3c37cd22..3b7ab1f729 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -184,6 +184,7 @@ export class CreatorPresetEditableBase { survey.showNavigationButtons = false; survey.data = data; survey.css = presetsCss; + survey.enterKeyAction = "loseFocus"; if (settings.showDialog) { const popupModel = settings.showDialog?.({ componentName: "survey", diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 09f20ceb8b..95c5a841d3 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -109,6 +109,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit model.showNavigationButtons = false; model.completeText = "Save & Exit"; model.pagePrevText = "Back"; + model.enterKeyAction = "loseFocus"; editablePresets.forEach(item => item.setupQuestions(model, this)); if (!this.defaultJsonValue) { From 94836935c4384896e20d0f9b3172108b7cff7b0b Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 4 Sep 2025 20:28:54 +0300 Subject: [PATCH 108/240] #7004 - fixed modal dialog width --- .../src/presets/presets-editable-base.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index 3b7ab1f729..807b11382e 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -177,7 +177,7 @@ export class CreatorPresetEditableBase { return Helpers.getUnbindValue(json); } - protected showDetailPanelInPopup(matrix: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, rootElement: HTMLElement, options: {width?: string, actions?: IAction[]}) { + protected showDetailPanelInPopup(matrix: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, rootElement: HTMLElement, options: {actions?: IAction[]}) { const data = matrix.value[(matrix.visibleRows as any).findIndex(r => r === row)]; const survey = new SurveyModel({ elements: matrix.toJSON().detailElements }); survey.fitToContainer = false; @@ -207,12 +207,8 @@ export class CreatorPresetEditableBase { title: "Edit", displayMode: "popup" }, rootElement); - if (!options.width) { - if (survey.calculatedWidthMode == "responsive") { - popupModel.width = "100%"; - } - } else { - popupModel.width = options.width; + if (survey.getAllQuestions().filter(q => !q.startWithNewLine).length > 0) { + popupModel.width = "100%"; } if (popupModel.footerToolbar) { From 32666e8e51d157cba58cd1cafed73153fdb8373f Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 4 Sep 2025 20:32:00 +0300 Subject: [PATCH 109/240] #7005 fix exception for new items --- .../survey-creator-core/src/presets/presets-editable-list.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 48ccb18c95..173dbc6e50 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -29,7 +29,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { const matrix = model.getQuestionByName(name) as QuestionMatrixDynamicModel; matrix.renderedTable.rows.forEach(r => { if (!r.row) return; - const iconActions = r.cells[1].item?.value.actions; + const iconActions = r.cells[1]?.item?.value.actions; this.updateIconAction(matrix, r.row as MatrixDynamicRowModel, iconActions); const actions = r.cells[r.cells.length - 1].item?.value.actions; this.updateResetAction(matrix, r.row as MatrixDynamicRowModel, actions); From 24e0a33e1b215198cff2e30347ba6c435ff301c6 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 9 Sep 2025 16:06:31 +0300 Subject: [PATCH 110/240] #7004 - default icons --- .../src/presets/presets-editable-list.ts | 13 +++++++------ .../src/presets/presets-editable-properties.ts | 2 ++ .../src/presets/presets-editable-tabs.ts | 2 +- .../src/presets/presets-editable-toolbox.ts | 1 + .../tests-presets/presets-editor.tests.ts | 12 ++++++++++++ 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 173dbc6e50..3fe663154a 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -1,13 +1,14 @@ -import { Helpers, MatrixDynamicRowModel, QuestionMatrixDynamicModel, SurveyModel, Action, IAction, SvgRegistry } from "survey-core"; +import { Helpers, MatrixDynamicRowModel, QuestionMatrixDynamicModel, SurveyModel, Action, IAction, SvgRegistry, Question } from "survey-core"; import { CreatorPresetEditableBase } from "./presets-editable-base"; import { SurveyCreatorModel, SurveyHelper } from "survey-creator-core"; export class CreatorPresetEditableList extends CreatorPresetEditableBase { //private replaceNonLettersWithDash(inputString) { // return inputString?.replace(/[^a-zA-Z0-9]/g, "-"); //} - + private defaultIcon = "icon-pg-undefined-24x24"; protected get nameItems() { return this.path + "_items"; } protected get nameMatrix() { return this.fullPath + "_matrix"; } + protected hasIcon(_: string) { return false; } public getMainElementName() : any { return this.nameMatrix; } protected get iconList() { return Object.keys(SvgRegistry.icons).map(name => "icon-" + name); } protected getMatrixKeyColumnName(question: QuestionMatrixDynamicModel) : any { return "name"; } @@ -44,7 +45,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { const rowData = question.value.filter(r => row.value[keyColumn] == r[keyColumn])[0]; if (!rowData) return; const iconAction = actions.filter(a => a.id == "icon-action")[0]; - iconAction.iconName = rowData.iconName; + iconAction.iconName = rowData.iconName || this.defaultIcon; } protected updateResetAction(question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, actions: IAction[]) { if (!actions) return; @@ -167,9 +168,9 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { if (this.needToSetActions(options.question.name)) { const question = options.question as QuestionMatrixDynamicModel; const allowExpand = question.detailElements.filter(e => e.visible).length > 0; - const keyColumn = this.getMatrixKeyColumnName(options.question); - const iconName = question.value?.filter(v => v[keyColumn] == options.row.getValue(keyColumn))[0]?.iconName; - if (iconName) { + if (this.hasIcon(options.question.name)) { + const keyColumn = this.getMatrixKeyColumnName(options.question); + const iconName = question.value?.filter(v => v[keyColumn] == options.row.getValue(keyColumn))[0]?.iconName || this.defaultIcon; options.actions.push(this.createIconAction(iconName)); } const resetAction = this.createResetAction(model, options.row, (action: Action) => { diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index eb92f5bec0..339c6fc986 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -315,6 +315,8 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare }; } + protected hasIcon(name: string) { return name == this.nameCategories; } + public getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { if (!this.isModified) return undefined; this.updateCurrentJson(model); diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index 45458a5f77..db2dd6ec96 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -88,7 +88,7 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { private filterTabs(tabs: any) { return tabs.filter(t => t.name != "presets"); } - + protected hasIcon(name: string) { return true; } protected getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { let items = model.getValue(this.nameItems); if (!Array.isArray(items)) return undefined; diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 3e482ae15f..e01d002777 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -169,6 +169,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita public get questionNames() { return [this.nameCategories, this.nameItems, this.nameMatrix, this.nameShowCategoryTitles, this.nameCategoriesMode]; } + protected hasIcon(name: string) { return name !== this.nameCategories; } protected getDefaultItems(question?: QuestionMatrixDynamicModel) { return question?.name === this.nameCategories ? this.defaultCategories : [...this.defaultItems, ...this.defaultSubitems]; diff --git a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts index 452583e6e0..ada83de426 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts @@ -947,4 +947,16 @@ test("Icon change", () => { tabsValue.filter(v => v.name == "designer")[0].iconName = "icon-test"; tabs.value = tabsValue; expect(iconAction.iconName).toBe("icon-test"); +}); + +test("Icon default", () => { + const editor = new CreatorPresetEditorModel({}); + const survey = editor.model; + const matrix = (survey.getQuestionByName("toolbox_matrix") as QuestionMatrixDynamicModel); + matrix.addRow(); + + const renderedRow = matrix.renderedTable.rows.filter(r => r.row == matrix.visibleRows[0])[0]; + const iconAction = renderedRow.cells[1].item.value.actions[0]; + expect(iconAction.id).toBe("icon-action"); + expect(iconAction.iconName).toBe("icon-pg-undefined-24x24"); }); \ No newline at end of file From 1c14f92f14cc93a69b5d771b1fb7a901f9d53f57 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 9 Sep 2025 16:15:46 +0300 Subject: [PATCH 111/240] #7004 - fixed default font family --- .../survey-creator-core/src/presets/presets-theme/presets.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index 3905bf25e3..aca3b2319a 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -24,6 +24,7 @@ @include disableLibraryAnimations; display: flex; flex-direction: column; + @include sjs2--typography--default; :has(.sps-question__content--main), :has(.sps-panel__content--main) { From 5923f0ef7e6071038c2b5586f0c611d4ff31ab43 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 9 Sep 2025 16:46:35 +0300 Subject: [PATCH 112/240] #7004 - fixed removing empty category --- .../src/presets/presets-editable-categorized.ts | 8 +++++--- .../tests-presets/presets-editor-toolbox.tests.ts | 12 ++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 228d235cc6..1ef19d5714 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -88,9 +88,11 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre super.onMatrixRowRemoving(model, creator, options); if (options.question.name == this.nameCategories) { const items = options.question.value[options.rowIndex][this.nameInnerMatrix]; - const hiddenItems = this.getMatrix(model); - const value = hiddenItems.value ? hiddenItems.value.concat(items) : items; - hiddenItems.value = value; + if (items) { + const hiddenItems = this.getMatrix(model); + const value = hiddenItems.value ? hiddenItems.value.concat(items) : items; + hiddenItems.value = value; + } } if (options.question.name == this.nameMatrix) { const rowData = options.question.value[options.rowIndex]; diff --git a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts index ff7212f545..89d1dedbd1 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts @@ -50,6 +50,18 @@ test("Preset edit, toolbox - remove whole category from categories", () => { expect(editor.json.toolbox.categories.length).toBe(4); }); +test("Preset edit, toolbox - remove empty category from categories, when there is some items in matrix", () => { + const editor = new CreatorPresetEditorModel(); + const survey = editor.model; + const categQuestion = survey.getQuestionByName("toolbox_categories"); + const matrixQuestion = survey.getQuestionByName("toolbox_matrix"); + expect(matrixQuestion.visibleRows).toHaveLength(0); + expect(categQuestion.visibleRows).toHaveLength(5); + matrixQuestion.addRow(); + categQuestion.addRow(); + categQuestion.removeRow(categQuestion.visibleRows.length - 1); +}); + test("Preset edit, toolbox - no categories", () => { const editor = new CreatorPresetEditorModel(); const survey = editor.model; From 683a61ea6bf282d3d9d1129d53436d28dd9a9a11 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 9 Sep 2025 17:54:21 +0300 Subject: [PATCH 113/240] #7004 - restore deleted items to their default gategory --- .../presets/presets-editable-categorized.ts | 12 ++++++++---- .../src/presets/presets-editable-toolbox.ts | 2 +- .../presets-editor-toolbox.tests.ts | 18 +++++++++++++++++- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 1ef19d5714..bdcb227b61 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -67,8 +67,11 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre hiddenItemsQuestion.value = hiddenValue; categoriesQuestion.value = value; } - protected findOrCreateGeneralCategory(categories: any) { - let generalCategory = categories.filter(c => c.category == "general")[0]; + protected findOrCreateCategory(categories: any, category = null) { + let generalCategory = categories.filter(c => c.category == category)[0]; + if (!generalCategory) { + generalCategory = categories.filter(c => c.category == "general")[0]; + } if (!generalCategory) { generalCategory = { category: "general", title: "General", [this.nameInnerMatrix]: [] }; categories.push(generalCategory); @@ -96,11 +99,12 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre } if (options.question.name == this.nameMatrix) { const rowData = options.question.value[options.rowIndex]; + const defaultCategory = this.defaultCategories.filter(c => c[this.nameInnerMatrix].filter(i => i.name == rowData.name).length > 0)[0]; const categories = this.getQuestionCategories(model); const catValue = categories.value; - const general = this.findOrCreateGeneralCategory(catValue); + const general = this.findOrCreateCategory(catValue, defaultCategory.category); general[this.nameInnerMatrix].push(rowData); - categories.value = catValue; + categories.value = [...catValue]; } } public onMatrixRowAdded(model: SurveyModel, creator: SurveyCreatorModel, options: any) { diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index e01d002777..85ad008553 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -340,7 +340,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita }); const unsortedNames = Object.keys(itemsObject); if (unsortedNames.length > 0) { - let generalCategory = this.findOrCreateGeneralCategory(categories); + let generalCategory = this.findOrCreateCategory(categories); generalCategory.items = generalCategory.items.concat(unsortedNames.map(name => this.createToolboxItemRow(itemsObject[name]))); } this.getQuestionCategories(model).value = categories; diff --git a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts index 89d1dedbd1..6e53da58e7 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts @@ -97,7 +97,23 @@ test("Preset edit, toolbox - remove item from hidden items to flat items", () => expect(itemsQuestion.value.filter(i => i.name == "name1")[0].title).toBe("Name1"); }); -test("Preset edit, toolbox - remove item from hidden items to general category", () => { +test("Preset edit, toolbox - remove new item from hidden items to its default category", () => { + const editor = new CreatorPresetEditorModel(); + const survey = editor.model; + survey.getQuestionByName("toolbox_mode").value = "categories"; + const categQuestion = survey.getQuestionByName("toolbox_categories"); + categQuestion.visibleRows[1].showDetailPanel(); + let items = categQuestion.visibleRows[1].detailPanel.getQuestionByName("items"); + expect(items.value.map(i => i.name)).toEqual(["text", "comment", "multipletext"]); + items.removeRow(2); + expect(items.value.map(i => i.name)).toEqual(["text", "comment"]); + + const matrixQuestion = survey.getQuestionByName("toolbox_matrix"); + matrixQuestion.removeRow(0); + expect(categQuestion.value[1].items.map(i => i.name)).toEqual(["text", "comment", "multipletext"]); +}); + +test("Preset edit, toolbox - remove new item from hidden items to general category", () => { const editor = new CreatorPresetEditorModel(); const survey = editor.model; survey.getQuestionByName("toolbox_mode").value = "categories"; From 147ba313bfa7735238b790267a800ff2177dc919 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 9 Sep 2025 18:24:44 +0300 Subject: [PATCH 114/240] #7004 - fixed test --- .../src/presets/presets-editable-categorized.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index bdcb227b61..274416453f 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -102,9 +102,9 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre const defaultCategory = this.defaultCategories.filter(c => c[this.nameInnerMatrix].filter(i => i.name == rowData.name).length > 0)[0]; const categories = this.getQuestionCategories(model); const catValue = categories.value; - const general = this.findOrCreateCategory(catValue, defaultCategory.category); + const general = this.findOrCreateCategory(catValue, defaultCategory?.category); general[this.nameInnerMatrix].push(rowData); - categories.value = [...catValue]; + categories.value = catValue; } } public onMatrixRowAdded(model: SurveyModel, creator: SurveyCreatorModel, options: any) { From f12c09bed4fe07469b59968eb819f998b2e4c19f Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 15 Sep 2025 16:08:59 +0300 Subject: [PATCH 115/240] #7004 remove theme reference --- packages/survey-creator-core/src/presets/presets-plugin.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 2f84296b50..deb13c5b4b 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -2,8 +2,6 @@ import { createDropdownActionModel, IAction } from "survey-core"; import { ICreatorPlugin, SurveyCreatorModel, saveToFileHandler, extendCreatorTheme } from "survey-creator-core"; import { CreatorPresetEditorModel } from "./presets-editor"; import { listComponentCss } from "./presets-theme/list-theme"; -import { darkTheme } from "sjs-design-tokens"; - export class TabPresetsPlugin implements ICreatorPlugin { public model: CreatorPresetEditorModel | undefined; public static iconName = "icon-settings"; @@ -41,7 +39,6 @@ export class TabPresetsPlugin implements ICreatorPlugin { }; public activate(): void { - extendCreatorTheme(darkTheme); this.creator.onActiveTabChanging.add(this.preventTabSwitch); this.model = new CreatorPresetEditorModel({}, this.creator, this.defaultJson); this.defaultJson = { ...this.model.defaultJson }; From a5a3e54a68ad1364545d6b2214b94103c8bb1561 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 15 Sep 2025 18:33:22 +0300 Subject: [PATCH 116/240] #7004 fix hidden items in pg editor --- .../src/presets/presets-editable-properties.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 339c6fc986..24f19a40ec 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -406,13 +406,22 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare this.propertyGridSetObj(this.currentProperties.getObj()); const categories = this.currentProperties.getInitialJson(false); model.setValue(this.nameCategories, categories); + const items = this.getCurrentlyHiddenItems(categories); + model.setValue(this.nameMatrix, items); this.firstTimeLoading = false; //this.propCreator.JSON = this.updateCreatorJSON(this.currentProperties.propertyGrid.survey.toJSON()); //this.setupCreatorToolbox(this.propCreator); } + private getCurrentlyHiddenItems(categories: any) { + const itemsMap: any = {}; + this.defaultItems.forEach((i: any) => itemsMap[i.name] = i); + categories.filter((c: any) => c.properties).forEach((c: any) => c.properties.forEach((p: any) => delete itemsMap[p.name])); + return Object.keys(itemsMap).map(key => itemsMap[key]); + } + private setupDefaults(model: SurveyModel): void { - const categories = this.currentProperties?.getInitialJson(false) || []; + const categories = this.currentProperties?.getInitialJson(true) || []; this.defaultCategories = [...categories]; this.defaultItems = []; categories.forEach(c => this.defaultItems.push(...c.properties)); From ff7d15f00fb647fdbd6d78db1baa339032178b87 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 17 Sep 2025 11:34:40 +0300 Subject: [PATCH 117/240] #7140 fixed drag in matrix --- .../src/presets/presets-editable-base.ts | 2 +- .../src/presets/presets-editable-categorized.ts | 2 +- .../src/presets/presets-editable-languages.ts | 2 +- .../src/presets/presets-editable-list.ts | 2 +- .../survey-creator-core/src/presets/presets-editor.ts | 2 +- .../presets/presets-theme/blocks/sps-matrixdynamic.scss | 8 ++++++++ .../src/presets/presets-theme/presets.scss | 3 ++- 7 files changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index 807b11382e..09fafb4bc2 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -25,7 +25,7 @@ export class CreatorPresetEditableBase { } public get pageName(): string { return "page_" + this.fullPath; } protected get mainPanelName() { return this.path + "_mainPanel"; } - public getMainElementName() : any { return this.mainPanelName; } + public getMainElementNames() : any { return [this.mainPanelName]; } public getMainPanelName() : any { return this.mainPanelName; } public createPages(): Array { const res = []; diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 274416453f..fb7ee60e56 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -12,7 +12,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre } protected get nameInnerMatrix() { return "items"; } protected get nameCategories() { return this.fullPath + "_categories"; } - public getMainElementName() : any { return this.nameCategories; } + public getMainElementNames() : any { return [this.nameCategories, this.nameMatrix]; } protected getMatrixKeyColumnName(question: QuestionMatrixDynamicModel) : any { return question.name === this.nameCategories ? "category" : "name"; } public get questionNames() { return [this.nameCategories]; diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index 0b724af2e0..d5ebfe6a83 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -93,7 +93,7 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { }] } ] }; } - public getMainElementName() : any { return this.surveyLocalesName; } + public getMainElementNames() : any { return [this.surveyLocalesName]; } protected getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { const creatorLocale = model.getValue(this.creatorLocaleName); diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 3fe663154a..ba7a9f3a77 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -9,7 +9,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { protected get nameItems() { return this.path + "_items"; } protected get nameMatrix() { return this.fullPath + "_matrix"; } protected hasIcon(_: string) { return false; } - public getMainElementName() : any { return this.nameMatrix; } + public getMainElementNames() : any { return [this.nameItems, this.nameMatrix]; } protected get iconList() { return Object.keys(SvgRegistry.icons).map(name => "icon-" + name); } protected getMatrixKeyColumnName(question: QuestionMatrixDynamicModel) : any { return "name"; } protected getDefaultItems(question?: QuestionMatrixDynamicModel) { diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 95c5a841d3..abc64d0131 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -190,7 +190,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit }); model.onUpdateQuestionCssClasses.add(function(_, options) { editablePresets.forEach(item => { - if (options.question.name === item.getMainElementName()) { + if (item.getMainElementNames().indexOf(options.question.name) >= 0) { options.cssClasses.content += " sps-question__content--main"; } }); diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss index c169a8b1bd..4274fd2bad 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss @@ -52,6 +52,14 @@ .sps-matrixdynamic__content { padding: var(--sjs2-spacing-x150, 12px); + &, + &>div, + &>div>.sps-table-wrapper { + display: flex; + flex-direction: column; + flex-grow: 1; + } + } .sps-table__row--detail .sps-matrixdynamic__content { padding: 0; diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index aca3b2319a..a410666995 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -27,7 +27,8 @@ @include sjs2--typography--default; :has(.sps-question__content--main), - :has(.sps-panel__content--main) { + :has(.sps-panel__content--main), + .sps-question__content--main { flex-grow: 1; display: flex; flex-direction: column; From 601296f69e3a82287b9d46b7bae0a16353b2d0db Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 19 Sep 2025 18:14:43 +0300 Subject: [PATCH 118/240] #7004 - fixed table input hover style --- .../blocks/sps-matrixdynamic.scss | 6 ++---- .../presets-theme/blocks/sps-table.scss | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss index 4274fd2bad..f3a853d796 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss @@ -53,13 +53,12 @@ .sps-matrixdynamic__content { padding: var(--sjs2-spacing-x150, 12px); &, - &>div, - &>div>.sps-table-wrapper { + & > div, + & > div > .sps-table-wrapper { display: flex; flex-direction: column; flex-grow: 1; } - } .sps-table__row--detail .sps-matrixdynamic__content { padding: 0; @@ -97,7 +96,6 @@ padding: 0; margin: var(--ctr-actionbar-button-padding-top-large-icon, var(--sjs-spacing-x1)) 0 var(--ctr-actionbar-button-padding-bottom-large-icon, var(--sjs-spacing-x1)) 0; - margin-inline-end: var(--sjs2-spacing-x100, 8px); &:disabled { opacity: 1; use { diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss index 76240766b4..194242c425 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -120,15 +120,27 @@ width: calc(100% + var(--action-container-width)); margin-right: calc(-1 * var(--action-container-width)); text-overflow: ellipsis; + + border-radius: var(--sjs2-radius-semantic-form, 8px); + padding: var(--sjs2-spacing-x100, 8px); + margin-left: 0; + transition: margin-left $creator-transition-duration; + + &:hover { + background: var(--sjs2-color-control-formbox-hovered-bg, #F5F5F5); + box-shadow: var(--sjs2-border-offset-x-form-focused, 0) var(--sjs2-border-offset-y-form-focused, 0) + var(--sjs2-border-blur-form-focused, 0) var(--sjs2-border-spread-form-focused, 2px) + var(--sjs2-color-control-formbox-hovered-border, #D4D4D4) inset; + } + &:focus, &:focus-within { - border-radius: var(--sjs2-radius-semantic-form, 8px); background: var(--sjs2-color-control-formbox-focused-bg, #f5f5f5); box-shadow: var(--sjs2-border-offset-x-form-focused, 0) var(--sjs2-border-offset-y-form-focused, 0) var(--sjs2-border-blur-form-focused, 0) var(--sjs2-border-spread-form-focused, 2px) var(--sjs2-color-control-formbox-focused-border, #19b394) inset; - padding: var(--sjs2-spacing-x100, 8px); + margin-left: var(--sjs2-spacing-x100, 8px); } } } @@ -150,7 +162,7 @@ &:focus-within { .sps-table__cell:not(.sps-table__cell--detail-panel) { .sps-input { - width: 100%; + width: calc(100% - var(--sjs2-spacing-x100, 8px)); margin-right: 0; } } From 0d74e475aa6d963f41b2c2051ca3c999099a2190 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 19 Sep 2025 23:39:22 +0300 Subject: [PATCH 119/240] #7004 - add reset for pages --- .../survey-creator-core/src/presets/presets-editor.ts | 6 ++++-- .../survey-creator-core/src/presets/presets-plugin.ts | 8 ++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index abc64d0131..97a4e220ce 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -89,8 +89,10 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit this.creator.readOnly = false; } - public resetToDefaults() { - this.model.editablePresets.forEach(item => item.resetToDefaults(this.model)); + public resetToDefaults(page?: string) { + this.model.editablePresets.forEach(item => { + if (!page || item.pageName == page) item.resetToDefaults(this.model); + }); } private activatePage (model: SurveyModel, creator: SurveyCreatorModel, editablePresets: CreatorPresetEditableBase[]) { diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index deb13c5b4b..2fe4ccf08a 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -45,7 +45,6 @@ export class TabPresetsPlugin implements ICreatorPlugin { if (this.currentValue) { this.model.model.data = this.currentValue; } - this.model.model.currentPageNo = this.currentPresetIndex; this.designerPlugin.activateSidebar(); this.model.model.onComplete.add(() => this.hidePresets()); @@ -54,7 +53,8 @@ export class TabPresetsPlugin implements ICreatorPlugin { { id: "save", title: "Save & Exit", css: "sps-list__item--positive", markerIconName: "check-24x24", needSeparator: true, action: () => this.hidePresets() }, { id: "import", title: "Import", markerIconName: "import-24x24", action: () => { this.model?.loadJsonFile(); } }, { id: "export", title: "Export", markerIconName: "download-24x24", action: () => { this.model?.downloadJsonFile(); } }, - { id: "reset", title: "Reset all changes", markerIconName: "restore-24x24", needSeparator: true, action: () => { this.model?.resetToDefaults(); } }, + { id: "reset-current", title: "Reset Languages to default", needSeparator: true, action: () => { this.model?.resetToDefaults("page_languages"); } }, + { id: "reset", title: "Reset all changes", action: () => { this.model?.resetToDefaults(); } }, ]; let settingsAction; let presetsList; @@ -85,10 +85,14 @@ export class TabPresetsPlugin implements ICreatorPlugin { bottomActions.forEach(a => a.visible = false); bottomActions.unshift(settingsAction); presetsList = settingsAction.popupModel.contentComponentData.model; + const resetCurrentAction = presetsList.getActionById("reset-current"); presetsList.selectedItem = presetsList.actions[0]; this.model.model.onCurrentPageChanged.add((_, options) => { presetsList.selectedItem = presetsList.actions[this.model.model.currentPageNo]; + resetCurrentAction.title = "Reset " + this.model.model.currentPage.navigationTitle + " to defaults"; + resetCurrentAction.action = () => { this.model?.resetToDefaults(presetsList.selectedItem.id); }; }); + presets[this.currentPresetIndex].action(presets[this.currentPresetIndex]); setTimeout(() => settingsAction.action(), 100); } From ee7d42834de042c52fc52671332dfb29ef304248 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 22 Sep 2025 11:47:39 +0300 Subject: [PATCH 120/240] #7004 reset notifications --- .../src/presets/presets-editable-base.ts | 7 +++++-- .../src/presets/presets-editable-categorized.ts | 1 + .../src/presets/presets-editable-list.ts | 3 ++- .../survey-creator-core/src/presets/presets-editor.ts | 9 ++++++++- .../survey-creator-core/src/presets/presets-plugin.ts | 2 +- 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index 09fafb4bc2..f9abfafa05 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -24,6 +24,7 @@ export class CreatorPresetEditableBase { return prefix + this.path; } public get pageName(): string { return "page_" + this.fullPath; } + public getPageTitle(model: SurveyModel): string { return model.getPageByName(this.pageName).title; } protected get mainPanelName() { return this.path + "_mainPanel"; } public getMainElementNames() : any { return [this.mainPanelName]; } public getMainPanelName() : any { return this.mainPanelName; } @@ -42,6 +43,7 @@ export class CreatorPresetEditableBase { return res; } public get questionNames(): string[] { return []; } + public notifyCallback = (message: string) => {}; public validate(model: SurveyModel): boolean { if (!this.validateCore(model)) return false; for (let i = 0; i < this.children.length; i ++) { @@ -105,10 +107,11 @@ export class CreatorPresetEditableBase { item.setupQuestions(model, creatorSetup); }); } - public resetToDefaults(model: SurveyModel): void { + public resetToDefaults(model: SurveyModel, notify = true): void { this.restoreValuesFromDefault(model); + this.notifyCallback(this.getPageTitle(model) + " resored to default"); this.children.forEach(item => { - item.resetToDefaults(model); + item.resetToDefaults(model, notify); }); } public setupOnCurrentPage(model: SurveyModel, creator: SurveyCreatorModel, active: boolean): void { diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index fb7ee60e56..2210bd3eb3 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -66,6 +66,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre hiddenItemsQuestion.value = hiddenValue; categoriesQuestion.value = value; + this.notifyCallback("Category restored to default"); } protected findOrCreateCategory(categories: any, category = null) { let generalCategory = categories.filter(c => c.category == category)[0]; diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index ba7a9f3a77..aebf21d955 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -122,7 +122,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { const defaultItem = this.getDefaultItem(question, survey.getValue(itemKey)); survey.data = defaultItem; resetAction.enabled = false; - creator.notify(a.title); + this.notifyCallback("Item restored to default"); } }; resetAction = new Action(resetActionParams); @@ -146,6 +146,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { }); question.value = value; } + this.notifyCallback("Item restored to default"); } protected restoreItems(questionItems: QuestionMatrixDynamicModel, questionHiddenItems: QuestionMatrixDynamicModel, rowIndex: number) { const rowData = questionHiddenItems.value[rowIndex]; diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 97a4e220ce..e61a96c36e 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -90,8 +90,11 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit } public resetToDefaults(page?: string) { + if (!page) { + this.notify("All settings restored to default"); + } this.model.editablePresets.forEach(item => { - if (!page || item.pageName == page) item.resetToDefaults(this.model); + if (!page || item.pageName == page) item.resetToDefaults(this.model, !!page); }); } @@ -102,6 +105,9 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit activePreset.setupOnCurrentPage(model, this.creator, true); } + private notify(message: string) { + this.creator.notify(message); + } protected createModel(): SurveyModel { const editablePresets = this.createEditablePresets(); const model = new SurveyModel(this.getEditModelJson(editablePresets)); @@ -113,6 +119,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit model.pagePrevText = "Back"; model.enterKeyAction = "loseFocus"; + editablePresets.forEach(item => item.notifyCallback = (message: string) => this.notify(message)); editablePresets.forEach(item => item.setupQuestions(model, this)); if (!this.defaultJsonValue) { this.defaultJsonValue = {}; diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 2fe4ccf08a..d4c49fb237 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -1,5 +1,5 @@ import { createDropdownActionModel, IAction } from "survey-core"; -import { ICreatorPlugin, SurveyCreatorModel, saveToFileHandler, extendCreatorTheme } from "survey-creator-core"; +import { ICreatorPlugin, SurveyCreatorModel, saveToFileHandler } from "survey-creator-core"; import { CreatorPresetEditorModel } from "./presets-editor"; import { listComponentCss } from "./presets-theme/list-theme"; export class TabPresetsPlugin implements ICreatorPlugin { From c9397d3d05548b629f6ab042b94c2e5d4534ef12 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 22 Sep 2025 21:32:58 +0300 Subject: [PATCH 121/240] #7004 - items --- .../presets/presets-editable-properties.ts | 14 +++++------ .../src/presets/presets-editable-tabs.ts | 6 +++-- .../src/presets/presets-editable-toolbox.ts | 16 +++++++++--- .../src/presets/presets-editor.ts | 8 ------ .../presets-theme/blocks/sps-action-bar.scss | 2 +- .../blocks/sps-matrixdynamic.scss | 25 ++++++++++++++----- .../presets-theme/blocks/sps-question.scss | 21 ++++++++-------- .../src/presets/presets-theme/presets.ts | 4 +-- 8 files changed, 56 insertions(+), 40 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 24f19a40ec..de3177a818 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -219,12 +219,11 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare protected createItemsMatrixJSON(props: any): any { const defaultJSON = { type: "matrixdynamic", - titleLocation: "hidden", allowRowReorder: true, cellType: "text", showHeader: false, rowCount: 0, - allowAddRows: true, + allowAddRows: false, addRowButtonLocation: "top", addRowText: "Add Custom Item", "noRowsText": "There are no items", @@ -268,7 +267,7 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare { type: "matrixdynamic", name: this.nameCategories, - title: "Add custom category", + title: "Property Grid", minRowCount: 1, allowRowReorder: true, addRowButtonLocation: "top", @@ -287,15 +286,16 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare { type: "dropdown", name: "iconName", title: "Icon name", itemComponent: "svc-presets-icon-item", "allowCustomChoices": true, choices: this.iconList, visible: false }, this.createItemsMatrixJSON({ name: this.nameInnerMatrix, + titleLocation: "hidden", }) ] }, this.createItemsMatrixJSON({ - //allowAddRows: true, - //addRowButtonLocation: "top", - //addRowText: "Add Custom Item", + title: "Unsorted items", + name: this.nameMatrix, + description: "Drag an item from this column to the left one — it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + descriptionLocation: "underInput", startWithNewLine: false, - name: this.nameMatrix }) ] }, diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index db2dd6ec96..7b30cf137c 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -8,7 +8,6 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { const defaultJSON = { type: "matrixdynamic", name: "items", - titleLocation: "hidden", allowRowReorder: true, cellType: "text", showHeader: false, @@ -46,12 +45,15 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { name: this.mainPanelName, elements: [ this.createItemsMatrixJSON({ + title: "Tabs", name: this.nameItems }), this.createItemsMatrixJSON({ startWithNewLine: false, + title: "Unsorted items", name: this.nameMatrix, - "descriptionLocation": "underInput", + description: "Drag an item from this column to the left one — it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + descriptionLocation: "underInput", }), ] }, diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 85ad008553..b0a6a91322 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -93,7 +93,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita { type: "matrixdynamic", name: this.nameCategories, - title: "Add custom category", + title: "Toolbox", visibleIf: this.getTextVisibleIf(this.nameCategoriesMode, "categories"), minRowCount: 1, allowRowReorder: true, @@ -113,20 +113,28 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita this.createItemsMatrixJSON({ name: this.nameInnerMatrix, titleLocation: "hidden", + allowAddRows: true, + addRowButtonLocation: "bottom", + addRowText: "Add a new item", valueName: "items" }, true) ] }, this.createItemsMatrixJSON({ name: this.nameItems, - titleLocation: "hidden", + title: "Toolbox", + addRowButtonLocation: "top", + addRowText: "Add Custom Item", startWithNewLine: false, visibleIf: this.getTextVisibleIf(this.nameCategoriesMode, "items"), }, false), this.createItemsMatrixJSON({ allowAddRows: true, - addRowButtonLocation: "top", - addRowText: "Add Custom Item", + title: "Unsorted items", + description: "Drag an item from this column to the left one — it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + descriptionLocation: "underInput", + addRowButtonLocation: "bottom", + addRowText: "Add a new item", startWithNewLine: false, name: this.nameMatrix }, false)] diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index e61a96c36e..4edf8ee4d6 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -149,14 +149,6 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit if (options.question.name == item.getNavigationElementName()) { options.actions = model.navigationBar.actions; } - if (options.question instanceof QuestionMatrixDynamicModel && options.question.allowAddRows) { - options.actions = [new Action({ - iconName: "add-24x24", - action: () => { - options.question.addRowUI(); - } - })]; - } }); }); model.onGetPanelTitleActions.add((_, options) => { diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss index 1e5c65ef3e..dad3235036 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss @@ -155,7 +155,7 @@ } button.sps-action-button--large { - padding: calcSize(0.5) calcSize(2); + } .sps-action-button:disabled { diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss index f3a853d796..cf3e90e340 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss @@ -1,4 +1,5 @@ @use "../../../variables.scss" as *; +@use "../fonts.scss" as *; // .sps-matrixdynamic__drag-element { // padding: calcSize(2); @@ -59,6 +60,9 @@ flex-direction: column; flex-grow: 1; } + .sps-question__description--under { + flex-grow: 0; + } } .sps-table__row--detail .sps-matrixdynamic__content { padding: 0; @@ -103,15 +107,23 @@ } } } - +.sps-matrixdynamic__footer { + margin: 0 calc(-1 * var(--sjs2-spacing-x150, 12px)) var(--sjs2-spacing-x150, 12px); + padding: 0 var(--sjs2-spacing-x150, 12px) var(--sjs2-spacing-x150, 12px); + border-bottom: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #d4d4d4); +} +.sps-table-wrapper ~ .sps-matrixdynamic__footer { + border-bottom: none; + margin-bottom: 0; + padding-bottom: 0; +} .sps-matrixdynamic__add-btn { - @include ctrDefaultBoldFont; - display: none; + @include sjs2--typography--default; + //display: none; appearance: none; border: none; - margin-top: calcSize(0.5); background: transparent; - color: var(--ctr-survey-action-button-text-color-positive, var(--sjs-primary-background-500, #19b394ff)); + color: var(--sjs2-color-fg-basic-primary, #1c1b20); } .sps-smiley-icon { @@ -134,7 +146,8 @@ .sps-question--matrixdynamic.sps-question--nested { .sps-question__header { - padding: var(--sjs2-spacing-x150, 12px); + padding: var(--sjs2-spacing-x250, 20px) var(--sjs2-spacing-x250, 20px) var(--sjs2-spacing-x100, 8px) + var(--sjs2-spacing-x250, 20px); border-bottom: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #d4d4d4); box-sizing: border-box; } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss index e15dff4be0..9494179330 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss @@ -23,16 +23,6 @@ color: var(--sjs2-color-fg-basic-primary, #1c1b20); @include sjs2--typography--default-strong; - - .sv-title-actions { - flex-direction: row-reverse; - @include sjs2--typography--default; - } - .sps-action-title-bar { - margin: 0; - padding: 0; - min-width: initial; - } } .sps-question__content { @@ -46,4 +36,15 @@ .sps-question__description { white-space: normal; + color: var(--sjs2-color-fg-basic-tertiary, rgba(28, 27, 32, 0.40)); +} + +.sps-question__description--under { + display: flex; + padding: var(--sjs2-spacing-x100, 8px); + flex-direction: column; + justify-content: flex-end; + align-items: flex-start; + flex: 1 0 0; + align-self: stretch; } diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.ts b/packages/survey-creator-core/src/presets/presets-theme/presets.ts index 53dabaf7d8..4c03ff8ba2 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.ts +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.ts @@ -106,7 +106,7 @@ export var presetsCss = { requiredMark: "sps-question__required-text", number: "sps-question__num", description: "sps-description sps-question__description", - descriptionUnderInput: "sps-description sps-question__description", + descriptionUnderInput: "sps-question__description--under", comment: "sps-comment", required: "sps-question--required", titleRequired: "sps-question__title--required", @@ -246,7 +246,7 @@ export var presetsCss = { dragElementDecorator: "sps-drag-element__svg", iconDragElement: "#icon-drag-24x24", iconDrag: "sps-matrixdynamic__drag-element", - footer: "", + footer: "sps-matrixdynamic__footer", dragDropGhostPositionTop: "sps-matrixdynamic__drag-drop-ghost-position-top", dragDropGhostPositionBottom: "sps-matrixdynamic__drag-drop-ghost-position-bottom", noRowsSection: "sps-matrixdynamic__placeholder", From 2a170f0cd079f6022449148ec3991e47230ebefe Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 23 Sep 2025 16:37:04 +0300 Subject: [PATCH 122/240] #7004 add watch --- packages/survey-creator-core/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/survey-creator-core/package.json b/packages/survey-creator-core/package.json index 252bda5060..28a92ac6dc 100644 --- a/packages/survey-creator-core/package.json +++ b/packages/survey-creator-core/package.json @@ -13,6 +13,7 @@ "build:themes": "node creator-themes-import.js && webpack --config ./webpack.themes.config.js --env buildType=dev --env emitDeclarations && webpack --config ./webpack.themes.config.js --env buildType=prod && rollup -c rollup.themes.config.js", "build:all": "npm run build && npm run build:i18n && npm run build:themes", "build:presets": "webpack --config ./webpack.presets.config.js --env buildType=dev --env emitDeclarations && webpack --config ./webpack.presets.config.js --env buildType=prod && rollup -c rollup.presets.config.js --bundleConfigAsCjs", + "watch:presets": "webpack --config ./webpack.presets.config.js --watch --env buildType=dev --env emitDeclarations && webpack --config ./webpack.presets.config.js --env buildType=prod && rollup -c rollup.presets.config.js --bundleConfigAsCjs", "test": "jest", "test:cov": "jest --coverage", "test:watch": "jest --watch", From 355fa527cd68324da8dc148f354ceec58176bf34 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 23 Sep 2025 16:37:34 +0300 Subject: [PATCH 123/240] #7004 -styling issues --- .../presets/presets-editable-categorized.ts | 2 +- .../src/presets/presets-editable-list.ts | 2 +- .../src/presets/presets-editor.ts | 2 +- .../blocks/sps-matrixdynamic.scss | 26 ++++++++++--- .../presets-theme/blocks/sps-table.scss | 39 +++++++++---------- 5 files changed, 42 insertions(+), 29 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 2210bd3eb3..6eafda9851 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -12,7 +12,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre } protected get nameInnerMatrix() { return "items"; } protected get nameCategories() { return this.fullPath + "_categories"; } - public getMainElementNames() : any { return [this.nameCategories, this.nameMatrix]; } + public getMainElementNames() : any { return [this.nameCategories]; } protected getMatrixKeyColumnName(question: QuestionMatrixDynamicModel) : any { return question.name === this.nameCategories ? "category" : "name"; } public get questionNames() { return [this.nameCategories]; diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index aebf21d955..a8e183c7b8 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -9,7 +9,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { protected get nameItems() { return this.path + "_items"; } protected get nameMatrix() { return this.fullPath + "_matrix"; } protected hasIcon(_: string) { return false; } - public getMainElementNames() : any { return [this.nameItems, this.nameMatrix]; } + public getMainElementNames() : any { return [this.nameItems]; } protected get iconList() { return Object.keys(SvgRegistry.icons).map(name => "icon-" + name); } protected getMatrixKeyColumnName(question: QuestionMatrixDynamicModel) : any { return "name"; } protected getDefaultItems(question?: QuestionMatrixDynamicModel) { diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 4edf8ee4d6..e027ce6612 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -192,7 +192,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit model.onUpdateQuestionCssClasses.add(function(_, options) { editablePresets.forEach(item => { if (item.getMainElementNames().indexOf(options.question.name) >= 0) { - options.cssClasses.content += " sps-question__content--main"; + options.cssClasses.row += " sps-table__row--main"; } }); }); diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss index cf3e90e340..a4678892e4 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss @@ -20,6 +20,7 @@ height: var(--sjs2-size-icon-medium, 24px); display: flex; padding: var(--sjs2-spacing-x100, 8px); + padding-right: 0; flex-direction: column; justify-content: center; align-items: center; @@ -51,11 +52,16 @@ bottom: 0; } +.sps-question--matrixdynamic { + display: flex; + flex-direction: column; + flex-grow: 1; +} + .sps-matrixdynamic__content { padding: var(--sjs2-spacing-x150, 12px); &, - & > div, - & > div > .sps-table-wrapper { + & > div { display: flex; flex-direction: column; flex-grow: 1; @@ -99,7 +105,8 @@ height: var(--sjs2-size-icon-medium, 24px); padding: 0; margin: var(--ctr-actionbar-button-padding-top-large-icon, var(--sjs-spacing-x1)) 0 - var(--ctr-actionbar-button-padding-bottom-large-icon, var(--sjs-spacing-x1)) 0; + var(--ctr-actionbar-button-padding-bottom-large-icon, var(--sjs-spacing-x1)) 0; + margin-left: var(--sjs2-spacing-x150, 12px); &:disabled { opacity: 1; use { @@ -107,6 +114,7 @@ } } } + .sps-matrixdynamic__footer { margin: 0 calc(-1 * var(--sjs2-spacing-x150, 12px)) var(--sjs2-spacing-x150, 12px); padding: 0 var(--sjs2-spacing-x150, 12px) var(--sjs2-spacing-x150, 12px); @@ -115,15 +123,23 @@ .sps-table-wrapper ~ .sps-matrixdynamic__footer { border-bottom: none; margin-bottom: 0; - padding-bottom: 0; + padding-top: var(--sjs2-spacing-x075, 6px); + padding-bottom: var(--sjs2-spacing-x050, 4px); + display: flex; + justify-content: stretch; } .sps-matrixdynamic__add-btn { @include sjs2--typography--default; //display: none; appearance: none; border: none; - background: transparent; + background: var(--sjs2-color-bg-neutral-secondary, rgba(95, 94, 97, 0.1)); color: var(--sjs2-color-fg-basic-primary, #1c1b20); + text-align: center; + flex-grow: 1; + &:hover { + background: var(--sjs2-color-bg-neutral-secondary-dim, rgba(95, 94, 97, 0.1)); + } } .sps-smiley-icon { diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss index 194242c425..cba77fe262 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -54,9 +54,9 @@ .sps-table__cell { padding: 0; - padding-bottom: calc(var(--sjs2-spacing-x075, 6px) + var(--sjs2-spacing-x050, 4px)); - padding-top: calc(var(--sjs2-spacing-x075, 6px) + var(--sjs2-spacing-x050, 4px)); - border-top: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #d4d4d4); + padding-bottom: var(--sjs2-spacing-x075, 6px); + padding-top: 0; + border-top: none; &:first-of-type > div { border-top-left-radius: var(--sjs2-radius-semantic-form, 8px); border-bottom-left-radius: var(--sjs2-radius-semantic-form, 8px); @@ -67,6 +67,12 @@ } } +.sps-table__row--main > .sps-table__cell { + padding-bottom: calc(var(--sjs2-spacing-x075, 6px) + var(--sjs2-spacing-x050, 4px)); + padding-top: calc(var(--sjs2-spacing-x075, 6px) + var(--sjs2-spacing-x050, 4px)); + border-top: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #d4d4d4); +} + .sps-table__cell--detail-panel { padding: 0 0 var(--sjs2-spacing-x075, 6px) 0; border-top: none; @@ -88,13 +94,6 @@ margin-left: 32px; } - .sps-table__cell { - padding: 0; - padding-bottom: var(--sjs2-spacing-x075, 6px); - padding-top: 0; - border-top: none; - } - .sps-table__row--empty { height: 40px; } @@ -120,20 +119,19 @@ width: calc(100% + var(--action-container-width)); margin-right: calc(-1 * var(--action-container-width)); text-overflow: ellipsis; - + border-radius: var(--sjs2-radius-semantic-form, 8px); padding: var(--sjs2-spacing-x100, 8px); margin-left: 0; transition: margin-left $creator-transition-duration; - + &:hover { - background: var(--sjs2-color-control-formbox-hovered-bg, #F5F5F5); - box-shadow: var(--sjs2-border-offset-x-form-focused, 0) var(--sjs2-border-offset-y-form-focused, 0) - var(--sjs2-border-blur-form-focused, 0) var(--sjs2-border-spread-form-focused, 2px) - var(--sjs2-color-control-formbox-hovered-border, #D4D4D4) inset; + background: var(--sjs2-color-control-formbox-hovered-bg, #f5f5f5); + box-shadow: var(--sjs2-border-offset-x-form-focused, 0) var(--sjs2-border-offset-y-form-focused, 0) + var(--sjs2-border-blur-form-focused, 0) var(--sjs2-border-spread-form-focused, 2px) + var(--sjs2-color-control-formbox-hovered-border, #d4d4d4) inset; } - &:focus, &:focus-within { background: var(--sjs2-color-control-formbox-focused-bg, #f5f5f5); @@ -175,9 +173,6 @@ .sps-table__cell--actions { width: 0; } -.sps-table__cell--actions:first-of-type { - width: calcSize(5); -} // .sps-table__cell--actions > .sps-matrixdynamic__drag-element { // display: inline-block; @@ -250,5 +245,7 @@ @include sjs2--typography--default; color: var(--sjs2-color-fg-basic-primary, #1c1b20); text-align: center; - height: 300px; + height: calc( + var(--sjs2-spacing-x400, 32px) + var(--sjs2-spacing-x300, 24px) + var(--sjs2-typography-line-height-default, 24px) + ); } From b1eafc4e94000f404edbe592be5acffb8e07686d Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 23 Sep 2025 17:01:06 +0300 Subject: [PATCH 124/240] #7004 - default names --- .../src/presets/presets-editable-list.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index a8e183c7b8..948419c414 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -204,9 +204,10 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { } } public onMatrixRowAdded(model: SurveyModel, creator: SurveyCreatorModel, options: any) { - if (options.question.name == this.nameMatrix) { - options.row.getQuestionByName("name").value = SurveyHelper.getNewName((options.question.value || []).map(r => ({ name: r.name })), "name"); - } + const key = this.getMatrixKeyColumnName(options.question); + const value = SurveyHelper.getNewName((options.question.value || []).map(r => ({ name: r.name })), key); + options.row.getQuestionByName(key).value = value; + options.row.getQuestionByName("title").value = value; } public onMatrixCellValueChanged(model: SurveyModel, creator: SurveyCreatorModel, options: any) { if (this.needToSetActions(options.question.name)) { From 28bb8f33bfb2bb438b8342b387a74ab6ff88a8f1 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 23 Sep 2025 18:42:34 +0300 Subject: [PATCH 125/240] #7004 - fix question border --- .../src/presets/presets-theme/blocks/sps-question.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss index 9494179330..b320675d4d 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss @@ -8,7 +8,6 @@ .sps-question--with-frame { border-radius: var(--sjs2-radius-x250, 20px); border: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #d4d4d4); - overflow: hidden; } .sps-question__header { From e73c1acbcd671b9f74d760dbf55a87fe88b83bc1 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 23 Sep 2025 18:49:46 +0300 Subject: [PATCH 126/240] #7005 - fixed empty dropdown appearance --- .../src/presets/presets-theme/blocks/sps-popup.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss index baf271a524..3568ace221 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss @@ -29,7 +29,7 @@ height: initial; } - .sv-action-bar { + .sv-popup__body-footer .sv-action-bar { width: 100%; justify-content: flex-end; } From 7799bd3c09d0c855ce9bb9298e2f83732a0580f4 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 23 Sep 2025 19:44:11 +0300 Subject: [PATCH 127/240] #7004 - do not show langauge sidebar --- .../src/presets/presets-editable-languages.ts | 35 ------------------- 1 file changed, 35 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index d5ebfe6a83..744f80c474 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -12,37 +12,6 @@ function searchItem(params) { } import { FunctionFactory } from "survey-core"; FunctionFactory.Instance.register("searchItem", searchItem); -class LocalizationPreview extends SurveyModel { - public getType(): string { - return "localizationpreview"; - } - public get locale(): string { - return this.getPropertyValueWithoutDefault("locale") || surveyLocalization.currentLocale; - } - public set locale(value: string) { - if (value === surveyLocalization.defaultLocale && !surveyLocalization.currentLocale) { - value = ""; - } - this.setPropertyValue("locale", value); - } -} - -Serializer.addClass("localizationpreview", [ - { - name: "locale", - category: "general", - choices: () => { - return surveyLocalization.getLocales(true); - }, - onGetValue: (obj: any): any => { - return obj.locale == surveyLocalization.defaultLocale ? null : obj.locale; - }, - }], ()=> new LocalizationPreview(), "survey"); -const locPreview = Serializer.createClass("localizationpreview"); -Serializer.getProperties("localizationpreview").forEach(p => { - const property = Serializer.getProperty("localizationpreview", p.name); - property.visible = p.name == "locale"; -}); export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { public createMainPageCore(): any { return { @@ -126,10 +95,6 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { question.selectAll(); } } - protected setupOnCurrentPageCore(model: SurveyModel, creator: SurveyCreatorModel, active: boolean): void { - creator.setSidebarEnabled(active); - this.propertyGridSetObj(active ? locPreview : null); - } protected updateOnValueChangedCore(model: SurveyModel, name: string): void { if (name === this.surveyUseEnglishNames) { this.updateLocaleNames(model); From afd88ff2db608932286738a80256dd010912d83e Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 23 Sep 2025 19:44:47 +0300 Subject: [PATCH 128/240] #7004 - do not show subitems icon --- .../survey-creator-core/src/presets/presets-editable-toolbox.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index b0a6a91322..b23906e1e6 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -177,7 +177,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita public get questionNames() { return [this.nameCategories, this.nameItems, this.nameMatrix, this.nameShowCategoryTitles, this.nameCategoriesMode]; } - protected hasIcon(name: string) { return name !== this.nameCategories; } + protected hasIcon(name: string) { return name !== this.nameCategories && name !== this.nameSubitems; } protected getDefaultItems(question?: QuestionMatrixDynamicModel) { return question?.name === this.nameCategories ? this.defaultCategories : [...this.defaultItems, ...this.defaultSubitems]; From f0c73a415c608395bb93abf880b2608456108e3e Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 23 Sep 2025 23:17:38 +0300 Subject: [PATCH 129/240] #7004 - fix show/hide popup --- .../survey-creator-core/src/presets/presets-plugin.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index d4c49fb237..4f8ea3f4ff 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -69,7 +69,12 @@ export class TabPresetsPlugin implements ICreatorPlugin { id: "presets-menu", locTooltipName: "ed.creatorPresetsTitle", iconName: "navmenu-24x24", - css: "sps-menu-floating-action" + css: "sps-menu-floating-action", + action: () => { + if (settingsAction.popupModel.isVisible) { + setTimeout(() => settingsAction.popupModel.hide(), 1); + } + } }, { items: [...presets, ...tools], showPointer: false, @@ -77,7 +82,6 @@ export class TabPresetsPlugin implements ICreatorPlugin { horizontalPosition: "center", cssClass: "sps-popup-menu", cssClasses: listComponentCss, - onBlur: () => { settingsAction.popupModel.hide(); }, onHide: () => { settingsAction.iconName = "navmenu-24x24"; }, onShow: () => { settingsAction.iconName = "close-24x24"; } }, this.creator); @@ -93,7 +97,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { resetCurrentAction.action = () => { this.model?.resetToDefaults(presetsList.selectedItem.id); }; }); presets[this.currentPresetIndex].action(presets[this.currentPresetIndex]); - setTimeout(() => settingsAction.action(), 100); + setTimeout(() => settingsAction.popupModel.show(), 100); } public deactivate(): boolean { From 27ccd1362b422c8cda74447720f8381394db8fc4 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 24 Sep 2025 14:03:56 +0300 Subject: [PATCH 130/240] #7004 fixed add category button --- .../src/presets/presets-editable-categorized.ts | 6 ++++-- .../src/presets/presets-editable-list.ts | 14 ++++++++++---- .../src/presets/presets-editor.ts | 3 +++ .../presets-theme/blocks/sps-matrixdynamic.scss | 17 +++++++++++++++++ 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 6eafda9851..ab070ad9ac 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -13,7 +13,9 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre protected get nameInnerMatrix() { return "items"; } protected get nameCategories() { return this.fullPath + "_categories"; } public getMainElementNames() : any { return [this.nameCategories]; } - protected getMatrixKeyColumnName(question: QuestionMatrixDynamicModel) : any { return question.name === this.nameCategories ? "category" : "name"; } + protected getMatrixKeyColumnName(question: QuestionMatrixDynamicModel) : any { + return question.name === this.nameCategories ? "category" : "name"; + } public get questionNames() { return [this.nameCategories]; } @@ -111,7 +113,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre public onMatrixRowAdded(model: SurveyModel, creator: SurveyCreatorModel, options: any) { super.onMatrixRowAdded(model, creator, options); if (options.question.name == this.nameCategories) { - options.row.getQuestionByName("category").value = SurveyHelper.getNewName((options.question.value || []).map(r => ({ name: r.category })), "category"); + this.setDefaultValueForRow(options.question, options.row); } } } \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 948419c414..5d9e92621e 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -203,11 +203,17 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { hiddenItems.value = value; } } + + protected setDefaultValueForRow(question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { + const key = this.getMatrixKeyColumnName(question); + const value = SurveyHelper.getNewName((question.value || []).map(r => ({ name: r.name })), key); + row.getQuestionByName(key).value = value; + row.getQuestionByName("title").value = value; + } public onMatrixRowAdded(model: SurveyModel, creator: SurveyCreatorModel, options: any) { - const key = this.getMatrixKeyColumnName(options.question); - const value = SurveyHelper.getNewName((options.question.value || []).map(r => ({ name: r.name })), key); - options.row.getQuestionByName(key).value = value; - options.row.getQuestionByName("title").value = value; + if (this.isItemsMatrix(options.question.name)) { + this.setDefaultValueForRow(options.question, options.row); + } } public onMatrixCellValueChanged(model: SurveyModel, creator: SurveyCreatorModel, options: any) { if (this.needToSetActions(options.question.name)) { diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index e027ce6612..161bab93a4 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -193,6 +193,9 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit editablePresets.forEach(item => { if (item.getMainElementNames().indexOf(options.question.name) >= 0) { options.cssClasses.row += " sps-table__row--main"; + options.cssClasses.buttonAdd += " sps-matrixdynamic__add-btn--icon"; + options.cssClasses.iconAdd = "sps-matrixdynamic__add-btn-icon"; + options.cssClasses.iconAddId = "#icon-add-24x24"; } }); }); diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss index a4678892e4..8c37dc95ff 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss @@ -142,6 +142,23 @@ } } +.sps-matrixdynamic__add-btn--icon { + flex-direction: row-reverse; + background: transparent; + padding: 0 0 0 var(--sjs2-spacing-x100, 8px); + .sv-string-viewer { + padding: var(--sjs2-spacing-x100, 8px); + } +} + +.sps-matrixdynamic__add-btn-icon { + display: flex; + svg { + width: 24px; + height: 24px; + } +} + .sps-smiley-icon { width: calcSize(3); height: calcSize(3); From 0e40b0c12f993d23b1fbce2cc49a8c6ae602dc4f Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 24 Sep 2025 16:15:30 +0300 Subject: [PATCH 131/240] #7004 - fixed default icon --- .../survey-creator-core/src/images-v1/square-dashed-24x24.svg | 3 +++ .../survey-creator-core/src/images-v2/square-dashed-24x24.svg | 3 +++ .../survey-creator-core/src/presets/presets-editable-list.ts | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 packages/survey-creator-core/src/images-v1/square-dashed-24x24.svg create mode 100644 packages/survey-creator-core/src/images-v2/square-dashed-24x24.svg diff --git a/packages/survey-creator-core/src/images-v1/square-dashed-24x24.svg b/packages/survey-creator-core/src/images-v1/square-dashed-24x24.svg new file mode 100644 index 0000000000..da172a8622 --- /dev/null +++ b/packages/survey-creator-core/src/images-v1/square-dashed-24x24.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/survey-creator-core/src/images-v2/square-dashed-24x24.svg b/packages/survey-creator-core/src/images-v2/square-dashed-24x24.svg new file mode 100644 index 0000000000..da172a8622 --- /dev/null +++ b/packages/survey-creator-core/src/images-v2/square-dashed-24x24.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 5d9e92621e..3d12608b7a 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -5,7 +5,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { //private replaceNonLettersWithDash(inputString) { // return inputString?.replace(/[^a-zA-Z0-9]/g, "-"); //} - private defaultIcon = "icon-pg-undefined-24x24"; + private defaultIcon = "square-dashed-24x24"; protected get nameItems() { return this.path + "_items"; } protected get nameMatrix() { return this.fullPath + "_matrix"; } protected hasIcon(_: string) { return false; } From 4f2a101c196f19e0740604919cd4011343b9093f Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 24 Sep 2025 16:52:37 +0300 Subject: [PATCH 132/240] #7004 - fixed layout --- .../src/presets/presets-editor.ts | 4 +-- .../presets-theme/blocks/sps-panel.scss | 6 ++-- .../presets-theme/blocks/sps-question.scss | 4 +++ .../presets-theme/blocks/sps-table.scss | 1 + .../src/presets/presets-theme/presets.scss | 28 ------------------- 5 files changed, 8 insertions(+), 35 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 161bab93a4..1069bc8eb7 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -192,6 +192,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit model.onUpdateQuestionCssClasses.add(function(_, options) { editablePresets.forEach(item => { if (item.getMainElementNames().indexOf(options.question.name) >= 0) { + options.cssClasses.mainRoot += " sps-question--main"; options.cssClasses.row += " sps-table__row--main"; options.cssClasses.buttonAdd += " sps-matrixdynamic__add-btn--icon"; options.cssClasses.iconAdd = "sps-matrixdynamic__add-btn-icon"; @@ -201,9 +202,6 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit }); model.onUpdatePanelCssClasses.add(function(_, options) { editablePresets.forEach(item => { - if (options.panel.name === item.getMainPanelName()) { - options.cssClasses.panel.content += " sps-panel__content--main"; - } if (options.panel.name === item.getNavigationElementName()) { options.cssClasses.panel.container += " sps-panel--navigation"; } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss index d362c6957e..07b0da6e3d 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss @@ -19,12 +19,10 @@ position: relative; display: flex; flex-direction: row-reverse; - padding: var(--sjs2-spacing-x150, 12px) var(--sjs2-spacing-x400, 32px);; + padding: var(--sjs2-spacing-x150, 12px); align-items: center; gap: var(--sjs2-spacing-x150, 12px); - border-radius: 0; - border: none; - border-top: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #D4D4D4); + .sps-panel__header { width: auto; flex-grow: 1; diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss index b320675d4d..1ab3893303 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss @@ -5,6 +5,10 @@ background: var(--sjs2-color-bg-basic-primary, #fff); } +.sps-question--main { + min-height: 420px; +} + .sps-question--with-frame { border-radius: var(--sjs2-radius-x250, 20px); border: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #d4d4d4); diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss index cba77fe262..51c993c008 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -41,6 +41,7 @@ } } } + .sd-table__row--expanded { & > td { & > div { diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index a410666995..366421949e 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -25,26 +25,6 @@ display: flex; flex-direction: column; @include sjs2--typography--default; - - :has(.sps-question__content--main), - :has(.sps-panel__content--main), - .sps-question__content--main { - flex-grow: 1; - display: flex; - flex-direction: column; - align-self: stretch; - align-items: stretch; - flex-grow: 1; - .sv-components-row > .sv-components-column--expandable { - width: 100%; - } - .sps-row--multiple { - flex-direction: row; - &>div { - height: auto; - } - } - } } .sps-container { @@ -107,14 +87,6 @@ max-width: 854px; } -.sps-row:has(.sps-panel--navigation) { - position: sticky; - margin: calc(-1 * var(--sjs2-spacing-x400, 32px)); - margin-top: 0; - bottom: 0; - max-width: initial; -} - .sps-row--multiple { display: flex; align-items: stretch; From 110e17d1624d09ede31ba6d415417aaf11cbc4b7 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 24 Sep 2025 17:29:39 +0300 Subject: [PATCH 133/240] #7004 - fixed lint --- .eslintignore | 1 + packages/survey-creator-core/.eslintignore | 1 + .../src/presets/presets-editable-properties.ts | 2 +- .../survey-creator-core/src/presets/presets-editable-tabs.ts | 2 +- .../src/presets/presets-editable-toolbox.ts | 2 +- packages/survey-creator-react/.eslintignore | 3 ++- 6 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.eslintignore b/.eslintignore index 6672f230f7..a6f20ce11c 100644 --- a/.eslintignore +++ b/.eslintignore @@ -9,6 +9,7 @@ example/ examples/ .gitignore webpack.config.js +webpack.presets.config.js index.js copy-vrt-tests.js copy-src-tests.js diff --git a/packages/survey-creator-core/.eslintignore b/packages/survey-creator-core/.eslintignore index 33c791297f..bc3c2a48fd 100644 --- a/packages/survey-creator-core/.eslintignore +++ b/packages/survey-creator-core/.eslintignore @@ -3,5 +3,6 @@ build/ doc_generator/ node_modules/ webpack.config.js +webpack.presets.config.js creator-themes-import.js creator-themes-update-fallback.js \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index de3177a818..e250649d0b 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -293,7 +293,7 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare this.createItemsMatrixJSON({ title: "Unsorted items", name: this.nameMatrix, - description: "Drag an item from this column to the left one — it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + description: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", descriptionLocation: "underInput", startWithNewLine: false, }) diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index 7b30cf137c..cf7d8ebe60 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -52,7 +52,7 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { startWithNewLine: false, title: "Unsorted items", name: this.nameMatrix, - description: "Drag an item from this column to the left one — it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + description: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", descriptionLocation: "underInput", }), ] diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index b23906e1e6..9da5e5fde4 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -131,7 +131,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita this.createItemsMatrixJSON({ allowAddRows: true, title: "Unsorted items", - description: "Drag an item from this column to the left one — it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + description: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", descriptionLocation: "underInput", addRowButtonLocation: "bottom", addRowText: "Add a new item", diff --git a/packages/survey-creator-react/.eslintignore b/packages/survey-creator-react/.eslintignore index 6ea60eb198..b0073d0dcb 100644 --- a/packages/survey-creator-react/.eslintignore +++ b/packages/survey-creator-react/.eslintignore @@ -6,4 +6,5 @@ node_modules/ index.js copy-vrt-tests.js copy-src-tests.js -webpack.config.js \ No newline at end of file +webpack.config.js +webpack.presets.config.js \ No newline at end of file From 81831c7c1306200fcd1c4de3d9e56065989df7c7 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 25 Sep 2025 22:47:33 +0300 Subject: [PATCH 134/240] #7004 - items --- .../presets/presets-editable-categorized.ts | 102 +++++++++++++++--- .../src/presets/presets-editable-list.ts | 6 +- .../src/presets/presets-editable-toolbox.ts | 28 ++++- 3 files changed, 122 insertions(+), 14 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index ab070ad9ac..4382f78330 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -1,4 +1,4 @@ -import { IAction, MatrixDynamicRowModel, QuestionMatrixDynamicModel, SurveyModel } from "survey-core"; +import { Action, createDropdownActionModel, IAction, MatrixDynamicRowModel, PopupModel, QuestionMatrixDynamicModel, SurveyModel } from "survey-core"; import { SurveyCreatorModel, SurveyHelper } from "survey-creator-core"; import { CreatorPresetEditableList } from "./presets-editable-list"; @@ -32,6 +32,86 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre }); } + private ejectRowData(question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, remove: boolean) { + const value = question.value; + const rowDataIndex = question.visibleRows.indexOf(row); + const rowData = value[rowDataIndex]; + if (remove) { + value.splice(rowDataIndex, 1); + question.value = value; + } + } + + private moveToCategory(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, categoryName: string, remove = false) { + const rowData = this.ejectRowData(question, row, remove); + const categories = this.getQuestionCategories(model); + const catValue = categories.value; + const general = this.findOrCreateCategory(catValue, categoryName); + general[this.nameInnerMatrix].push(rowData); + categories.value = catValue; + } + + protected getItemMenuActions(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { + const categories = this.getQuestionCategories(model).value; + const actions = [] as IAction[]; + categories.forEach((i: any) => actions.push( + { + id: "to-" + i.category, + title: i.title, + action: () => { + this.moveToCategory(model, question, row, i.category, true); + } + })); + actions.push( + { + id: "move-to-new-category", + title: "Move to new category", + needSeparator: true, + action: () => { + this.moveToCategory(model, question, row, this.getDefaultValueForRow(question, "category"), true); + } + }); + + if (!this.getDefaultItem(question, row.value.name)) { + actions.push( + { + id: "remove-custom-item", + title: "Delete Custom Item", + needSeparator: true, + action: () => { + this.ejectRowData(question, row, true); + } + }); + } + + return actions.map(a => new Action(a)); + } + + protected replaceRemoveAction(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, actions: IAction[]): void { + const originalAction = actions.filter(a => a.id == "remove-row")[0]; + if (originalAction) { + originalAction.visible = false; + + const addAction = createDropdownActionModel({ + id: "add-menu", + iconName: originalAction.iconName, + location: "end", + visibleIndex: 20 + }, { + items: [], + horizontalPosition: "center" + }); + addAction.popupModel.onVisibilityChanged.add((_: PopupModel, opt: { model: PopupModel, isVisible: boolean }) => { + if (opt.isVisible) { + const listModel = opt.model.contentComponentData.model; + listModel.actions = this.getItemMenuActions(model, question, row); + listModel.flushUpdates(); + } + }); + actions.push(addAction); + } + } + protected getQuestionCategories(model: SurveyModel): QuestionMatrixDynamicModel { return model.getQuestionByName(this.nameCategories); } protected isItemsMatrix(name: string): boolean { @@ -70,13 +150,10 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre categoriesQuestion.value = value; this.notifyCallback("Category restored to default"); } - protected findOrCreateCategory(categories: any, category = null) { + protected findOrCreateCategory(categories: any, category?: string) { let generalCategory = categories.filter(c => c.category == category)[0]; if (!generalCategory) { - generalCategory = categories.filter(c => c.category == "general")[0]; - } - if (!generalCategory) { - generalCategory = { category: "general", title: "General", [this.nameInnerMatrix]: [] }; + generalCategory = { category: category || "general", title: category || "General", [this.nameInnerMatrix]: [] }; categories.push(generalCategory); } return generalCategory; @@ -89,7 +166,11 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre if (options.question.name === this.nameCategories) { this.setupCategoryActions(model, creator, options.question, options.row, options.actions); } + if (options.question.name === this.nameMatrix) { + this.replaceRemoveAction(model, options.question, options.row, options.actions); + } } + public onMatrixRowRemoving(model: SurveyModel, creator: SurveyCreatorModel, options: any) { super.onMatrixRowRemoving(model, creator, options); if (options.question.name == this.nameCategories) { @@ -103,11 +184,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre if (options.question.name == this.nameMatrix) { const rowData = options.question.value[options.rowIndex]; const defaultCategory = this.defaultCategories.filter(c => c[this.nameInnerMatrix].filter(i => i.name == rowData.name).length > 0)[0]; - const categories = this.getQuestionCategories(model); - const catValue = categories.value; - const general = this.findOrCreateCategory(catValue, defaultCategory?.category); - general[this.nameInnerMatrix].push(rowData); - categories.value = catValue; + this.moveToCategory(model, options.question, options.row, defaultCategory?.category); } } public onMatrixRowAdded(model: SurveyModel, creator: SurveyCreatorModel, options: any) { @@ -116,4 +193,5 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre this.setDefaultValueForRow(options.question, options.row); } } -} \ No newline at end of file +} + diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 3d12608b7a..639ed9cbed 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -204,9 +204,13 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { } } + protected getDefaultValueForRow(question: QuestionMatrixDynamicModel, key: string) { + return SurveyHelper.getNewName((question.value || []).map(r => ({ name: r.name })), key); + } + protected setDefaultValueForRow(question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { const key = this.getMatrixKeyColumnName(question); - const value = SurveyHelper.getNewName((question.value || []).map(r => ({ name: r.name })), key); + const value = this.getDefaultValueForRow(question, key); row.getQuestionByName(key).value = value; row.getQuestionByName("title").value = value; } diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 9da5e5fde4..41d4f33901 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -1,4 +1,4 @@ -import { FunctionFactory, Helpers, QuestionMatrixDynamicModel, Serializer, SurveyModel } from "survey-core"; +import { Action, FunctionFactory, Helpers, IAction, MatrixDynamicRowModel, QuestionMatrixDynamicModel, Serializer, SurveyModel } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; import { QuestionToolboxCategory, QuestionToolboxItem, SurveyCreatorModel, editorLocalization } from "survey-creator-core"; import { ICreatorPresetToolboxItem } from "survey-creator-core"; @@ -183,6 +183,32 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita return question?.name === this.nameCategories ? this.defaultCategories : [...this.defaultItems, ...this.defaultSubitems]; } + protected getItemMenuActions(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { + const categories = this.getQuestionCategories(model).value; + const actions = super.getItemMenuActions(model, question, row); + const catActions = [] as IAction[]; + categories.forEach((i: any) => catActions.push( + new Action({ + id: "to-" + i.category, + title: i.title, + action: () => { + //this.moveToCategory(model, question, row, i.category, true); + } + }))); + actions.push( + new Action({ + id: "move-as-subitem", + title: "Move as subitem", + needSeparator: true, + items: catActions, + action: () => { + } + }) + ); + + return actions.map(a => new Action(a)); + } + public getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { const res: any = {}; const definition = this.getJsonItemsDefinition(model); From 1069fa8a4d0292dae7a7a4b293792e84af1eccd1 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 26 Sep 2025 11:37:39 +0300 Subject: [PATCH 135/240] #7004 subitems --- .../src/images-v1/more-circle-24x24.svg | 6 ++ .../src/images-v2/more-circle-24x24.svg | 6 ++ .../presets/presets-editable-categorized.ts | 19 ++++-- .../src/presets/presets-editable-toolbox.ts | 65 ++++++++++++------- 4 files changed, 67 insertions(+), 29 deletions(-) create mode 100644 packages/survey-creator-core/src/images-v1/more-circle-24x24.svg create mode 100644 packages/survey-creator-core/src/images-v2/more-circle-24x24.svg diff --git a/packages/survey-creator-core/src/images-v1/more-circle-24x24.svg b/packages/survey-creator-core/src/images-v1/more-circle-24x24.svg new file mode 100644 index 0000000000..c5dd6b8970 --- /dev/null +++ b/packages/survey-creator-core/src/images-v1/more-circle-24x24.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/packages/survey-creator-core/src/images-v2/more-circle-24x24.svg b/packages/survey-creator-core/src/images-v2/more-circle-24x24.svg new file mode 100644 index 0000000000..c5dd6b8970 --- /dev/null +++ b/packages/survey-creator-core/src/images-v2/more-circle-24x24.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 4382f78330..cac51bf995 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -32,7 +32,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre }); } - private ejectRowData(question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, remove: boolean) { + protected ejectRowData(question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, remove: boolean) { const value = question.value; const rowDataIndex = question.visibleRows.indexOf(row); const rowData = value[rowDataIndex]; @@ -40,6 +40,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre value.splice(rowDataIndex, 1); question.value = value; } + return rowData; } private moveToCategory(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, categoryName: string, remove = false) { @@ -51,7 +52,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre categories.value = catValue; } - protected getItemMenuActions(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { + protected getItemMenuActionsCore(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { const categories = this.getQuestionCategories(model).value; const actions = [] as IAction[]; categories.forEach((i: any) => actions.push( @@ -72,19 +73,23 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre } }); + return actions.map(a => new Action(a)); + } + + protected getItemMenuActions(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { + const actions = this.getItemMenuActionsCore(model, question, row); if (!this.getDefaultItem(question, row.value.name)) { actions.push( - { + new Action({ id: "remove-custom-item", title: "Delete Custom Item", needSeparator: true, action: () => { this.ejectRowData(question, row, true); } - }); + }) + ); } - - return actions.map(a => new Action(a)); } protected replaceRemoveAction(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, actions: IAction[]): void { @@ -94,7 +99,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre const addAction = createDropdownActionModel({ id: "add-menu", - iconName: originalAction.iconName, + iconName: "more-circle-24x24", location: "end", visibleIndex: 20 }, { diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 41d4f33901..4c02bd6a8d 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -183,30 +183,51 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita return question?.name === this.nameCategories ? this.defaultCategories : [...this.defaultItems, ...this.defaultSubitems]; } - protected getItemMenuActions(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { + private findItem(value: any, itemName: string) { + return value.map(c => c.items.filter(i => i.name == itemName)[0]).filter(i => !!i)[0]; + } + + private moveToSubitems(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, itemName: string, remove = false) { + const rowData = this.ejectRowData(question, row, remove); + const categories = this.getQuestionCategories(model); + const catValue = categories.value; + const item = this.findItem(catValue, itemName); + if (item) { + if (!item.subitems) item.subitems = []; + item.subitems.push(rowData); + } + categories.value = catValue; + } + + protected getItemMenuActionsCore(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { const categories = this.getQuestionCategories(model).value; - const actions = super.getItemMenuActions(model, question, row); - const catActions = [] as IAction[]; - categories.forEach((i: any) => catActions.push( - new Action({ - id: "to-" + i.category, - title: i.title, - action: () => { - //this.moveToCategory(model, question, row, i.category, true); - } - }))); - actions.push( - new Action({ - id: "move-as-subitem", - title: "Move as subitem", - needSeparator: true, - items: catActions, - action: () => { - } - }) + const actions = super.getItemMenuActionsCore(model, question, row); + const catActions = categories.map((c: any) => { + const catAction = new Action({ + id: "tosubitemcategory-" + c.category, + title: c.title + }); + if (c.items) { + const itemsActions = c.items.map((i: any) => new Action({ + id: "tosubitem-" + i.name, + title: i.title, + action: () => { + this.moveToSubitems(model, question, row, i.name, true); + } + })); + catAction.setSubItems({ items: itemsActions }); + } + return catAction; + } ); - - return actions.map(a => new Action(a)); + const subitemsAction = new Action({ + id: "move-as-subitem", + title: "Move as subitem", + needSeparator: true + }); + subitemsAction.setSubItems({ items: catActions }); + actions.push(subitemsAction); + return actions; } public getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { From 237e49a3a4ec9ddb6508d258ab05024fd8d9c674 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 26 Sep 2025 11:40:27 +0300 Subject: [PATCH 136/240] #7004 - fix icon color --- .../src/images-v1/more-circle-24x24.svg | 10 +++++----- .../src/images-v2/more-circle-24x24.svg | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/survey-creator-core/src/images-v1/more-circle-24x24.svg b/packages/survey-creator-core/src/images-v1/more-circle-24x24.svg index c5dd6b8970..3e2bf0c830 100644 --- a/packages/survey-creator-core/src/images-v1/more-circle-24x24.svg +++ b/packages/survey-creator-core/src/images-v1/more-circle-24x24.svg @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file diff --git a/packages/survey-creator-core/src/images-v2/more-circle-24x24.svg b/packages/survey-creator-core/src/images-v2/more-circle-24x24.svg index c5dd6b8970..3e2bf0c830 100644 --- a/packages/survey-creator-core/src/images-v2/more-circle-24x24.svg +++ b/packages/survey-creator-core/src/images-v2/more-circle-24x24.svg @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file From db5676f7106fd69dde8b08815fced8bf2b18de0e Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 26 Sep 2025 11:43:14 +0300 Subject: [PATCH 137/240] #7004 - fix items --- .../src/presets/presets-editable-categorized.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index cac51bf995..2ea707b570 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -90,6 +90,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre }) ); } + return actions; } protected replaceRemoveAction(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, actions: IAction[]): void { From d2ee710f178aaab1196c5598d168882374b2daf9 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 26 Sep 2025 13:06:50 +0300 Subject: [PATCH 138/240] #7004 - subiyems expand button visibility --- .../src/presets/presets-editable-list.ts | 37 +++++++++---------- .../src/presets/presets-editable-toolbox.ts | 9 ++++- .../presets-theme/blocks/sps-table.scss | 4 ++ 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 639ed9cbed..6a616781eb 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -31,34 +31,33 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { matrix.renderedTable.rows.forEach(r => { if (!r.row) return; const iconActions = r.cells[1]?.item?.value.actions; - this.updateIconAction(matrix, r.row as MatrixDynamicRowModel, iconActions); + this.updateRowActions(matrix, r.row as MatrixDynamicRowModel, iconActions); const actions = r.cells[r.cells.length - 1].item?.value.actions; - this.updateResetAction(matrix, r.row as MatrixDynamicRowModel, actions); + this.updateRowActions(matrix, r.row as MatrixDynamicRowModel, actions); }); } } - protected updateIconAction(question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, actions: IAction[]) { + protected updateRowActions(question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, actions: IAction[]) { if (!actions) return; const keyColumn = this.getMatrixKeyColumnName(question); if (!question.value) return; const rowData = question.value.filter(r => row.value[keyColumn] == r[keyColumn])[0]; if (!rowData) return; - const iconAction = actions.filter(a => a.id == "icon-action")[0]; - iconAction.iconName = rowData.iconName || this.defaultIcon; + actions.forEach(a => this.updateRowAction(question, rowData, keyColumn, a)); } - protected updateResetAction(question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, actions: IAction[]) { - if (!actions) return; - const keyColumn = this.getMatrixKeyColumnName(question); - if (!question.value) return; - const rowData = question.value.filter(r => row.value[keyColumn] == r[keyColumn])[0]; - if (!rowData) return; - const defaultItem = this.getDefaultItem(question, rowData[keyColumn]); - if (!defaultItem) return; - const defaultData = {}; - Object.keys(rowData).forEach(key => defaultData[key] = defaultItem[key]); - const resetAction = actions.filter(a => a.id == "reset-to-default")[0]; - resetAction.enabled = !Helpers.isTwoValueEquals(rowData, defaultData); + + protected updateRowAction(question: QuestionMatrixDynamicModel, rowData: any, keyColumn: string, action: IAction) { + if (action.id == "icon-action") { + action.iconName = rowData.iconName || this.defaultIcon; + } + if (action.id == "reset-to-default") { + const defaultItem = this.getDefaultItem(question, rowData[keyColumn]); + if (!defaultItem) return; + const defaultData = {}; + Object.keys(rowData).forEach(key => defaultData[key] = defaultItem[key]); + action.enabled = !Helpers.isTwoValueEquals(rowData, defaultData); + } } protected createResetAction(model: SurveyModel, row: MatrixDynamicRowModel, action: (action: Action) => void): IAction { @@ -186,7 +185,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { options.actions.push(this.createEditAction(model, creator, question, options.row)); this.setupStandardActions(options.actions, question, options.row, allowExpand, question.name == this.nameMatrix); - this.updateResetAction(question, options.row, options.actions); + this.updateRowActions(question, options.row, options.actions); } } public onMatrixRowDragOver(model: SurveyModel, creator: SurveyCreatorModel, options: any) { @@ -225,7 +224,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { if (!renderedRow) return; const actions = renderedRow.cells[renderedRow.cells.length - 1].item.value.actions; if (!actions) return; - this.updateResetAction(options.question, options.row, actions); + this.updateRowActions(options.question, options.row, actions); } } } diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 4c02bd6a8d..7be836cd67 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -183,6 +183,13 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita return question?.name === this.nameCategories ? this.defaultCategories : [...this.defaultItems, ...this.defaultSubitems]; } + protected updateRowAction(question: QuestionMatrixDynamicModel, rowData: any, keyColumn: string, action: IAction) { + super.updateRowAction(question, rowData, keyColumn, action); + if (action.id == "show-detail" && question.name != this.nameCategories) { + action.visible = !!rowData.subitems; + } + } + private findItem(value: any, itemName: string) { return value.map(c => c.items.filter(i => i.name == itemName)[0]).filter(i => !!i)[0]; } @@ -190,7 +197,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita private moveToSubitems(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, itemName: string, remove = false) { const rowData = this.ejectRowData(question, row, remove); const categories = this.getQuestionCategories(model); - const catValue = categories.value; + const catValue = JSON.parse(JSON.stringify(categories.value)); const item = this.findItem(catValue, itemName); if (item) { if (!item.subitems) item.subitems = []; diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss index 51c993c008..c38f6818cc 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -66,6 +66,10 @@ border-top-right-radius: var(--sjs2-radius-semantic-form, 8px); border-bottom-right-radius: var(--sjs2-radius-semantic-form, 8px); } + + .sps-action-bar{ + justify-content: flex-end; + } } .sps-table__row--main > .sps-table__cell { From b7be16d9e52701ab16b70f9b82d3be350b4e880b Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 26 Sep 2025 17:42:49 +0300 Subject: [PATCH 139/240] #7004 - left part context menu --- .../presets/presets-editable-categorized.ts | 50 ++++++++++++++----- .../src/presets/presets-editable-list.ts | 20 +++++--- .../src/presets/presets-editable-toolbox.ts | 38 +++++++++++--- 3 files changed, 80 insertions(+), 28 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 2ea707b570..8254a5027a 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -55,25 +55,49 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre protected getItemMenuActionsCore(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { const categories = this.getQuestionCategories(model).value; const actions = [] as IAction[]; - categories.forEach((i: any) => actions.push( - { - id: "to-" + i.category, - title: i.title, - action: () => { - this.moveToCategory(model, question, row, i.category, true); - } - })); + const isUnsorted = question.name == this.nameMatrix; + if (!isUnsorted) { + actions.push( + new Action({ + id: "remove-from", + title: "Remove from " + question.title, + action: () => { + const rowDataIndex = question.visibleRows.indexOf(row); + question.removeRow(rowDataIndex); + } + }) + ); + } + const moveToCategories = categories.map((i: any) => new Action({ + id: "to-" + i.category, + title: i.title, + action: () => { + this.moveToCategory(model, question, row, i.category, true); + } + })); + if (!isUnsorted) { + const catGroup = new Action({ + id: "move-to-categories", + title: "Move to category...", + needSeparator: true + }); + catGroup.setSubItems({ items: moveToCategories }); + actions.push(catGroup); + } else { + actions.push(...moveToCategories); + } + actions.push( - { + new Action({ id: "move-to-new-category", title: "Move to new category", - needSeparator: true, + needSeparator: isUnsorted, action: () => { this.moveToCategory(model, question, row, this.getDefaultValueForRow(question, "category"), true); } - }); + })); - return actions.map(a => new Action(a)); + return actions; } protected getItemMenuActions(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { @@ -172,7 +196,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre if (options.question.name === this.nameCategories) { this.setupCategoryActions(model, creator, options.question, options.row, options.actions); } - if (options.question.name === this.nameMatrix) { + if (this.isItemsMatrix(options.question.name)) { this.replaceRemoveAction(model, options.question, options.row, options.actions); } } diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 6a616781eb..1189f27789 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -27,17 +27,21 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { protected updateOnValueChangedCore(model: SurveyModel, name: string): void { if (this.needToSetActions(name)) { - const matrix = model.getQuestionByName(name) as QuestionMatrixDynamicModel; - matrix.renderedTable.rows.forEach(r => { - if (!r.row) return; - const iconActions = r.cells[1]?.item?.value.actions; - this.updateRowActions(matrix, r.row as MatrixDynamicRowModel, iconActions); - const actions = r.cells[r.cells.length - 1].item?.value.actions; - this.updateRowActions(matrix, r.row as MatrixDynamicRowModel, actions); - }); + this.updateMatrixRowActions(model, name); } } + protected updateMatrixRowActions(model: SurveyModel, name: string) { + const matrix = model.getQuestionByName(name) as QuestionMatrixDynamicModel; + matrix.renderedTable.rows.forEach(r => { + if (!r.row) return; + const iconActions = r.cells[1]?.item?.value.actions; + this.updateRowActions(matrix, r.row as MatrixDynamicRowModel, iconActions); + const actions = r.cells[r.cells.length - 1].item?.value.actions; + this.updateRowActions(matrix, r.row as MatrixDynamicRowModel, actions); + }); + } + protected updateRowActions(question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, actions: IAction[]) { if (!actions) return; const keyColumn = this.getMatrixKeyColumnName(question); diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 7be836cd67..a2bad422a5 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -71,6 +71,9 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita const newJson = { ...defaultJSON, ...props }; if (addSubitems) { newJson.detailElements.push(this.createItemsMatrixJSON({ + allowAddRows: true, + addRowText: "Add a new subitem", + addRowButtonLocation: "bottom", name: this.nameSubitems, valueName: "subitems", titleLocation: "hidden", @@ -227,13 +230,34 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita return catAction; } ); - const subitemsAction = new Action({ - id: "move-as-subitem", - title: "Move as subitem", - needSeparator: true - }); - subitemsAction.setSubItems({ items: catActions }); - actions.push(subitemsAction); + const rowDataIndex = question.visibleRows.indexOf(row); + const rowData = question.value[rowDataIndex]; + if (!rowData["subitems"]) { + if (question.name == this.nameItems || question.name == this.nameInnerMatrix) { + actions.push(new Action({ + id: "convert-to-subcategory", + title: "Convert to subcategory...", + action: () => { + const categories = this.getQuestionCategories(model); + const catValue = JSON.parse(JSON.stringify(categories.value)); + const item = this.findItem(catValue, rowData.name); + if (item) { + item.subitems = []; + } + categories.value = catValue; + this.updateMatrixRowActions(model, question.name); + } + })); + } + const subitemsAction = new Action({ + id: "move-as-subitem", + title: "Move as subitem", + needSeparator: true + }); + subitemsAction.setSubItems({ items: catActions }); + actions.push(subitemsAction); + } + return actions; } From d4925faae9250c04221a2a49003c3e3c4475e44e Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 26 Sep 2025 17:50:44 +0300 Subject: [PATCH 140/240] #7004 - fix wide popups --- .../src/presets/presets-theme/blocks/sps-popup.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss index 3568ace221..493b2e3d7c 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss @@ -25,6 +25,9 @@ } .sps-popup { + &.sv-popup--modal-popup { + z-index: 3000; + } .sps-root-modern { height: initial; } From 7d8258423d04b9470419b6591cec7d5b262a6427 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 26 Sep 2025 18:19:40 +0300 Subject: [PATCH 141/240] #7004 - fixed some tests --- .../tests-presets/presets-editor.tests.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts index ada83de426..446fb73089 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor.tests.ts @@ -226,6 +226,7 @@ test("Preset edit model, custom items, apply", () => { const etalon = { name: "name1", + title: "name1", tooltip: "tooltip1", json: { type: "text" } }; @@ -640,7 +641,7 @@ test("Preset edit model, Keep description on deleting the question", () => { survey.setValue("propertyGrid_selector", "text"); const propGridCategories = survey.getQuestionByName("propertyGrid_categories"); const propGridHidden = survey.getQuestionByName("propertyGrid_matrix"); - expect(propGridHidden.value).toBeFalsy(); + expect(propGridHidden.value || []).toEqual([]); propGridCategories.visibleRows[0].showDetailPanel(); const qItems = propGridCategories.visibleRows[0].detailPanel.getQuestionByName("properties"); const itemIndex = qItems.value.findIndex(r => r.name == "name"); @@ -958,5 +959,5 @@ test("Icon default", () => { const renderedRow = matrix.renderedTable.rows.filter(r => r.row == matrix.visibleRows[0])[0]; const iconAction = renderedRow.cells[1].item.value.actions[0]; expect(iconAction.id).toBe("icon-action"); - expect(iconAction.iconName).toBe("icon-pg-undefined-24x24"); + expect(iconAction.iconName).toBe("square-dashed-24x24"); }); \ No newline at end of file From bc85a2ea520c59bb62df956d18713f0c6db7bbb8 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 29 Sep 2025 18:30:20 +0300 Subject: [PATCH 142/240] #7004 - fixed toolbox json init and add tests for context menu --- .../presets/presets-editable-categorized.ts | 2 +- .../src/presets/presets-editable-toolbox.ts | 28 +- .../presets-editor-item-menu.tests.ts | 241 ++++++++++++++++++ 3 files changed, 267 insertions(+), 4 deletions(-) create mode 100644 packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 8254a5027a..50e6b778aa 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -123,7 +123,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre originalAction.visible = false; const addAction = createDropdownActionModel({ - id: "add-menu", + id: "context-menu", iconName: "more-circle-24x24", location: "end", visibleIndex: 20 diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index a2bad422a5..3a97e4d195 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -380,9 +380,31 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita // } protected setupQuestionsValueCore(model: SurveyModel, json: any, creator: SurveyCreatorModel): void { //this.setupQuestionsValueDefinition(model, json); - this.getQuestionItems(model).value = creator.toolbox.items.map(i => this.createToolboxItemRow(i)); - const categories = creator.toolbox.categories.map(c => this.createToolboxCategoryRow(c)); - model.setValue(this.nameCategories, categories); + const defaultItemsMap: any = {}; + this.defaultItems.forEach((i: any) => defaultItemsMap[i.name] = i); + json = json || {}; + let itemsDefinition = (json["definition"] || []).map(i => typeof i === "string" ? { name: i } : i); + let categoriesDefinition = json["categories"] || []; + if (itemsDefinition.length === 0) { + itemsDefinition = this.defaultItems; + } else { + itemsDefinition = itemsDefinition.map(i => ({ ...(defaultItemsMap[itemsDefinition.name] || {}), ...i })); + } + const itemsMap: any = {}; + itemsDefinition.forEach((i: any) => itemsMap[i.name] = i); + if (categoriesDefinition.length === 0) { + categoriesDefinition = this.defaultCategories; + } else { + categoriesDefinition = categoriesDefinition.map(c => ({ ...c, ...{ items: c.items.map(i => itemsMap[i]) } })); + } + + //categories.filter((c: any) => c.properties).forEach((c: any) => c.properties.forEach((p: any) => delete itemsMap[p.name])); + //Object.keys(itemsMap).map(key => itemsMap[key]); + categoriesDefinition.filter((c: any) => c.items).forEach((c: any) => c.items.forEach((p: any) => delete defaultItemsMap[p.name])); + const hiddenItems = this.defaultItems.filter(t => defaultItemsMap[t.name]); + + model.setValue(this.nameMatrix, hiddenItems); + model.setValue(this.nameCategories, categoriesDefinition); this.updateItemsFromCategories(model); this.updateShowCategoriesTitlesElements(model); } diff --git a/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts new file mode 100644 index 0000000000..85fe4a3908 --- /dev/null +++ b/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts @@ -0,0 +1,241 @@ +import { PopupDropdownViewModel, Question } from "survey-core"; +import { CreatorPresetEditorModel } from "../src/presets/presets-editor"; + +class CreatorPresetEditorModelTester extends CreatorPresetEditorModel { + private getQuestionRowContextActions(question: Question, item_name: string) { + const renderedRow = question.renderedTable.rows.filter(r => r.row?.value.name == item_name)[0]; + if (!renderedRow) return null; + const actions = renderedRow.cells[renderedRow.cells.length - 1].item.value.actions; + const contextAction = actions.filter(a => a.id == "context-menu")[0]; + const popupViewModel = new PopupDropdownViewModel(contextAction.popupModel); // need for popupModel.onShow + contextAction.popupModel.show(); + const list = contextAction.popupModel.contentComponentData.model; + return list.actions; + } + + public getRowContextActions(question_name: string, item_name: string) { + const q = this.model.getQuestionByName(question_name); + return this.getQuestionRowContextActions(q, item_name); + } + + public getCategoryRowContextActions(question_name: string, category_name: string, item_name: string) { + const q = this.model.getQuestionByName(question_name); + const row = q.visibleRows.filter(r => r.value.category == category_name)[0]; + row.showDetailPanel(); + const inner = row.detailPanel.getQuestionByName("items"); + return this.getQuestionRowContextActions(inner, item_name); + } + + public getValue(question_name: string) { + const q = this.model.getQuestionByName(question_name); + return q.value; + } +} + +const json = { + "toolbox": { + "definition": [ + { + "name": "text" + }, + { + "name": "comment" + }, + { + "name": "multipletext" + }, + { + "name": "panel" + }, + { + "name": "paneldynamic" + }, + { + "name": "ranking" + }, + { + "name": "test" + } + ], + "categories": [ + { + "category": "text", + "title": "Text Input Questions", + "items": [ + "text", + "comment", + "multipletext" + ] + }, + { + "category": "containers", + "title": "Containers", + "items": [ + "panel", + "paneldynamic" + ] + } + ] + } +}; +test("Preset edit, context menu - defaut toolbox matrices", () => { + const editor = new CreatorPresetEditorModelTester(json); + + const value = editor.getValue("toolbox_matrix"); + expect(value.filter(v => v.name === "ranking")).toHaveLength(1); + expect(value.filter(v => v.name === "text")).toHaveLength(0); + expect(value).toHaveLength(17); + + const cats = editor.getValue("toolbox_categories"); + expect(cats).toHaveLength(2); +}); + +test("Preset edit, context menu - check actions", () => { + const editor = new CreatorPresetEditorModelTester(json); + + const actions = editor.getRowContextActions("toolbox_matrix", "ranking"); + expect(actions.map(a => a.id)).toEqual([ + "to-text", + "to-containers", + "move-to-new-category", + "move-as-subitem", + ]); + const subitemsAction = actions[3]; + expect(subitemsAction.items.map(a => a.id)).toEqual(["tosubitemcategory-text", "tosubitemcategory-containers"]); + const subitemsCatAction = subitemsAction.items[0]; + expect(subitemsCatAction.items.map(a => a.id)).toEqual(["tosubitem-text", "tosubitem-comment", "tosubitem-multipletext"]); +}); + +test("Preset edit, context menu - check move to category", () => { + const editor = new CreatorPresetEditorModelTester(json); + const actions = editor.getRowContextActions("toolbox_matrix", "ranking"); + actions.filter(a => a.id == "to-containers")[0].action(); + const value = editor.getValue("toolbox_matrix"); + + const cats = editor.getValue("toolbox_categories"); + expect(cats).toHaveLength(2); + expect(cats.filter(c => c.category == "containers")[0].items.map(i => i.name)).toEqual(["panel", "paneldynamic", "ranking"]); + expect(value.filter(v => v.name === "ranking")).toHaveLength(0); +}); + +test("Preset edit, context menu - check move to new category", () => { + const editor = new CreatorPresetEditorModelTester(json); + const actions = editor.getRowContextActions("toolbox_matrix", "ranking"); + actions.filter(a => a.id == "move-to-new-category")[0].action(); + const value = editor.getValue("toolbox_matrix"); + + const cats = editor.getValue("toolbox_categories"); + expect(cats).toHaveLength(3); + expect(cats.filter(c => c.category == "category1")[0].items.map(i => i.name)).toEqual(["ranking"]); + expect(value.filter(v => v.name === "ranking")).toHaveLength(0); +}); + +test("Preset edit, context menu - check move to subitems", () => { + const editor = new CreatorPresetEditorModelTester(json); + const actions = editor.getRowContextActions("toolbox_matrix", "ranking"); + const subitemsAction = actions[3]; + const subitemsCatAction = subitemsAction.items[0]; + expect(subitemsCatAction.items[1].id).toBe("tosubitem-comment"); + subitemsCatAction.items[1].action(); + const value = editor.getValue("toolbox_matrix"); + + const cats = editor.getValue("toolbox_categories"); + expect(cats).toHaveLength(2); + expect(cats.filter(c => c.category == "text")[0].items.filter(i => i.name == "comment")[0].subitems.map(i => i.name)).toEqual(["ranking"]); + expect(value.filter(v => v.name === "ranking")).toHaveLength(0); +}); + +test("Preset edit, check categories context menu - check actions", () => { + const editor = new CreatorPresetEditorModelTester(json); + + const actions = editor.getCategoryRowContextActions("toolbox_categories", "text", "comment"); + expect(actions.map(a => a.id)).toEqual([ + "remove-from", + "move-to-categories", + "move-to-new-category", + "convert-to-subcategory", + "move-as-subitem", + ]); + const catAction = actions[1]; + expect(catAction.items.map(a => a.id)).toEqual(["to-text", "to-containers"]); + const subitemsAction = actions[4]; + expect(subitemsAction.items.map(a => a.id)).toEqual(["tosubitemcategory-text", "tosubitemcategory-containers"]); + const subitemsCatAction = subitemsAction.items[0]; + expect(subitemsCatAction.items.map(a => a.id)).toEqual(["tosubitem-text", "tosubitem-comment", "tosubitem-multipletext"]); +}); + +test("Preset edit, categories context menu - remove", () => { + const editor = new CreatorPresetEditorModelTester(json); + const actions = editor.getCategoryRowContextActions("toolbox_categories", "text", "comment"); + const cats = editor.getValue("toolbox_categories"); + const unsorted = editor.getValue("toolbox_matrix"); + expect(cats[0].items).toHaveLength(3); + expect(cats[0].items.filter(i => i.name == "comment")).toHaveLength(1); + expect(unsorted).toHaveLength(17); + actions.filter(a => a.id == "remove-from")[0].action(); + + const cats2 = editor.getValue("toolbox_categories"); + const unsorted2 = editor.getValue("toolbox_matrix"); + expect(cats2[0].items).toHaveLength(2); + expect(cats2[0].items.filter(i => i.name == "comment")).toHaveLength(0); + expect(unsorted2).toHaveLength(18); + expect(unsorted.filter(i => i.name == "comment")).toHaveLength(1); +}); + +test("Preset edit, categories context menu - check move to category", () => { + const editor = new CreatorPresetEditorModelTester(json); + const actions = editor.getCategoryRowContextActions("toolbox_categories", "text", "comment"); + const cats = editor.getValue("toolbox_categories"); + const unsorted = editor.getValue("toolbox_matrix"); + expect(cats[0].items).toHaveLength(3); + expect(cats[0].items.filter(i => i.name == "comment")).toHaveLength(1); + expect(cats[1].items).toHaveLength(2); + expect(cats[1].items.filter(i => i.name == "comment")).toHaveLength(0); + expect(unsorted).toHaveLength(17); + actions.filter(a => a.id == "move-to-categories")[0].items.filter(a => a.id == "to-containers")[0].action(); + + const cats2 = editor.getValue("toolbox_categories"); + const unsorted2 = editor.getValue("toolbox_matrix"); + expect(cats2[0].category).toBe("text"); + expect(cats2[0].items).toHaveLength(2); + expect(cats2[0].items.filter(i => i.name == "comment")).toHaveLength(0); + expect(cats2[1].category).toBe("containers"); + expect(cats2[1].items).toHaveLength(3); + expect(cats2[1].items.filter(i => i.name == "comment")).toHaveLength(1); + expect(unsorted2).toHaveLength(17); + expect(unsorted.filter(i => i.name == "comment")).toHaveLength(0); +}); + +test("Preset edit, context menu - check move to new category", () => { + const editor = new CreatorPresetEditorModelTester(json); + const actions = editor.getCategoryRowContextActions("toolbox_categories", "text", "comment"); + const cats = editor.getValue("toolbox_categories"); + const unsorted = editor.getValue("toolbox_matrix"); + expect(cats).toHaveLength(2); + expect(cats[0].items).toHaveLength(3); + expect(cats[0].items.filter(i => i.name == "comment")).toHaveLength(1); + expect(unsorted).toHaveLength(17); + actions.filter(a => a.id == "move-to-new-category")[0].action(); + + const cats2 = editor.getValue("toolbox_categories"); + const unsorted2 = editor.getValue("toolbox_matrix"); + expect(cats2[0].category).toBe("text"); + expect(cats2[0].items).toHaveLength(2); + expect(cats2[0].items.filter(i => i.name == "comment")).toHaveLength(0); + expect(cats2[2].category).toBe("category1"); + expect(cats2[2].items).toHaveLength(1); + expect(cats2[2].items.filter(i => i.name == "comment")).toHaveLength(1); + expect(unsorted2).toHaveLength(17); + expect(unsorted.filter(i => i.name == "comment")).toHaveLength(0); +}); + +test("Preset edit, context menu - convert to subcategory", () => { + const editor = new CreatorPresetEditorModelTester(json); + const actions = editor.getCategoryRowContextActions("toolbox_categories", "text", "comment"); + const cats = editor.getValue("toolbox_categories"); + expect(cats[0].items.filter(i => i.name == "comment")[0].subitems).toBeUndefined(); + actions.filter(a => a.id == "convert-to-subcategory")[0].action(); + + const cats2 = editor.getValue("toolbox_categories"); + expect(cats2[0].items.filter(i => i.name == "comment")[0].subitems).toEqual([]); +}); \ No newline at end of file From 1c21dac25592e9484955371390a3361948770ff9 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 29 Sep 2025 19:13:47 +0300 Subject: [PATCH 143/240] #7004 - add styles and labels to context menu --- .../src/presets/presets-editable-categorized.ts | 15 +++++++++++++-- .../src/presets/presets-editable-toolbox.ts | 2 +- .../src/presets/presets-plugin.ts | 2 +- .../presets/presets-theme/blocks/sps-list.scss | 16 ++++++++++++++++ .../presets/presets-theme/blocks/sps-popup.scss | 6 +++++- .../src/presets/presets-theme/fonts.scss | 12 ++++++------ .../presets-editor-item-menu.tests.ts | 2 +- 7 files changed, 43 insertions(+), 12 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 50e6b778aa..d45f922401 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -1,7 +1,7 @@ import { Action, createDropdownActionModel, IAction, MatrixDynamicRowModel, PopupModel, QuestionMatrixDynamicModel, SurveyModel } from "survey-core"; import { SurveyCreatorModel, SurveyHelper } from "survey-creator-core"; import { CreatorPresetEditableList } from "./presets-editable-list"; - +import { listComponentCss } from "./presets-theme/list-theme"; export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPresetEditableList { //private replaceNonLettersWithDash(inputString) { // return inputString?.replace(/[^a-zA-Z0-9]/g, "-"); @@ -67,6 +67,13 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre } }) ); + } else { + actions.push(new Action({ + id: "move-to", + title: "Move To...", + css: "sps-list__item--label", + enabled: false + })); } const moveToCategories = categories.map((i: any) => new Action({ id: "to-" + i.category, @@ -129,7 +136,11 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre visibleIndex: 20 }, { items: [], - horizontalPosition: "center" + showPointer: false, + verticalPosition: "top", + horizontalPosition: "center", + cssClass: "sps-popup-menu", + cssClasses: listComponentCss, }); addAction.popupModel.onVisibilityChanged.add((_: PopupModel, opt: { model: PopupModel, isVisible: boolean }) => { if (opt.isVisible) { diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 3a97e4d195..cca58ce167 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -20,7 +20,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita const defaultJSON = { type: "matrixdynamic", name: "items", - title: "Add custom item", + title: "Toolbox", allowRowReorder: true, cellType: "text", showHeader: false, diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 4f8ea3f4ff..c85f25798f 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -80,7 +80,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { showPointer: false, verticalPosition: "top", horizontalPosition: "center", - cssClass: "sps-popup-menu", + cssClass: "sps-popup-menu sps-popup-menu--always-on-top", cssClasses: listComponentCss, onHide: () => { settingsAction.iconName = "navmenu-24x24"; }, onShow: () => { settingsAction.iconName = "close-24x24"; } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss index 03431321a9..705245e06f 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss @@ -62,6 +62,22 @@ pointer-events: none; } +.sps-list__item--label { + opacity: 1; + .sps-list__item-body { + display: flex; + padding: var(--sjs2-spacing-x050, 4px) var(--sjs2-spacing-x100, 8px) var(--sjs2-spacing-x000, 0) var(--sjs2-spacing-x150, 12px); + align-items: center; + gap: 8px; + align-self: stretch; + + overflow: hidden; + color: var(--sjs2-color-fg-basic-tertiary, rgba(28, 27, 32, 0.40)); + + @include sjs2--typography--small-strong; + } +} + .sps-list__item:focus, .sps-list__item:hover, .sps-list__item--focused, diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss index 493b2e3d7c..f04840d34f 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss @@ -3,7 +3,9 @@ @use "../fonts" as *; .sps-popup-menu.sv-popup--menu-popup { - height: unset; + &.sps-popup-menu--always-on-top { + height: unset; + } .sv-popup__container { border: initial; padding: var(--sjs2-spacing-x150, 12px); @@ -24,6 +26,8 @@ } } + + .sps-popup { &.sv-popup--modal-popup { z-index: 3000; diff --git a/packages/survey-creator-core/src/presets/presets-theme/fonts.scss b/packages/survey-creator-core/src/presets/presets-theme/fonts.scss index 8e597cdc08..71c850d6df 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/fonts.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/fonts.scss @@ -15,18 +15,18 @@ line-height: var(--sjs2-line-height-semantic-default, 24px); /* 150% */ } @mixin sjs2--typography--default-strong { - /* sjs2/typography/default */ + /* sjs2/typography/default-strong */ font-family: var(--sjs2-font-family-semantic-default, "Open Sans"); font-size: var(--sjs2-font-size-semantic-default, 16px); font-style: normal; font-weight: 600; line-height: var(--sjs2-line-height-semantic-default, 24px); /* 150% */ } -@mixin sjs2--typography--default-strong { - /* sjs2/typography/default-strong */ - font-family: var(--sjs2-font-family-semantic-default, "Open Sans"); - font-size: var(--sjs2-font-size-semantic-default, 16px); +@mixin sjs2--typography--small-strong { + /* sjs2/typography/small-strong */ + font-family: var(--sjs2-typography-font-family-default, "Open Sans"); + font-size: var(--sjs2-typography-font-size-small, 12px); font-style: normal; font-weight: 600; - line-height: var(--sjs2-line-height-semantic-default, 24px); /* 150% */ + line-height: var(--sjs2-typography-line-height-small, 16px); /* 133.333% */ } diff --git a/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts index 85fe4a3908..1b6efaae18 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts @@ -10,7 +10,7 @@ class CreatorPresetEditorModelTester extends CreatorPresetEditorModel { const popupViewModel = new PopupDropdownViewModel(contextAction.popupModel); // need for popupModel.onShow contextAction.popupModel.show(); const list = contextAction.popupModel.contentComponentData.model; - return list.actions; + return list.actions.filter(a => a.enabled !== false); } public getRowContextActions(question_name: string, item_name: string) { From b8ff19e2a082890a5808e0083d6dcb3c57abc225 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 30 Sep 2025 10:07:42 +0300 Subject: [PATCH 144/240] #7004 context menu popup styles and labels --- .../src/presets/presets-editable-categorized.ts | 13 ++++++++++--- .../src/presets/presets-editable-toolbox.ts | 15 +++++++++++---- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index d45f922401..e3c227d789 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -83,12 +83,18 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre } })); if (!isUnsorted) { + actions.push(new Action({ + id: "categories", + title: "Categories", + css: "sps-list__item--label", + enabled: false, + needSeparator: true + })); const catGroup = new Action({ id: "move-to-categories", - title: "Move to category...", - needSeparator: true + title: "Move to category..." }); - catGroup.setSubItems({ items: moveToCategories }); + catGroup.setSubItems({ items: moveToCategories, cssClasses: listComponentCss }); actions.push(catGroup); } else { actions.push(...moveToCategories); @@ -141,6 +147,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre horizontalPosition: "center", cssClass: "sps-popup-menu", cssClasses: listComponentCss, + searchEnabled: false }); addAction.popupModel.onVisibilityChanged.add((_: PopupModel, opt: { model: PopupModel, isVisible: boolean }) => { if (opt.isVisible) { diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index cca58ce167..0acb1a0a2d 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -3,6 +3,7 @@ import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets- import { QuestionToolboxCategory, QuestionToolboxItem, SurveyCreatorModel, editorLocalization } from "survey-creator-core"; import { ICreatorPresetToolboxItem } from "survey-creator-core"; import { CreatorPresetEditableCaregorizedListConfigurator } from "./presets-editable-categorized"; +import { listComponentCss } from "./presets-theme/list-theme"; const LocCategoriesName = "toolboxCategories"; @@ -225,7 +226,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita this.moveToSubitems(model, question, row, i.name, true); } })); - catAction.setSubItems({ items: itemsActions }); + catAction.setSubItems({ items: itemsActions, cssClasses: listComponentCss }); } return catAction; } @@ -234,6 +235,13 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita const rowData = question.value[rowDataIndex]; if (!rowData["subitems"]) { if (question.name == this.nameItems || question.name == this.nameInnerMatrix) { + actions.push(new Action({ + id: "subcategories", + title: "Subcategories", + css: "sps-list__item--label", + enabled: false, + needSeparator: true + })); actions.push(new Action({ id: "convert-to-subcategory", title: "Convert to subcategory...", @@ -251,10 +259,9 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita } const subitemsAction = new Action({ id: "move-as-subitem", - title: "Move as subitem", - needSeparator: true + title: "Move as subitem" }); - subitemsAction.setSubItems({ items: catActions }); + subitemsAction.setSubItems({ items: catActions, cssClasses: listComponentCss }); actions.push(subitemsAction); } From 25be0e7cced76a3c35e9882c66760f5ebdd12550 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 30 Sep 2025 13:03:57 +0300 Subject: [PATCH 145/240] #7004 - toolbox flat items --- .../presets/presets-editable-categorized.ts | 31 +++- .../src/presets/presets-editable-toolbox.ts | 10 +- .../presets-editor-item-menu.tests.ts | 167 ++++++++++++++++++ 3 files changed, 200 insertions(+), 8 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index e3c227d789..9e5dc51d96 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -52,10 +52,15 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre categories.value = catValue; } + protected itemMenuCategoriesEnabled(model: SurveyModel) { + return true; + } + protected getItemMenuActionsCore(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { const categories = this.getQuestionCategories(model).value; const actions = [] as IAction[]; const isUnsorted = question.name == this.nameMatrix; + const hasCategories = this.itemMenuCategoriesEnabled(model); if (!isUnsorted) { actions.push( new Action({ @@ -68,13 +73,27 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre }) ); } else { - actions.push(new Action({ - id: "move-to", - title: "Move To...", - css: "sps-list__item--label", - enabled: false - })); + if (hasCategories) { + actions.push(new Action({ + id: "move-to", + title: "Move To...", + css: "sps-list__item--label", + enabled: false + })); + } else { + actions.push(new Action({ + id: "restore-item", + title: "Add to Toolbox", + action: () => { + const rowDataIndex = question.visibleRows.indexOf(row); + question.removeRow(rowDataIndex); + } + })); + } } + + if (!hasCategories) return actions; + const moveToCategories = categories.map((i: any) => new Action({ id: "to-" + i.category, title: i.title, diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 0acb1a0a2d..9545bb7365 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -131,7 +131,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita addRowText: "Add Custom Item", startWithNewLine: false, visibleIf: this.getTextVisibleIf(this.nameCategoriesMode, "items"), - }, false), + }, true), this.createItemsMatrixJSON({ allowAddRows: true, title: "Unsorted items", @@ -210,9 +210,14 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita categories.value = catValue; } + protected itemMenuCategoriesEnabled(model: SurveyModel) { + return model.getValue(this.nameCategoriesMode) !== "items"; + } + protected getItemMenuActionsCore(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { const categories = this.getQuestionCategories(model).value; const actions = super.getItemMenuActionsCore(model, question, row); + const hasCategories = this.itemMenuCategoriesEnabled(model); const catActions = categories.map((c: any) => { const catAction = new Action({ id: "tosubitemcategory-" + c.category, @@ -231,6 +236,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita return catAction; } ); + const subItems = hasCategories ? catActions : catActions.map(a => a.items).flat(); const rowDataIndex = question.visibleRows.indexOf(row); const rowData = question.value[rowDataIndex]; if (!rowData["subitems"]) { @@ -261,7 +267,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita id: "move-as-subitem", title: "Move as subitem" }); - subitemsAction.setSubItems({ items: catActions, cssClasses: listComponentCss }); + subitemsAction.setSubItems({ items: subItems, cssClasses: listComponentCss }); actions.push(subitemsAction); } diff --git a/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts index 1b6efaae18..2c95e3d179 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts @@ -30,6 +30,10 @@ class CreatorPresetEditorModelTester extends CreatorPresetEditorModel { const q = this.model.getQuestionByName(question_name); return q.value; } + public setValue(question_name: string, value: any) { + const q = this.model.getQuestionByName(question_name); + q.value = value; + } } const json = { @@ -236,6 +240,169 @@ test("Preset edit, context menu - convert to subcategory", () => { expect(cats[0].items.filter(i => i.name == "comment")[0].subitems).toBeUndefined(); actions.filter(a => a.id == "convert-to-subcategory")[0].action(); + const cats2 = editor.getValue("toolbox_categories"); + expect(cats2[0].items.filter(i => i.name == "comment")[0].subitems).toEqual([]); +}); + +test("Preset edit (no categories), context menu - defaut toolbox matrices", () => { + const editor = new CreatorPresetEditorModelTester(json); + editor.setValue("toolbox_mode", "items"); + + const value = editor.getValue("toolbox_matrix"); + expect(value.filter(v => v.name === "ranking")).toHaveLength(1); + expect(value.filter(v => v.name === "text")).toHaveLength(0); + expect(value).toHaveLength(17); + + const cats = editor.getValue("toolbox_categories"); + expect(cats).toHaveLength(2); +}); + +test("Preset edit (no categories), context menu - check actions", () => { + const editor = new CreatorPresetEditorModelTester(json); + + const actions = editor.getRowContextActions("toolbox_matrix", "ranking"); + expect(actions.map(a => a.id)).toEqual([ + "to-text", + "to-containers", + "move-to-new-category", + "move-as-subitem", + ]); + const subitemsAction = actions[3]; + expect(subitemsAction.items.map(a => a.id)).toEqual(["tosubitemcategory-text", "tosubitemcategory-containers"]); + const subitemsCatAction = subitemsAction.items[0]; + expect(subitemsCatAction.items.map(a => a.id)).toEqual(["tosubitem-text", "tosubitem-comment", "tosubitem-multipletext"]); +}); + +test("Preset edit (no categories), context menu - check move to category", () => { + const editor = new CreatorPresetEditorModelTester(json); + const actions = editor.getRowContextActions("toolbox_matrix", "ranking"); + actions.filter(a => a.id == "to-containers")[0].action(); + const value = editor.getValue("toolbox_matrix"); + + const cats = editor.getValue("toolbox_categories"); + expect(cats).toHaveLength(2); + expect(cats.filter(c => c.category == "containers")[0].items.map(i => i.name)).toEqual(["panel", "paneldynamic", "ranking"]); + expect(value.filter(v => v.name === "ranking")).toHaveLength(0); +}); + +test("Preset edit (no categories), context menu - check move to new category", () => { + const editor = new CreatorPresetEditorModelTester(json); + const actions = editor.getRowContextActions("toolbox_matrix", "ranking"); + actions.filter(a => a.id == "move-to-new-category")[0].action(); + const value = editor.getValue("toolbox_matrix"); + + const cats = editor.getValue("toolbox_categories"); + expect(cats).toHaveLength(3); + expect(cats.filter(c => c.category == "category1")[0].items.map(i => i.name)).toEqual(["ranking"]); + expect(value.filter(v => v.name === "ranking")).toHaveLength(0); +}); + +test("Preset edit (no categories), context menu - check move to subitems", () => { + const editor = new CreatorPresetEditorModelTester(json); + const actions = editor.getRowContextActions("toolbox_matrix", "ranking"); + const subitemsAction = actions[3]; + const subitemsCatAction = subitemsAction.items[0]; + expect(subitemsCatAction.items[1].id).toBe("tosubitem-comment"); + subitemsCatAction.items[1].action(); + const value = editor.getValue("toolbox_matrix"); + + const cats = editor.getValue("toolbox_categories"); + expect(cats).toHaveLength(2); + expect(cats.filter(c => c.category == "text")[0].items.filter(i => i.name == "comment")[0].subitems.map(i => i.name)).toEqual(["ranking"]); + expect(value.filter(v => v.name === "ranking")).toHaveLength(0); +}); + +test("Preset edit (no categories), check categories context menu - check actions", () => { + const editor = new CreatorPresetEditorModelTester(json); + + const actions = editor.getCategoryRowContextActions("toolbox_categories", "text", "comment"); + expect(actions.map(a => a.id)).toEqual([ + "remove-from", + "move-to-categories", + "move-to-new-category", + "convert-to-subcategory", + "move-as-subitem", + ]); + const catAction = actions[1]; + expect(catAction.items.map(a => a.id)).toEqual(["to-text", "to-containers"]); + const subitemsAction = actions[4]; + expect(subitemsAction.items.map(a => a.id)).toEqual(["tosubitemcategory-text", "tosubitemcategory-containers"]); + const subitemsCatAction = subitemsAction.items[0]; + expect(subitemsCatAction.items.map(a => a.id)).toEqual(["tosubitem-text", "tosubitem-comment", "tosubitem-multipletext"]); +}); + +test("Preset edit (no categories), categories context menu - remove", () => { + const editor = new CreatorPresetEditorModelTester(json); + const actions = editor.getCategoryRowContextActions("toolbox_categories", "text", "comment"); + const cats = editor.getValue("toolbox_categories"); + const unsorted = editor.getValue("toolbox_matrix"); + expect(cats[0].items).toHaveLength(3); + expect(cats[0].items.filter(i => i.name == "comment")).toHaveLength(1); + expect(unsorted).toHaveLength(17); + actions.filter(a => a.id == "remove-from")[0].action(); + + const cats2 = editor.getValue("toolbox_categories"); + const unsorted2 = editor.getValue("toolbox_matrix"); + expect(cats2[0].items).toHaveLength(2); + expect(cats2[0].items.filter(i => i.name == "comment")).toHaveLength(0); + expect(unsorted2).toHaveLength(18); + expect(unsorted.filter(i => i.name == "comment")).toHaveLength(1); +}); + +test("Preset edit (no categories), categories context menu - check move to category", () => { + const editor = new CreatorPresetEditorModelTester(json); + const actions = editor.getCategoryRowContextActions("toolbox_categories", "text", "comment"); + const cats = editor.getValue("toolbox_categories"); + const unsorted = editor.getValue("toolbox_matrix"); + expect(cats[0].items).toHaveLength(3); + expect(cats[0].items.filter(i => i.name == "comment")).toHaveLength(1); + expect(cats[1].items).toHaveLength(2); + expect(cats[1].items.filter(i => i.name == "comment")).toHaveLength(0); + expect(unsorted).toHaveLength(17); + actions.filter(a => a.id == "move-to-categories")[0].items.filter(a => a.id == "to-containers")[0].action(); + + const cats2 = editor.getValue("toolbox_categories"); + const unsorted2 = editor.getValue("toolbox_matrix"); + expect(cats2[0].category).toBe("text"); + expect(cats2[0].items).toHaveLength(2); + expect(cats2[0].items.filter(i => i.name == "comment")).toHaveLength(0); + expect(cats2[1].category).toBe("containers"); + expect(cats2[1].items).toHaveLength(3); + expect(cats2[1].items.filter(i => i.name == "comment")).toHaveLength(1); + expect(unsorted2).toHaveLength(17); + expect(unsorted.filter(i => i.name == "comment")).toHaveLength(0); +}); + +test("Preset edit (no categories), context menu - check move to new category", () => { + const editor = new CreatorPresetEditorModelTester(json); + const actions = editor.getCategoryRowContextActions("toolbox_categories", "text", "comment"); + const cats = editor.getValue("toolbox_categories"); + const unsorted = editor.getValue("toolbox_matrix"); + expect(cats).toHaveLength(2); + expect(cats[0].items).toHaveLength(3); + expect(cats[0].items.filter(i => i.name == "comment")).toHaveLength(1); + expect(unsorted).toHaveLength(17); + actions.filter(a => a.id == "move-to-new-category")[0].action(); + + const cats2 = editor.getValue("toolbox_categories"); + const unsorted2 = editor.getValue("toolbox_matrix"); + expect(cats2[0].category).toBe("text"); + expect(cats2[0].items).toHaveLength(2); + expect(cats2[0].items.filter(i => i.name == "comment")).toHaveLength(0); + expect(cats2[2].category).toBe("category1"); + expect(cats2[2].items).toHaveLength(1); + expect(cats2[2].items.filter(i => i.name == "comment")).toHaveLength(1); + expect(unsorted2).toHaveLength(17); + expect(unsorted.filter(i => i.name == "comment")).toHaveLength(0); +}); + +test("Preset edit (no categories), context menu - convert to subcategory", () => { + const editor = new CreatorPresetEditorModelTester(json); + const actions = editor.getCategoryRowContextActions("toolbox_categories", "text", "comment"); + const cats = editor.getValue("toolbox_categories"); + expect(cats[0].items.filter(i => i.name == "comment")[0].subitems).toBeUndefined(); + actions.filter(a => a.id == "convert-to-subcategory")[0].action(); + const cats2 = editor.getValue("toolbox_categories"); expect(cats2[0].items.filter(i => i.name == "comment")[0].subitems).toEqual([]); }); \ No newline at end of file From 3f9eea8dd9b9a8b1d8c5471a02034ae71b49b126 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 30 Sep 2025 17:33:28 +0300 Subject: [PATCH 146/240] #7004 - fixed flat toolbox --- .../src/presets/presets-editable-toolbox.ts | 23 +-- .../presets-editor-item-menu.tests.ts | 145 ++++++------------ 2 files changed, 64 insertions(+), 104 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 9545bb7365..a0ce7313c9 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -194,20 +194,23 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita } } - private findItem(value: any, itemName: string) { - return value.map(c => c.items.filter(i => i.name == itemName)[0]).filter(i => !!i)[0]; + private findItem(value: any, itemName: string, hasCategories: boolean) { + return hasCategories ? + value.map(c => c.items.filter(i => i.name == itemName)[0]).filter(i => !!i)[0] : + value.filter(i => i.name == itemName)[0]; } private moveToSubitems(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, itemName: string, remove = false) { const rowData = this.ejectRowData(question, row, remove); - const categories = this.getQuestionCategories(model); - const catValue = JSON.parse(JSON.stringify(categories.value)); - const item = this.findItem(catValue, itemName); + const hasCategories = this.itemMenuCategoriesEnabled(model); + const destination = hasCategories ? this.getQuestionCategories(model) : this.getQuestionItems(model); + const destValue = JSON.parse(JSON.stringify(destination.value)); + const item = this.findItem(destValue, itemName, hasCategories); if (item) { if (!item.subitems) item.subitems = []; item.subitems.push(rowData); } - categories.value = catValue; + destination.value = destValue; } protected itemMenuCategoriesEnabled(model: SurveyModel) { @@ -252,13 +255,13 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita id: "convert-to-subcategory", title: "Convert to subcategory...", action: () => { - const categories = this.getQuestionCategories(model); - const catValue = JSON.parse(JSON.stringify(categories.value)); - const item = this.findItem(catValue, rowData.name); + const destination = hasCategories ? this.getQuestionCategories(model) : this.getQuestionItems(model); + const destValue = JSON.parse(JSON.stringify(destination.value)); + const item = this.findItem(destValue, rowData.name, hasCategories); if (item) { item.subitems = []; } - categories.value = catValue; + destination.value = destValue; this.updateMatrixRowActions(model, question.name); } })); diff --git a/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts index 2c95e3d179..a4d2ba6b08 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts @@ -253,156 +253,113 @@ test("Preset edit (no categories), context menu - defaut toolbox matrices", () = expect(value.filter(v => v.name === "text")).toHaveLength(0); expect(value).toHaveLength(17); - const cats = editor.getValue("toolbox_categories"); - expect(cats).toHaveLength(2); + const cats = editor.getValue("toolbox_items"); + expect(cats).toHaveLength(5); }); test("Preset edit (no categories), context menu - check actions", () => { const editor = new CreatorPresetEditorModelTester(json); + editor.setValue("toolbox_mode", "items"); const actions = editor.getRowContextActions("toolbox_matrix", "ranking"); expect(actions.map(a => a.id)).toEqual([ - "to-text", - "to-containers", - "move-to-new-category", + "restore-item", "move-as-subitem", ]); - const subitemsAction = actions[3]; - expect(subitemsAction.items.map(a => a.id)).toEqual(["tosubitemcategory-text", "tosubitemcategory-containers"]); - const subitemsCatAction = subitemsAction.items[0]; - expect(subitemsCatAction.items.map(a => a.id)).toEqual(["tosubitem-text", "tosubitem-comment", "tosubitem-multipletext"]); + const subitemsAction = actions[1]; + expect(subitemsAction.items.map(a => a.id)).toEqual(["tosubitem-text", "tosubitem-comment", "tosubitem-multipletext", + "tosubitem-panel", "tosubitem-paneldynamic"]); }); -test("Preset edit (no categories), context menu - check move to category", () => { +test("Preset edit (no categories), context menu - check move to index", () => { const editor = new CreatorPresetEditorModelTester(json); - const actions = editor.getRowContextActions("toolbox_matrix", "ranking"); - actions.filter(a => a.id == "to-containers")[0].action(); - const value = editor.getValue("toolbox_matrix"); + editor.setValue("toolbox_mode", "items"); - const cats = editor.getValue("toolbox_categories"); - expect(cats).toHaveLength(2); - expect(cats.filter(c => c.category == "containers")[0].items.map(i => i.name)).toEqual(["panel", "paneldynamic", "ranking"]); - expect(value.filter(v => v.name === "ranking")).toHaveLength(0); -}); + const items0 = editor.getValue("toolbox_items"); + expect(items0).toHaveLength(5); + expect(items0.filter(v => v.name === "ranking")).toHaveLength(0); -test("Preset edit (no categories), context menu - check move to new category", () => { - const editor = new CreatorPresetEditorModelTester(json); const actions = editor.getRowContextActions("toolbox_matrix", "ranking"); - actions.filter(a => a.id == "move-to-new-category")[0].action(); + actions.filter(a => a.id == "restore-item")[0].action(); const value = editor.getValue("toolbox_matrix"); - const cats = editor.getValue("toolbox_categories"); - expect(cats).toHaveLength(3); - expect(cats.filter(c => c.category == "category1")[0].items.map(i => i.name)).toEqual(["ranking"]); + const items = editor.getValue("toolbox_items"); + expect(items).toHaveLength(6); + expect(items.filter(v => v.name === "ranking")).toHaveLength(1); expect(value.filter(v => v.name === "ranking")).toHaveLength(0); }); test("Preset edit (no categories), context menu - check move to subitems", () => { const editor = new CreatorPresetEditorModelTester(json); + editor.setValue("toolbox_mode", "items"); const actions = editor.getRowContextActions("toolbox_matrix", "ranking"); - const subitemsAction = actions[3]; - const subitemsCatAction = subitemsAction.items[0]; - expect(subitemsCatAction.items[1].id).toBe("tosubitem-comment"); - subitemsCatAction.items[1].action(); + const subitemsAction = actions[1]; + expect(subitemsAction.items[1].id).toBe("tosubitem-comment"); + subitemsAction.items[1].action(); const value = editor.getValue("toolbox_matrix"); - const cats = editor.getValue("toolbox_categories"); - expect(cats).toHaveLength(2); - expect(cats.filter(c => c.category == "text")[0].items.filter(i => i.name == "comment")[0].subitems.map(i => i.name)).toEqual(["ranking"]); + const items = editor.getValue("toolbox_items"); + expect(items).toHaveLength(5); + expect(items.filter(i => i.name == "comment")[0].subitems.map(i => i.name)).toEqual(["ranking"]); expect(value.filter(v => v.name === "ranking")).toHaveLength(0); }); test("Preset edit (no categories), check categories context menu - check actions", () => { const editor = new CreatorPresetEditorModelTester(json); + editor.setValue("toolbox_mode", "items"); - const actions = editor.getCategoryRowContextActions("toolbox_categories", "text", "comment"); + const actions = editor.getRowContextActions("toolbox_items", "comment"); expect(actions.map(a => a.id)).toEqual([ "remove-from", - "move-to-categories", - "move-to-new-category", "convert-to-subcategory", "move-as-subitem", ]); - const catAction = actions[1]; - expect(catAction.items.map(a => a.id)).toEqual(["to-text", "to-containers"]); - const subitemsAction = actions[4]; - expect(subitemsAction.items.map(a => a.id)).toEqual(["tosubitemcategory-text", "tosubitemcategory-containers"]); - const subitemsCatAction = subitemsAction.items[0]; - expect(subitemsCatAction.items.map(a => a.id)).toEqual(["tosubitem-text", "tosubitem-comment", "tosubitem-multipletext"]); + const subitemsAction = actions[2]; + expect(subitemsAction.items.map(a => a.id)).toEqual(["tosubitem-text", "tosubitem-comment", "tosubitem-multipletext", + "tosubitem-panel", "tosubitem-paneldynamic"]); }); test("Preset edit (no categories), categories context menu - remove", () => { const editor = new CreatorPresetEditorModelTester(json); + editor.setValue("toolbox_mode", "items"); const actions = editor.getCategoryRowContextActions("toolbox_categories", "text", "comment"); - const cats = editor.getValue("toolbox_categories"); + const items = editor.getValue("toolbox_items"); const unsorted = editor.getValue("toolbox_matrix"); - expect(cats[0].items).toHaveLength(3); - expect(cats[0].items.filter(i => i.name == "comment")).toHaveLength(1); + expect(items).toHaveLength(5); + expect(items.filter(i => i.name == "comment")).toHaveLength(1); expect(unsorted).toHaveLength(17); actions.filter(a => a.id == "remove-from")[0].action(); - const cats2 = editor.getValue("toolbox_categories"); + const items2 = editor.getValue("toolbox_categories"); const unsorted2 = editor.getValue("toolbox_matrix"); - expect(cats2[0].items).toHaveLength(2); - expect(cats2[0].items.filter(i => i.name == "comment")).toHaveLength(0); + expect(items2).toHaveLength(2); + expect(items2.filter(i => i.name == "comment")).toHaveLength(0); expect(unsorted2).toHaveLength(18); expect(unsorted.filter(i => i.name == "comment")).toHaveLength(1); }); -test("Preset edit (no categories), categories context menu - check move to category", () => { +test("Preset edit (no categories), categories context menu - check move to subitems", () => { const editor = new CreatorPresetEditorModelTester(json); - const actions = editor.getCategoryRowContextActions("toolbox_categories", "text", "comment"); - const cats = editor.getValue("toolbox_categories"); - const unsorted = editor.getValue("toolbox_matrix"); - expect(cats[0].items).toHaveLength(3); - expect(cats[0].items.filter(i => i.name == "comment")).toHaveLength(1); - expect(cats[1].items).toHaveLength(2); - expect(cats[1].items.filter(i => i.name == "comment")).toHaveLength(0); - expect(unsorted).toHaveLength(17); - actions.filter(a => a.id == "move-to-categories")[0].items.filter(a => a.id == "to-containers")[0].action(); - - const cats2 = editor.getValue("toolbox_categories"); - const unsorted2 = editor.getValue("toolbox_matrix"); - expect(cats2[0].category).toBe("text"); - expect(cats2[0].items).toHaveLength(2); - expect(cats2[0].items.filter(i => i.name == "comment")).toHaveLength(0); - expect(cats2[1].category).toBe("containers"); - expect(cats2[1].items).toHaveLength(3); - expect(cats2[1].items.filter(i => i.name == "comment")).toHaveLength(1); - expect(unsorted2).toHaveLength(17); - expect(unsorted.filter(i => i.name == "comment")).toHaveLength(0); -}); - -test("Preset edit (no categories), context menu - check move to new category", () => { - const editor = new CreatorPresetEditorModelTester(json); - const actions = editor.getCategoryRowContextActions("toolbox_categories", "text", "comment"); - const cats = editor.getValue("toolbox_categories"); - const unsorted = editor.getValue("toolbox_matrix"); - expect(cats).toHaveLength(2); - expect(cats[0].items).toHaveLength(3); - expect(cats[0].items.filter(i => i.name == "comment")).toHaveLength(1); - expect(unsorted).toHaveLength(17); - actions.filter(a => a.id == "move-to-new-category")[0].action(); + editor.setValue("toolbox_mode", "items"); + const actions = editor.getRowContextActions("toolbox_items", "multipletext"); + const subitemsAction = actions[2]; + expect(subitemsAction.items[1].id).toBe("tosubitem-comment"); + subitemsAction.items[1].action(); + const value = editor.getValue("toolbox_matrix"); - const cats2 = editor.getValue("toolbox_categories"); - const unsorted2 = editor.getValue("toolbox_matrix"); - expect(cats2[0].category).toBe("text"); - expect(cats2[0].items).toHaveLength(2); - expect(cats2[0].items.filter(i => i.name == "comment")).toHaveLength(0); - expect(cats2[2].category).toBe("category1"); - expect(cats2[2].items).toHaveLength(1); - expect(cats2[2].items.filter(i => i.name == "comment")).toHaveLength(1); - expect(unsorted2).toHaveLength(17); - expect(unsorted.filter(i => i.name == "comment")).toHaveLength(0); + const items = editor.getValue("toolbox_items"); + expect(items).toHaveLength(4); + expect(items.filter(i => i.name == "comment")[0].subitems.map(i => i.name)).toEqual(["multipletext"]); }); test("Preset edit (no categories), context menu - convert to subcategory", () => { const editor = new CreatorPresetEditorModelTester(json); - const actions = editor.getCategoryRowContextActions("toolbox_categories", "text", "comment"); - const cats = editor.getValue("toolbox_categories"); - expect(cats[0].items.filter(i => i.name == "comment")[0].subitems).toBeUndefined(); + editor.setValue("toolbox_mode", "items"); + const actions = editor.getRowContextActions("toolbox_items", "comment"); + const items = editor.getValue("toolbox_items"); + expect(items.filter(i => i.name == "comment")[0].subitems).toBeUndefined(); actions.filter(a => a.id == "convert-to-subcategory")[0].action(); - const cats2 = editor.getValue("toolbox_categories"); - expect(cats2[0].items.filter(i => i.name == "comment")[0].subitems).toEqual([]); + const items2 = editor.getValue("toolbox_items"); + expect(items2.filter(i => i.name == "comment")[0].subitems).toEqual([]); }); \ No newline at end of file From ccf7c4dbff36ad3129e4b99b5ac7584a60b88351 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 30 Sep 2025 17:48:28 +0300 Subject: [PATCH 147/240] #7004 - fixed test --- .../survey-creator-core/src/presets/presets-editable-toolbox.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index a0ce7313c9..8f19f9660a 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -464,7 +464,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita }); const unsortedNames = Object.keys(itemsObject); if (unsortedNames.length > 0) { - let generalCategory = this.findOrCreateCategory(categories); + let generalCategory = this.findOrCreateCategory(categories, "general"); generalCategory.items = generalCategory.items.concat(unsortedNames.map(name => this.createToolboxItemRow(itemsObject[name]))); } this.getQuestionCategories(model).value = categories; From 0b3c9e98b6ecf433662df2a857197d1c079986e3 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 30 Sep 2025 17:54:04 +0300 Subject: [PATCH 148/240] #7004 - fixed dragged row styles --- .../src/presets/presets-theme/blocks/sps-table.scss | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss index c38f6818cc..c79c763a46 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -148,6 +148,15 @@ } } +.sps-matrixdynamic__dragged-row { + .sps-table__cell { + padding: 0; + } + .sps-input { + pointer-events: none; + } +} + .sps-table__row { --action-width: calc( 2 * var(--ctr-actionbar-button-padding-top-large-icon, 8px) + From b0cc48d4a25f7e3948ed7c39a41d65a9cf725a6a Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 30 Sep 2025 18:10:17 +0300 Subject: [PATCH 149/240] #7004 - fixed context menu styles --- .../src/presets/presets-theme/blocks/sps-list.scss | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss index 705245e06f..44dcacbcdf 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss @@ -78,6 +78,12 @@ } } +.sps-list__item--group { + .sps-list__item-body { + padding-right: 0; + } +} + .sps-list__item:focus, .sps-list__item:hover, .sps-list__item--focused, @@ -109,8 +115,8 @@ display: flex; padding: 0; align-items: flex-start; - width: 24px; - height: 24px; + width: 16px; + height: 16px; box-sizing: content-box; justify-content: center; From 9204d89af3e2186d7967abb2011c19d537e79aaa Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 1 Oct 2025 13:37:24 +0300 Subject: [PATCH 150/240] #7004 fixed default toolbox categories --- packages/survey-creator-core/src/toolbox.ts | 39 +++++++++---------- .../presets-editor-toolbox.tests.ts | 14 ++++++- .../tests/toolbox.tests.ts | 7 ++++ 3 files changed, 39 insertions(+), 21 deletions(-) diff --git a/packages/survey-creator-core/src/toolbox.ts b/packages/survey-creator-core/src/toolbox.ts index 14d3ede7d8..7c50e5a3dc 100644 --- a/packages/survey-creator-core/src/toolbox.ts +++ b/packages/survey-creator-core/src/toolbox.ts @@ -1224,12 +1224,12 @@ export class QuestionToolbox } return null; } - protected onItemsChanged(changeActions: boolean = true) { - var categories = new Array(); - var categoriesHash = {}; - var prevActiveCategory = this.activeCategory; - for (let i = 0; i < this.actions.length; i++) { - const item = this.actions[i]; + + private createCategoriesFromItems(items: Array) { + const categories = new Array(); + const categoriesHash = {}; + for (let i = 0; i < items.length; i++) { + const item = items[i]; item.innerItem.action = () => { this.creator.clickToolboxItem((item).json); }; @@ -1239,16 +1239,24 @@ export class QuestionToolbox const category = this.createCategory(); category.name = categoryName; category.title = this.getCategoryTitle(categoryName); - category.collapsed = categoryName !== prevActiveCategory && !this.keepAllCategoriesExpanded; categoriesHash[categoryName] = category; categories.push(category); } categoriesHash[categoryName].items.push(item); } + return categories; + } + protected onItemsChanged(changeActions: boolean = true) { + const categories = this.createCategoriesFromItems(this.actions); this.categories = categories; + let prevActiveCategory; + this.categories.forEach((category) => { + category.collapsed = category.name !== this.activeCategory && !this.keepAllCategoriesExpanded; + if (category.name === this.activeCategory) prevActiveCategory = category.name; + }); if (!this.keepAllCategoriesExpanded) { if (!this.allowExpandMultipleCategories) { - if (prevActiveCategory && categoriesHash[prevActiveCategory]) { + if (prevActiveCategory) { this.activeCategory = prevActiveCategory; } else { this.activeCategory = categories.length > 0 ? categories[0].name : ""; @@ -1328,18 +1336,9 @@ export class QuestionToolbox return res; } public getDefaultCategories(): Array { - const items = this.getDefaultItems(this.supportedQuestions, false, true, true); - const itemsHash = {}; - items.forEach(item => { - itemsHash[item.id] = item; - }); - return Object.keys(QuestionToolbox.defaultCategories).map(cName=>{ - const category = new QuestionToolboxCategory(this); - category.name = cName; - category.title = this.getCategoryTitle(cName); - category.items = QuestionToolbox.defaultCategories[cName].map(iName => itemsHash[iName]); - return category; - }); + const items = this.getDefaultItems(this.supportedQuestions, true, true, true); + const categories = this.createCategoriesFromItems(items); + return categories; } private actionsHash: { [index: string]: QuestionToolboxItem }; diff --git a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts index 6e53da58e7..5162c8f896 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts @@ -1,4 +1,4 @@ -import { ItemValue, QuestionBooleanModel, QuestionCheckboxBase, QuestionCheckboxModel, QuestionDropdownModel, QuestionMatrixDynamicModel, QuestionRankingModel, Serializer, surveyLocalization, settings, MatrixDynamicRowModel } from "survey-core"; +import { ItemValue, QuestionBooleanModel, QuestionCheckboxBase, QuestionCheckboxModel, QuestionDropdownModel, QuestionMatrixDynamicModel, QuestionRankingModel, Serializer, surveyLocalization, settings, MatrixDynamicRowModel, ComponentCollection } from "survey-core"; import { CreatorPresetEditorModel } from "../src/presets/presets-editor"; import { ICreatorPresetData } from "../src/presets-creator/presets"; import { SurveyModel, Question } from "survey-core"; @@ -404,4 +404,16 @@ test("Preset edit, toolbox - edit item", () => { } finally { settings.showDialog = originalShowDialog; } +}); + +test("Preset edit, toolbox - custom types", () => { + ComponentCollection.Instance.add({ name: "test", title: "Test", questionJSON: { "type": "text", "title": "1" } }); + + const editor = new CreatorPresetEditorModel(); + const survey = editor.model; + const categQuestion = survey.getQuestionByName("toolbox_categories"); + const matrixQuestion = survey.getQuestionByName("toolbox_matrix"); + expect(matrixQuestion.value).toBeUndefined(); + expect(categQuestion.value.filter(c => c.category === "general")[0].items.filter(i => i.name === "test")).toHaveLength(1); + ComponentCollection.Instance.remove("test"); }); \ No newline at end of file diff --git a/packages/survey-creator-core/tests/toolbox.tests.ts b/packages/survey-creator-core/tests/toolbox.tests.ts index 529c98a569..793351c4af 100644 --- a/packages/survey-creator-core/tests/toolbox.tests.ts +++ b/packages/survey-creator-core/tests/toolbox.tests.ts @@ -907,4 +907,11 @@ test("Update subitems on locale change, Bug#6014", (): any => { creator.locale = "en"; creator.toolbox.addItem({ name: "test4", json: {} }); expect(creator.toolbox.getItemByName("test4").title).toBe("test4"); +}); +test("Get default toolbox categories", (): any => { + ComponentCollection.Instance.add({ name: "test", title: "Test", questionJSON: { "type": "text", "title": "1" } }); + const creator = new CreatorTester({ questionTypes: ["text"] }); + const categories = creator.toolbox.getDefaultCategories(); + expect(categories.map(c => ({ name: c.name, items: c.items.map(i => i.name) }))).toEqual([{ name: "text", items: ["text"] }, { name: "general", items: ["test"] }]); + ComponentCollection.Instance.remove("test"); }); \ No newline at end of file From b660687fedb1b7db16d4b120957b7610a75d09f4 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 1 Oct 2025 17:37:41 +0300 Subject: [PATCH 151/240] #7004 - fix names generation --- .../presets/presets-editable-categorized.ts | 10 +++- .../src/presets/presets-editable-list.ts | 16 +++-- .../src/presets/presets-editable-toolbox.ts | 7 +++ .../presets-editor-toolbox.tests.ts | 59 +++++++++++++++++++ 4 files changed, 85 insertions(+), 7 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 9e5dc51d96..4310d71883 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -125,7 +125,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre title: "Move to new category", needSeparator: isUnsorted, action: () => { - this.moveToCategory(model, question, row, this.getDefaultValueForRow(question, "category"), true); + this.moveToCategory(model, question, row, this.getDefaultValueForRow(model, question, "category"), true); } })); @@ -238,6 +238,12 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre } } + protected getExistingKeys(model: SurveyModel, key: string) { + const cats = model.getQuestionByName(this.nameCategories).value || []; + const unsorted = model.getQuestionByName(this.nameMatrix).value || []; + return [...cats, ...cats.map(c => c.items).flat(), ...unsorted].map(i => i[key]).filter(v => !!v); + } + public onMatrixRowRemoving(model: SurveyModel, creator: SurveyCreatorModel, options: any) { super.onMatrixRowRemoving(model, creator, options); if (options.question.name == this.nameCategories) { @@ -257,7 +263,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre public onMatrixRowAdded(model: SurveyModel, creator: SurveyCreatorModel, options: any) { super.onMatrixRowAdded(model, creator, options); if (options.question.name == this.nameCategories) { - this.setDefaultValueForRow(options.question, options.row); + this.setDefaultValueForRow(model, options.question, options.row); } } } diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 1189f27789..60c7de8143 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -207,19 +207,25 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { } } - protected getDefaultValueForRow(question: QuestionMatrixDynamicModel, key: string) { - return SurveyHelper.getNewName((question.value || []).map(r => ({ name: r.name })), key); + protected getExistingKeys(model: SurveyModel, key: string) { + const items = model.getQuestionByName(this.nameItems).value || []; + const unsorted = model.getQuestionByName(this.nameMatrix).value || []; + return [...items, ...unsorted].map(i => i[key]).filter(v => !!v); } - protected setDefaultValueForRow(question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { + protected getDefaultValueForRow(model: SurveyModel, question: QuestionMatrixDynamicModel, key: string) { + return SurveyHelper.getNewName(this.getExistingKeys(model, key).map(r => ({ name: r })), key); + } + + protected setDefaultValueForRow(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { const key = this.getMatrixKeyColumnName(question); - const value = this.getDefaultValueForRow(question, key); + const value = this.getDefaultValueForRow(model, question, key); row.getQuestionByName(key).value = value; row.getQuestionByName("title").value = value; } public onMatrixRowAdded(model: SurveyModel, creator: SurveyCreatorModel, options: any) { if (this.isItemsMatrix(options.question.name)) { - this.setDefaultValueForRow(options.question, options.row); + this.setDefaultValueForRow(model, options.question, options.row); } } public onMatrixCellValueChanged(model: SurveyModel, creator: SurveyCreatorModel, options: any) { diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 8f19f9660a..85bdc80a73 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -213,6 +213,13 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita destination.value = destValue; } + protected getExistingKeys(model: SurveyModel, key: string) { + const superItems = super.getExistingKeys(model, key); + const items = model.getQuestionByName(this.nameItems).value || []; + const keys = items.map(i => i[key]).filter(v => !!v); + return [...superItems, ...keys]; + } + protected itemMenuCategoriesEnabled(model: SurveyModel) { return model.getValue(this.nameCategoriesMode) !== "items"; } diff --git a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts index 5162c8f896..8425e53895 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor-toolbox.tests.ts @@ -416,4 +416,63 @@ test("Preset edit, toolbox - custom types", () => { expect(matrixQuestion.value).toBeUndefined(); expect(categQuestion.value.filter(c => c.category === "general")[0].items.filter(i => i.name === "test")).toHaveLength(1); ComponentCollection.Instance.remove("test"); +}); + +test("Preset edit, toolbox - new names", () => { + const editor = new CreatorPresetEditorModel({ + "toolbox": { + "definition": [ + { + "name": "text" + }, + { + "name": "comment" + }, + { + "name": "multipletext" + }, + { + "name": "name1", + "title": "name1" + }, + { + "name": "panel" + }, + { + "name": "paneldynamic" + }, + { + "name": "name2", + "title": "name2" + } + ], + "categories": [ + { + "category": "text", + "title": "Text Input Questions", + "items": [ + "text", + "comment", + "multipletext", + "name1" + ] + }, + { + "category": "containers", + "title": "Containers", + "items": [ + "panel", + "paneldynamic", + "name2" + ] + } + ] + } + }); + const survey = editor.model; + const matrixQuestion = survey.getQuestionByName("toolbox_matrix"); + matrixQuestion.addRow(); + expect(matrixQuestion.value[matrixQuestion.value.length - 1].name).toBe("name3"); + matrixQuestion.addRow(); + expect(matrixQuestion.value[matrixQuestion.value.length - 1].name).toBe("name4"); }); \ No newline at end of file From a405f08c5a08ca27090cf7889b75343fd06f6925 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 1 Oct 2025 17:41:53 +0300 Subject: [PATCH 152/240] #7004 - hidden properties --- .../src/presets/presets-editable-properties.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index e250649d0b..7f8edcdbbe 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -414,10 +414,11 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare } private getCurrentlyHiddenItems(categories: any) { + const hiddenProperties = ["progressBarInheritWidthFrom"]; const itemsMap: any = {}; this.defaultItems.forEach((i: any) => itemsMap[i.name] = i); categories.filter((c: any) => c.properties).forEach((c: any) => c.properties.forEach((p: any) => delete itemsMap[p.name])); - return Object.keys(itemsMap).map(key => itemsMap[key]); + return Object.keys(itemsMap).map(key => itemsMap[key]).filter(i => hiddenProperties.indexOf(i.name) == -1); } private setupDefaults(model: SurveyModel): void { From 3e4078094cd44e09d75846007e741fa1efb5e0d7 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 1 Oct 2025 18:22:21 +0300 Subject: [PATCH 153/240] #7004 - fix add categories to property grid --- .../src/presets/presets-editable-categorized.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 4310d71883..f4ec6cc8b4 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -241,7 +241,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre protected getExistingKeys(model: SurveyModel, key: string) { const cats = model.getQuestionByName(this.nameCategories).value || []; const unsorted = model.getQuestionByName(this.nameMatrix).value || []; - return [...cats, ...cats.map(c => c.items).flat(), ...unsorted].map(i => i[key]).filter(v => !!v); + return [...cats, ...cats.map(c => c.items).flat(), ...unsorted].map(i => i?.[key]).filter(v => !!v); } public onMatrixRowRemoving(model: SurveyModel, creator: SurveyCreatorModel, options: any) { From 67c2ae0f11cd12c6c941fc47fdcf241ad9f21179 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 1 Oct 2025 18:22:56 +0300 Subject: [PATCH 154/240] #7004 - fix convert to subcategory --- .../src/presets/presets-editable-list.ts | 6 +++--- .../src/presets/presets-editable-toolbox.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 60c7de8143..40fc833103 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -27,12 +27,12 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { protected updateOnValueChangedCore(model: SurveyModel, name: string): void { if (this.needToSetActions(name)) { - this.updateMatrixRowActions(model, name); + const matrix = model.getQuestionByName(name) as QuestionMatrixDynamicModel; + this.updateMatrixRowActions(model, matrix); } } - protected updateMatrixRowActions(model: SurveyModel, name: string) { - const matrix = model.getQuestionByName(name) as QuestionMatrixDynamicModel; + protected updateMatrixRowActions(model: SurveyModel, matrix: QuestionMatrixDynamicModel) { matrix.renderedTable.rows.forEach(r => { if (!r.row) return; const iconActions = r.cells[1]?.item?.value.actions; diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 85bdc80a73..3a230884eb 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -269,7 +269,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita item.subitems = []; } destination.value = destValue; - this.updateMatrixRowActions(model, question.name); + this.updateMatrixRowActions(model, question); } })); } From 75713c3beddcfe9d187f41d0aa71ba71cbb2b487 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 2 Oct 2025 13:08:31 +0300 Subject: [PATCH 155/240] #7004 - localization strings --- .../src/presets/localization/english.ts | 108 ++++++++++++++++++ .../src/presets/presets-editable-base.ts | 6 +- .../presets/presets-editable-categorized.ts | 18 +-- .../src/presets/presets-editable-languages.ts | 16 +-- .../src/presets/presets-editable-list.ts | 8 +- .../presets/presets-editable-properties.ts | 30 ++--- .../src/presets/presets-editable-tabs.ts | 22 ++-- .../src/presets/presets-editable-toolbox.ts | 52 ++++----- .../src/presets/presets-editor.ts | 31 ++--- .../src/presets/presets-plugin.ts | 16 +-- 10 files changed, 203 insertions(+), 104 deletions(-) create mode 100644 packages/survey-creator-core/src/presets/localization/english.ts diff --git a/packages/survey-creator-core/src/presets/localization/english.ts b/packages/survey-creator-core/src/presets/localization/english.ts new file mode 100644 index 0000000000..0d2d5eb362 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/english.ts @@ -0,0 +1,108 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const enStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + tabs: "Tabs", + unsortedItems: "Unsorted items", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Unsorted items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Convert to subcategory...", + moveAsSubitem: "Move as subitem", + moveTo: "Move To...", + addToToolbox: "Add to Toolbox", + categories_label: "Categories", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category", + deleteCustomItem: "Delete Custom Item", + removeFrom: "Remove from {0}", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category", + addCustomItem: "Add Custom Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items" + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Description", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back", + usageExample: `Use the following code to apply the preset: +import { SurveyCreatorModel, CreatorPreset } from "survey-creator-core"; +const creator = new SurveyCreatorModel({ ... }); + +const presetJson = { + // Copy the JSON object from below +} + +const preset = new CreatorPreset(presetJson); +preset.apply(creator);` + }, + plugin: { + presetsTab: "Presets", + save: "Save & Exit", + import: "Import", + export: "Export", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("en"); +locale.presets = enStrings; \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index f9abfafa05..2061d2648f 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -1,5 +1,5 @@ import { Helpers, IDialogOptions, MatrixDynamicRowModel, QuestionMatrixDynamicModel, settings, SurveyModel, IAction, PanelModel } from "survey-core"; -import { PropertyGridModel, SurveyCreatorModel, editorLocalization, CreatorPresetBase, ICreatorOptions } from "survey-creator-core"; +import { PropertyGridModel, SurveyCreatorModel, editorLocalization, CreatorPresetBase, ICreatorOptions, getLocString } from "survey-creator-core"; import { presetsCss } from "./presets-theme/presets"; export interface ICreatorPresetEditorSetup { @@ -109,7 +109,7 @@ export class CreatorPresetEditableBase { } public resetToDefaults(model: SurveyModel, notify = true): void { this.restoreValuesFromDefault(model); - this.notifyCallback(this.getPageTitle(model) + " resored to default"); + this.notifyCallback(this.getPageTitle(model) + " " + getLocString("presets.editor.resoredToDefault")); this.children.forEach(item => { item.resetToDefaults(model, notify); }); @@ -207,7 +207,7 @@ export class CreatorPresetEditableBase { return true; }, cssClass: "sps-popup svc-property-editor svc-creator-popup", - title: "Edit", + title: getLocString("presets.editor.edit"), displayMode: "popup" }, rootElement); if (survey.getAllQuestions().filter(q => !q.startWithNewLine).length > 0) { diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index f4ec6cc8b4..e1589066bc 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -1,5 +1,5 @@ import { Action, createDropdownActionModel, IAction, MatrixDynamicRowModel, PopupModel, QuestionMatrixDynamicModel, SurveyModel } from "survey-core"; -import { SurveyCreatorModel, SurveyHelper } from "survey-creator-core"; +import { SurveyCreatorModel, SurveyHelper, getLocString } from "survey-creator-core"; import { CreatorPresetEditableList } from "./presets-editable-list"; import { listComponentCss } from "./presets-theme/list-theme"; export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPresetEditableList { @@ -65,7 +65,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre actions.push( new Action({ id: "remove-from", - title: "Remove from " + question.title, + title: getLocString("presets.toolbox.removeFrom").replace("{0}", question.title), action: () => { const rowDataIndex = question.visibleRows.indexOf(row); question.removeRow(rowDataIndex); @@ -76,14 +76,14 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre if (hasCategories) { actions.push(new Action({ id: "move-to", - title: "Move To...", + title: getLocString("presets.toolbox.moveTo"), css: "sps-list__item--label", enabled: false })); } else { actions.push(new Action({ id: "restore-item", - title: "Add to Toolbox", + title: getLocString("presets.toolbox.addToToolbox"), action: () => { const rowDataIndex = question.visibleRows.indexOf(row); question.removeRow(rowDataIndex); @@ -104,14 +104,14 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre if (!isUnsorted) { actions.push(new Action({ id: "categories", - title: "Categories", + title: getLocString("presets.toolbox.categories_label"), css: "sps-list__item--label", enabled: false, needSeparator: true })); const catGroup = new Action({ id: "move-to-categories", - title: "Move to category..." + title: getLocString("presets.toolbox.moveToCategory") }); catGroup.setSubItems({ items: moveToCategories, cssClasses: listComponentCss }); actions.push(catGroup); @@ -122,7 +122,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre actions.push( new Action({ id: "move-to-new-category", - title: "Move to new category", + title: getLocString("presets.toolbox.moveToNewCategory"), needSeparator: isUnsorted, action: () => { this.moveToCategory(model, question, row, this.getDefaultValueForRow(model, question, "category"), true); @@ -138,7 +138,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre actions.push( new Action({ id: "remove-custom-item", - title: "Delete Custom Item", + title: getLocString("presets.toolbox.deleteCustomItem"), needSeparator: true, action: () => { this.ejectRowData(question, row, true); @@ -215,7 +215,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre hiddenItemsQuestion.value = hiddenValue; categoriesQuestion.value = value; - this.notifyCallback("Category restored to default"); + this.notifyCallback(getLocString("presets.editor.categoryRestoredToDefault")); } protected findOrCreateCategory(categories: any, category?: string) { let generalCategory = categories.filter(c => c.category == category)[0]; diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index 744f80c474..592c642a79 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -1,6 +1,6 @@ import { Serializer, ItemValue, QuestionCheckboxModel, surveyLocalization, SurveyModel } from "survey-core"; import { CreatorPresetEditableBase } from "./presets-editable-base"; -import { editorLocalization, SurveyCreatorModel } from "survey-creator-core"; +import { getLocString, editorLocalization, SurveyCreatorModel } from "survey-creator-core"; function searchItem(params) { const questionInstance = this.survey.getQuestionByName(params[0]); let itemvalue = params[1]; @@ -15,13 +15,13 @@ FunctionFactory.Instance.register("searchItem", searchItem); export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { public createMainPageCore(): any { return { - title: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - navigationTitle: "Languages", + title: getLocString("presets.languages.title"), + description: getLocString("presets.languages.description"), + navigationTitle: getLocString("presets.languages.navigationTitle"), elements: [ { type: "dropdown", - title: "Creator UI language", + title: getLocString("presets.languages.creatorUI"), placeholder: editorLocalization.getLocaleName(""), name: this.creatorLocaleName, searchEnabled: true, @@ -29,12 +29,12 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { }, { type: "panel", - title: "Survey languages", + title: getLocString("presets.languages.surveyLanguages"), elements: [ { type: "text", name: this.searchLocalesName, - placeholder: "Type to search...", + placeholder: getLocString("presets.languages.searchPlaceholder"), titleLocation: "hidden", textUpdateMode: "onTyping" }, { @@ -56,7 +56,7 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { { type: "boolean", name: this.surveyUseEnglishNames, - title: "Translate Survey language names to Engish", + title: getLocString("presets.languages.translateToEnglish"), titleLocation: "hidden", renderAs: "switch" }] } diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 40fc833103..6143ff4695 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -1,6 +1,6 @@ import { Helpers, MatrixDynamicRowModel, QuestionMatrixDynamicModel, SurveyModel, Action, IAction, SvgRegistry, Question } from "survey-core"; import { CreatorPresetEditableBase } from "./presets-editable-base"; -import { SurveyCreatorModel, SurveyHelper } from "survey-creator-core"; +import { SurveyCreatorModel, SurveyHelper, getLocString } from "survey-creator-core"; export class CreatorPresetEditableList extends CreatorPresetEditableBase { //private replaceNonLettersWithDash(inputString) { // return inputString?.replace(/[^a-zA-Z0-9]/g, "-"); @@ -117,7 +117,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { const itemKey = this.getMatrixKeyColumnName(question); const resetActionParams = { id: "reset-to-default", - title: "Reset to default", + title: getLocString("presets.editor.resetToDefault"), css: "sps-action--grow", innerCss: "sps-btn sps-btn--secondary-alert", visibleIndex: 15, @@ -125,7 +125,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { const defaultItem = this.getDefaultItem(question, survey.getValue(itemKey)); survey.data = defaultItem; resetAction.enabled = false; - this.notifyCallback("Item restored to default"); + this.notifyCallback(getLocString("presets.editor.itemRestoredToDefault")); } }; resetAction = new Action(resetActionParams); @@ -149,7 +149,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { }); question.value = value; } - this.notifyCallback("Item restored to default"); + this.notifyCallback(getLocString("presets.editor.itemRestoredToDefault")); } protected restoreItems(questionItems: QuestionMatrixDynamicModel, questionHiddenItems: QuestionMatrixDynamicModel, rowIndex: number) { const rowData = questionHiddenItems.value[rowIndex]; diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 7f8edcdbbe..2bf7f69514 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -5,7 +5,7 @@ import { import { ICreatorPresetEditorSetup } from "./presets-editable-base"; import { SurveyCreatorModel, defaultPropertyGridDefinition, ISurveyPropertyGridDefinition, ISurveyPropertiesDefinition, - SurveyQuestionProperties, editorLocalization, PropertyGridModel, + SurveyQuestionProperties, editorLocalization, PropertyGridModel, getLocString, settings } from "survey-creator-core"; import { CreatorPresetEditableCaregorizedListConfigurator } from "./presets-editable-categorized"; @@ -238,9 +238,9 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare ], detailPanelMode: "underRow", detailElements: [ - { type: "text", name: "name", title: "Name", isUnique: true, isRequired: true, visible: false }, - { type: "text", name: "title", title: "Title", isUnique: true, isRequired: true, visible: false }, - { type: "comment", name: "description", title: "Description", visible: false } + { type: "text", name: "name", title: getLocString("presets.propertyGrid.name"), isUnique: true, isRequired: true, visible: false }, + { type: "text", name: "title", title: getLocString("presets.propertyGrid.titleField"), isUnique: true, isRequired: true, visible: false }, + { type: "comment", name: "description", title: getLocString("presets.propertyGrid.descriptionField"), visible: false } ] }; return { ...defaultJSON, ...props }; @@ -248,16 +248,16 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare public createMainPageCore(): any { return { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", + title: getLocString("presets.propertyGrid.title"), + navigationTitle: getLocString("presets.propertyGrid.navigationTitle"), + description: getLocString("presets.propertyGrid.description"), elements: [ { type: "dropdown", name: this.nameSelector, allowClear: false, clearIfInvisible: "onHidden", - title: "Select an element to customize its settings available in the Property Grid" + title: getLocString("presets.propertyGrid.selectElement") }, { type: "panel", @@ -267,12 +267,12 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare { type: "matrixdynamic", name: this.nameCategories, - title: "Property Grid", + title: getLocString("presets.propertyGrid.propertyGrid"), minRowCount: 1, allowRowReorder: true, addRowButtonLocation: "top", allowAddRows: true, - addRowText: "Add Custom Category", + addRowText: getLocString("presets.propertyGrid.addCustomCategory"), showHeader: false, columns: [ { cellType: "text", name: "category", isUnique: true, isRequired: true, visible: false }, @@ -281,9 +281,9 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare ], detailPanelMode: "underRow", detailElements: [ - { type: "text", name: "category", title: "Name", isRequired: true, visible: false }, - { type: "text", name: "title", title: "Title", visible: false }, - { type: "dropdown", name: "iconName", title: "Icon name", itemComponent: "svc-presets-icon-item", "allowCustomChoices": true, choices: this.iconList, visible: false }, + { type: "text", name: "category", title: getLocString("presets.propertyGrid.categoryName"), isRequired: true, visible: false }, + { type: "text", name: "title", title: getLocString("presets.propertyGrid.categoryTitle"), visible: false }, + { type: "dropdown", name: "iconName", title: getLocString("presets.propertyGrid.iconName"), itemComponent: "svc-presets-icon-item", "allowCustomChoices": true, choices: this.iconList, visible: false }, this.createItemsMatrixJSON({ name: this.nameInnerMatrix, titleLocation: "hidden", @@ -291,9 +291,9 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare ] }, this.createItemsMatrixJSON({ - title: "Unsorted items", + title: getLocString("presets.propertyGrid.unsortedItems"), name: this.nameMatrix, - description: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + description: getLocString("presets.propertyGrid.unsortedDescription"), descriptionLocation: "underInput", startWithNewLine: false, }) diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index cf7d8ebe60..c54ebe45d6 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -1,6 +1,6 @@ import { Helpers, ItemValue, QuestionMatrixDynamicModel, SurveyModel } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; -import { SurveyCreatorModel, editorLocalization } from "survey-creator-core"; +import { SurveyCreatorModel, editorLocalization, getLocString } from "survey-creator-core"; import { CreatorPresetEditableList } from "./presets-editable-list"; export class CreatorPresetEditableTabs extends CreatorPresetEditableList { @@ -27,32 +27,32 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { ], detailPanelMode: "underRow", detailElements: [ - { type: "text", name: "name", title: "Name", isUnique: true, isRequired: true, readOnly: true, visible: false }, - { type: "text", name: "title", title: "Title", visible: false }, - { type: "dropdown", name: "iconName", title: "Icon name", itemComponent: "svc-presets-icon-item", "allowCustomChoices": true, choices: this.iconList, visible: false } + { type: "text", name: "name", title: getLocString("presets.tabs.name"), isUnique: true, isRequired: true, readOnly: true, visible: false }, + { type: "text", name: "title", title: getLocString("presets.tabs.titleField"), visible: false }, + { type: "dropdown", name: "iconName", title: getLocString("presets.tabs.iconName"), itemComponent: "svc-presets-icon-item", "allowCustomChoices": true, choices: this.iconList, visible: false } ] }; return { ...defaultJSON, ...props }; } public createMainPageCore(): any { return { - title: "Configure tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - navigationTitle: "Tabs", + title: getLocString("presets.tabs.title"), + description: getLocString("presets.tabs.description"), + navigationTitle: getLocString("presets.tabs.navigationTitle"), elements: [ { type: "panel", name: this.mainPanelName, elements: [ this.createItemsMatrixJSON({ - title: "Tabs", + title: getLocString("presets.tabs.tabs"), name: this.nameItems }), this.createItemsMatrixJSON({ startWithNewLine: false, - title: "Unsorted items", + title: getLocString("presets.tabs.unsortedItems"), name: this.nameMatrix, - description: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + description: getLocString("presets.tabs.unsortedDescription"), descriptionLocation: "underInput", }), ] @@ -64,7 +64,7 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { { type: "dropdown", name: this.nameActiveTab, - title: "Default tab" + title: getLocString("presets.tabs.defaultTab") } ] }, diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 3a230884eb..1e903115f8 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -1,6 +1,6 @@ import { Action, FunctionFactory, Helpers, IAction, MatrixDynamicRowModel, QuestionMatrixDynamicModel, Serializer, SurveyModel } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; -import { QuestionToolboxCategory, QuestionToolboxItem, SurveyCreatorModel, editorLocalization } from "survey-creator-core"; +import { QuestionToolboxCategory, QuestionToolboxItem, SurveyCreatorModel, editorLocalization, getLocString } from "survey-creator-core"; import { ICreatorPresetToolboxItem } from "survey-creator-core"; import { CreatorPresetEditableCaregorizedListConfigurator } from "./presets-editable-categorized"; import { listComponentCss } from "./presets-theme/list-theme"; @@ -46,10 +46,10 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita "name": "details", "maxWidth": "30%", "elements": [ - { type: "text", name: "name", title: "Name", isUnique: true, visible: false, isRequired: true }, - { type: "text", name: "title", title: "Title", visible: false }, - { type: "dropdown", name: "iconName", title: "Icon name", itemComponent: "svc-presets-icon-item", "allowCustomChoices": true, choices: this.iconList, visible: false }, - { type: "text", name: "tooltip", title: "Tooltip", visible: false }, + { type: "text", name: "name", title: getLocString("presets.toolbox.categoryName"), isUnique: true, visible: false, isRequired: true }, + { type: "text", name: "title", title: getLocString("presets.toolbox.categoryTitle"), visible: false }, + { type: "dropdown", name: "iconName", title: getLocString("presets.toolbox.iconName"), itemComponent: "svc-presets-icon-item", "allowCustomChoices": true, choices: this.iconList, visible: false }, + { type: "text", name: "tooltip", title: getLocString("presets.toolbox.tooltip"), visible: false }, ], visible: false }, @@ -58,7 +58,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita name: "json", startWithNewLine: false, renderAs: "default-comment", - title: "JSON object to apply when users select this toolbox item", + title: getLocString("presets.toolbox.jsonObject"), validators: [{ type: "expression", text: "JSON should be correct", @@ -73,7 +73,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita if (addSubitems) { newJson.detailElements.push(this.createItemsMatrixJSON({ allowAddRows: true, - addRowText: "Add a new subitem", + addRowText: getLocString("presets.toolbox.addNewSubitem"), addRowButtonLocation: "bottom", name: this.nameSubitems, valueName: "subitems", @@ -86,9 +86,9 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita public createMainPageCore(): any { return { - title: "Set up the Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - navigationTitle: "Toolbox", + title: getLocString("presets.toolbox.title"), + description: getLocString("presets.toolbox.description"), + navigationTitle: getLocString("presets.toolbox.navigationTitle"), elements: [ { type: "panel", @@ -97,13 +97,13 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita { type: "matrixdynamic", name: this.nameCategories, - title: "Toolbox", + title: getLocString("presets.toolbox.toolbox"), visibleIf: this.getTextVisibleIf(this.nameCategoriesMode, "categories"), minRowCount: 1, allowRowReorder: true, allowAddRows: true, addRowButtonLocation: "top", - addRowText: "Add Custom Category", + addRowText: getLocString("presets.toolbox.addCustomCategory"), showHeader: false, columns: [ { cellType: "text", name: "category", isUnique: true, isRequired: true, visible: false }, @@ -111,34 +111,34 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita ], detailPanelMode: "underRow", detailElements: [ - { type: "text", name: "category", title: "Name", isRequired: true, visible: false }, - { type: "text", name: "title", title: "Title", visible: false }, - { type: "text", name: "tooltip", title: "Tooltip", visible: false }, + { type: "text", name: "category", title: getLocString("presets.toolbox.categoryName"), isRequired: true, visible: false }, + { type: "text", name: "title", title: getLocString("presets.toolbox.categoryTitle"), visible: false }, + { type: "text", name: "tooltip", title: getLocString("presets.toolbox.tooltip"), visible: false }, this.createItemsMatrixJSON({ name: this.nameInnerMatrix, titleLocation: "hidden", allowAddRows: true, addRowButtonLocation: "bottom", - addRowText: "Add a new item", + addRowText: getLocString("presets.toolbox.addNewItem"), valueName: "items" }, true) ] }, this.createItemsMatrixJSON({ name: this.nameItems, - title: "Toolbox", + title: getLocString("presets.toolbox.toolbox"), addRowButtonLocation: "top", - addRowText: "Add Custom Item", + addRowText: getLocString("presets.toolbox.addCustomItem"), startWithNewLine: false, visibleIf: this.getTextVisibleIf(this.nameCategoriesMode, "items"), }, true), this.createItemsMatrixJSON({ allowAddRows: true, - title: "Unsorted items", - description: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + title: getLocString("presets.toolbox.unsortedItems"), + description: getLocString("presets.toolbox.unsortedDescription"), descriptionLocation: "underInput", addRowButtonLocation: "bottom", - addRowText: "Add a new item", + addRowText: getLocString("presets.toolbox.addNewItem"), startWithNewLine: false, name: this.nameMatrix }, false)] @@ -151,7 +151,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita { type: "boolean", name: this.nameCategoriesMode, - title: "Enable grouping", + title: getLocString("presets.toolbox.enableGrouping"), titleLocation: "hidden", defaultValue: "categories", valueTrue: "categories", @@ -162,7 +162,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita { type: "boolean", name: this.nameShowCategoryTitles, - title: "Show category titles", + title: getLocString("presets.toolbox.showCategoryTitles"), defaultValue: false, titleLocation: "hidden", visibleIf: this.getTextVisibleIf(this.nameCategoriesMode, "categories"), @@ -253,14 +253,14 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita if (question.name == this.nameItems || question.name == this.nameInnerMatrix) { actions.push(new Action({ id: "subcategories", - title: "Subcategories", + title: getLocString("presets.toolbox.subcategories"), css: "sps-list__item--label", enabled: false, needSeparator: true })); actions.push(new Action({ id: "convert-to-subcategory", - title: "Convert to subcategory...", + title: getLocString("presets.toolbox.convertToSubcategory"), action: () => { const destination = hasCategories ? this.getQuestionCategories(model) : this.getQuestionItems(model); const destValue = JSON.parse(JSON.stringify(destination.value)); @@ -275,7 +275,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita } const subitemsAction = new Action({ id: "move-as-subitem", - title: "Move as subitem" + title: getLocString("presets.toolbox.moveAsSubitem") }); subitemsAction.setSubItems({ items: subItems, cssClasses: listComponentCss }); actions.push(subitemsAction); diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index 1069bc8eb7..a2a6e3d9d0 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -1,4 +1,4 @@ -import { SurveyCreatorModel, editorLocalization, ICreatorOptions } from "survey-creator-core"; +import { SurveyCreatorModel, editorLocalization, ICreatorOptions, getLocString } from "survey-creator-core"; import { CreatorPreset, ICreatorPresetData } from "survey-creator-core"; import { Action, ActionContainer, Base, LocalizableString, Question, QuestionMatrixDropdownRenderedRow, QuestionMatrixDynamicModel, SurveyModel } from "survey-core"; import { CreatorPresetEditableBase, ICreatorPresetEditorSetup } from "./presets-editable-base"; @@ -7,6 +7,7 @@ import { CreatorPresetEditablePropertyGrid } from "./presets-editable-properties import { CreatorPresetEditableTabs } from "./presets-editable-tabs"; import { CreatorPresetEditableLanguages } from "./presets-editable-languages"; import { presetsCss } from "./presets-theme/presets"; +export { enStrings } from "./localization/english"; export class NavigationBar extends ActionContainer { constructor() { @@ -42,7 +43,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit this.modelValue = this.createModel(); this.resultModelValue = this.createResultModel(); this.locTitle = new LocalizableString(undefined, false); - this.locTitle.text = "Creator Presets"; + this.locTitle.text = getLocString("presets.editor.title"); this.navigationBarValue = new NavigationBar(); const firstTabName = "preset"; this.preset.setJson(this.getJsonFromSurveyModel()); @@ -91,7 +92,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit public resetToDefaults(page?: string) { if (!page) { - this.notify("All settings restored to default"); + this.notify(getLocString("presets.editor.resetToDefaults")); } this.model.editablePresets.forEach(item => { if (!page || item.pageName == page) item.resetToDefaults(this.model, !!page); @@ -115,8 +116,8 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit model.editablePresets = editablePresets; model.keepIncorrectValues = true; model.showNavigationButtons = false; - model.completeText = "Save & Exit"; - model.pagePrevText = "Back"; + model.completeText = getLocString("presets.editor.completeText"); + model.pagePrevText = getLocString("presets.editor.pagePrevText"); model.enterKeyAction = "loseFocus"; editablePresets.forEach(item => item.notifyCallback = (message: string) => this.notify(message)); @@ -214,7 +215,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit const model = new SurveyModel({ elements: [ { type: "html", name: "q1", html: this.getResultHtml() }, - { type: "comment", name: "json", title: "Preset JSON:", rows: 60, cols: 120, readOnly: true } + { type: "comment", name: "json", title: getLocString("presets.editor.presetJson"), rows: 60, cols: 120, readOnly: true } ] }); model.showPrevButton = false; @@ -227,7 +228,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit options.titleActions.push({ id: "json_copy", iconName: "icon-copy", - title: "Copy", + title: getLocString("presets.editor.copy"), action: () => { navigator.clipboard.writeText(question.value); } @@ -235,7 +236,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit options.titleActions.push({ id: "json_download", iconName: "icon-download", - title: "Download", + title: getLocString("presets.editor.download"), action: () => { this.downloadJsonFile(question.value); } @@ -243,7 +244,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit options.titleActions.push({ id: "icon-load", iconName: "icon-load", - title: "Load", + title: getLocString("presets.editor.load"), action: () => { this.loadJsonFile(); } @@ -253,17 +254,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit return model; } private getResultHtml(): string { - return `
Use the following code to apply the preset: -
import { SurveyCreatorModel, CreatorPreset } from "survey-creator-core";
-const creator = new SurveyCreatorModel({ ... });
-
-const presetJson = {
-  // Copy the JSON object from below
-}
-
-const preset = new CreatorPreset(presetJson);
-preset.apply(creator);
-`; + return `
${getLocString("presets.editor.usageExample")}
`; } public downloadJsonFile(text?: string): void { if (!text) text = this.jsonText; diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index c85f25798f..4ed09e13cd 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -1,5 +1,5 @@ import { createDropdownActionModel, IAction } from "survey-core"; -import { ICreatorPlugin, SurveyCreatorModel, saveToFileHandler } from "survey-creator-core"; +import { ICreatorPlugin, SurveyCreatorModel, saveToFileHandler, getLocString } from "survey-creator-core"; import { CreatorPresetEditorModel } from "./presets-editor"; import { listComponentCss } from "./presets-theme/list-theme"; export class TabPresetsPlugin implements ICreatorPlugin { @@ -23,7 +23,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { } constructor(private creator: SurveyCreatorModel) { - creator.addTab({ name: "presets", title: "Presets", plugin: this, iconName: TabPresetsPlugin.iconName }); + creator.addTab({ name: "presets", title: getLocString("presets.plugin.presetsTab"), plugin: this, iconName: TabPresetsPlugin.iconName }); creator.tabs.filter(t => t.id == "presets")[0].css = "svc-tabbed-menu-item-container--presets"; this.designerPlugin = creator.getPlugin("designer"); const settingsPage = this.creator.sidebar.getPageById("creatorTheme"); @@ -50,11 +50,11 @@ export class TabPresetsPlugin implements ICreatorPlugin { const presets = this.model?.model.pages.map(p => { id: p.name, title: p.navigationTitle }); const tools = [ - { id: "save", title: "Save & Exit", css: "sps-list__item--positive", markerIconName: "check-24x24", needSeparator: true, action: () => this.hidePresets() }, - { id: "import", title: "Import", markerIconName: "import-24x24", action: () => { this.model?.loadJsonFile(); } }, - { id: "export", title: "Export", markerIconName: "download-24x24", action: () => { this.model?.downloadJsonFile(); } }, - { id: "reset-current", title: "Reset Languages to default", needSeparator: true, action: () => { this.model?.resetToDefaults("page_languages"); } }, - { id: "reset", title: "Reset all changes", action: () => { this.model?.resetToDefaults(); } }, + { id: "save", title: getLocString("presets.plugin.save"), css: "sps-list__item--positive", markerIconName: "check-24x24", needSeparator: true, action: () => this.hidePresets() }, + { id: "import", title: getLocString("presets.plugin.import"), markerIconName: "import-24x24", action: () => { this.model?.loadJsonFile(); } }, + { id: "export", title: getLocString("presets.plugin.export"), markerIconName: "download-24x24", action: () => { this.model?.downloadJsonFile(); } }, + { id: "reset-current", title: getLocString("presets.plugin.resetLanguages"), needSeparator: true, action: () => { this.model?.resetToDefaults("page_languages"); } }, + { id: "reset", title: getLocString("presets.plugin.resetAll"), action: () => { this.model?.resetToDefaults(); } }, ]; let settingsAction; let presetsList; @@ -93,7 +93,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { presetsList.selectedItem = presetsList.actions[0]; this.model.model.onCurrentPageChanged.add((_, options) => { presetsList.selectedItem = presetsList.actions[this.model.model.currentPageNo]; - resetCurrentAction.title = "Reset " + this.model.model.currentPage.navigationTitle + " to defaults"; + resetCurrentAction.title = getLocString("presets.plugin.resetToDefaults").replace("{0}", this.model.model.currentPage.navigationTitle); resetCurrentAction.action = () => { this.model?.resetToDefaults(presetsList.selectedItem.id); }; }); presets[this.currentPresetIndex].action(presets[this.currentPresetIndex]); From 7018094a8330f8ae72f6b930c406298e4fd3b913 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 2 Oct 2025 17:14:54 +0300 Subject: [PATCH 156/240] #7004 - fix unit test --- .../tests-presets/presets-editable-base.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-core/tests-presets/presets-editable-base.test.ts b/packages/survey-creator-core/tests-presets/presets-editable-base.test.ts index 88d0a3c42e..60df6ccf6d 100644 --- a/packages/survey-creator-core/tests-presets/presets-editable-base.test.ts +++ b/packages/survey-creator-core/tests-presets/presets-editable-base.test.ts @@ -78,7 +78,7 @@ describe("CreatorPresetEditableBase", () => { expect.objectContaining({ componentName: "survey", cssClass: "sps-popup svc-property-editor svc-creator-popup", - title: "Edit", + title: "edit", displayMode: "popup", data: expect.any(Object), onApply: expect.any(Function), From 6fc200094d5e702003db2433ad012850bb8c6cd7 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 2 Oct 2025 17:15:54 +0300 Subject: [PATCH 157/240] #7004 - remove reference to tokens --- packages/survey-creator-core/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/survey-creator-core/package.json b/packages/survey-creator-core/package.json index 15a86d9bd0..4957a457b0 100644 --- a/packages/survey-creator-core/package.json +++ b/packages/survey-creator-core/package.json @@ -30,8 +30,7 @@ "lint:fix": "eslint . --max-warnings=0 --fix" }, "dependencies": { - "survey-core": "../../../survey-library/packages/survey-core/build", - "sjs-design-tokens": "../../../sjs-design-tokens/build" + "survey-core": "../../../survey-library/packages/survey-core/build" }, "devDependencies": { "@rollup/plugin-commonjs": "^28.0.2", From 5da822e48582d798eb4c7082572d67de30754af2 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 2 Oct 2025 22:44:39 +0300 Subject: [PATCH 158/240] #7004 - angular, vue --- package.json | 3 + packages/survey-creator-angular/package.json | 12 ++ .../src/entries/presets.ts | 1 + .../src/presets/index.ts | 7 + .../presets/presets-icon-item.component.html | 4 + .../presets/presets-icon-item.component.ts | 14 ++ .../presets-property-grid.component.html | 18 ++ .../presets-property-grid.component.ts | 22 ++ .../src/presets/presets.component.html | 6 + .../src/presets/presets.component.ts | 23 +++ .../src/presets/presets.module.ts | 28 +++ .../tsconfig.presets.json | 13 ++ .../webpack.presets.config.js | 193 ++++++++++++++++++ .../survey-creator-core/junit.presets.xml | 24 +++ packages/survey-creator-vue/package.json | 2 + .../survey-creator-vue/src/entries/presets.ts | 2 + .../src/presets/Presets.vue | 29 +++ .../src/presets/PresetsIconItem.vue | 20 ++ .../src/presets/PresetsPropertyGrid.vue | 37 ++++ .../survey-creator-vue/src/presets/index.ts | 4 + .../src/presets/register.ts | 11 + .../survey-creator-vue/tsconfig.presets.json | 13 ++ .../survey-creator-vue/vite.presets.config.ts | 87 ++++++++ 23 files changed, 573 insertions(+) create mode 100644 packages/survey-creator-angular/src/entries/presets.ts create mode 100644 packages/survey-creator-angular/src/presets/index.ts create mode 100644 packages/survey-creator-angular/src/presets/presets-icon-item.component.html create mode 100644 packages/survey-creator-angular/src/presets/presets-icon-item.component.ts create mode 100644 packages/survey-creator-angular/src/presets/presets-property-grid.component.html create mode 100644 packages/survey-creator-angular/src/presets/presets-property-grid.component.ts create mode 100644 packages/survey-creator-angular/src/presets/presets.component.html create mode 100644 packages/survey-creator-angular/src/presets/presets.component.ts create mode 100644 packages/survey-creator-angular/src/presets/presets.module.ts create mode 100644 packages/survey-creator-angular/tsconfig.presets.json create mode 100644 packages/survey-creator-angular/webpack.presets.config.js create mode 100644 packages/survey-creator-core/junit.presets.xml create mode 100644 packages/survey-creator-vue/src/entries/presets.ts create mode 100644 packages/survey-creator-vue/src/presets/Presets.vue create mode 100644 packages/survey-creator-vue/src/presets/PresetsIconItem.vue create mode 100644 packages/survey-creator-vue/src/presets/PresetsPropertyGrid.vue create mode 100644 packages/survey-creator-vue/src/presets/index.ts create mode 100644 packages/survey-creator-vue/src/presets/register.ts create mode 100644 packages/survey-creator-vue/tsconfig.presets.json create mode 100644 packages/survey-creator-vue/vite.presets.config.ts diff --git a/package.json b/package.json index fcdb0f4875..242ab8c1b6 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,9 @@ "version": "0.0.1", "scripts": { "dev": "concurrently \"npm run dev --prefix ../survey-library\" \"http-server -p 7777 --silent\" \"npm run watch:dev --prefix packages/survey-creator-core\" \"npm run watch:prod --prefix packages/survey-creator-core\" \"npm run watch:dev --prefix packages/survey-creator-knockout\" \"npm run watch:prod --prefix packages/survey-creator-knockout\" \"npm run watch:dev --prefix packages/survey-creator-react\" \"npm run watch:prod --prefix packages/survey-creator-react\" ", + "build:presets": "npm run build:presets --prefix packages/survey-creator-vue && npm run build:presets --prefix packages/survey-creator-angular", + "build:presets:dev": "npm run build:presets:dev --prefix packages/survey-creator-vue && npm run build:presets:dev --prefix packages/survey-creator-angular", + "watch:presets": "concurrently \"npm run watch:presets --prefix packages/survey-creator-vue\" \"npm run watch:presets --prefix packages/survey-creator-angular\"", "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --max-warnings=0", "lint:fix": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --max-warnings=0 --fix", "pre-push-check": "npm run lint", diff --git a/packages/survey-creator-angular/package.json b/packages/survey-creator-angular/package.json index f662855c7d..2f317c753e 100644 --- a/packages/survey-creator-angular/package.json +++ b/packages/survey-creator-angular/package.json @@ -60,6 +60,15 @@ "eslint": "^8.57.0", "karma-html2js-preprocessor": "^1.1.0", "ng-packagr": "^12.0.0", + "webpack": "^5.0.0", + "webpack-cli": "^4.0.0", + "ts-loader": "^8.0.0", + "mini-css-extract-plugin": "^1.0.0", + "css-loader": "^5.0.0", + "sass-loader": "^10.0.0", + "sass": "^1.0.0", + "html-loader": "^2.0.0", + "url-loader": "^4.0.0", "rxjs": "~6.6.0", "tslib": "^2.3.0", "zone.js": "~0.11.4", @@ -73,6 +82,9 @@ }, "scripts": { "build": "ng build && node ./update-version.js", + "build:presets": "webpack --config webpack.presets.config.js --env buildType=prod", + "build:presets:dev": "webpack --config webpack.presets.config.js --env buildType=dev", + "watch:presets": "webpack --config webpack.presets.config.js --env buildType=dev --watch", "build:example:prod": "ng build angular-ui", "serve:example:dev": "ng serve", "serve:example:prod": "http-server ./dist/angular-ui --proxy http://localhost:8080? -p 8080", diff --git a/packages/survey-creator-angular/src/entries/presets.ts b/packages/survey-creator-angular/src/entries/presets.ts new file mode 100644 index 0000000000..53d76d04d4 --- /dev/null +++ b/packages/survey-creator-angular/src/entries/presets.ts @@ -0,0 +1 @@ +export * from "../presets"; diff --git a/packages/survey-creator-angular/src/presets/index.ts b/packages/survey-creator-angular/src/presets/index.ts new file mode 100644 index 0000000000..48a72860b9 --- /dev/null +++ b/packages/survey-creator-angular/src/presets/index.ts @@ -0,0 +1,7 @@ +export { TabPresetsComponent } from "./presets.component"; +export { PresetsPropertyGridWrapperComponent } from "./presets-property-grid.component"; +export { PresetsIconItemComponent } from "./presets-icon-item.component"; + +// Export presets module +import { PresetsModule } from "./presets.module"; +export { PresetsModule }; diff --git a/packages/survey-creator-angular/src/presets/presets-icon-item.component.html b/packages/survey-creator-angular/src/presets/presets-icon-item.component.html new file mode 100644 index 0000000000..95621a0ace --- /dev/null +++ b/packages/survey-creator-angular/src/presets/presets-icon-item.component.html @@ -0,0 +1,4 @@ +
+ + {{ item.title }} +
diff --git a/packages/survey-creator-angular/src/presets/presets-icon-item.component.ts b/packages/survey-creator-angular/src/presets/presets-icon-item.component.ts new file mode 100644 index 0000000000..330c603b05 --- /dev/null +++ b/packages/survey-creator-angular/src/presets/presets-icon-item.component.ts @@ -0,0 +1,14 @@ +import { Component, Input } from "@angular/core"; +import { ItemValue } from "survey-core"; +import { AngularComponentFactory, EmbeddedViewContentComponent } from "survey-angular-ui"; + +@Component({ + selector: "svc-presets-icon-item", + templateUrl: "./presets-icon-item.component.html", + styles: [":host { display: none; }"] +}) +export class PresetsIconItemComponent extends EmbeddedViewContentComponent { + @Input() item: ItemValue = undefined; +} + +AngularComponentFactory.Instance.registerComponent("svc-presets-icon-item", PresetsIconItemComponent); diff --git a/packages/survey-creator-angular/src/presets/presets-property-grid.component.html b/packages/survey-creator-angular/src/presets/presets-property-grid.component.html new file mode 100644 index 0000000000..aa59fa54a3 --- /dev/null +++ b/packages/survey-creator-angular/src/presets/presets-property-grid.component.html @@ -0,0 +1,18 @@ +
+
+ +
+ +
diff --git a/packages/survey-creator-angular/src/presets/presets-property-grid.component.ts b/packages/survey-creator-angular/src/presets/presets-property-grid.component.ts new file mode 100644 index 0000000000..a9dc286cc8 --- /dev/null +++ b/packages/survey-creator-angular/src/presets/presets-property-grid.component.ts @@ -0,0 +1,22 @@ +import { Component, Input } from "@angular/core"; +import { PropertyGridViewModel } from "survey-creator-core"; +import { AngularComponentFactory, BaseAngular } from "survey-angular-ui"; + +@Component({ + selector: "svc-presets-property-grid", + templateUrl: "./presets-property-grid.component.html", + styles: [":host { display: none; }"] +}) +export class PresetsPropertyGridWrapperComponent extends BaseAngular { + @Input() model: PropertyGridViewModel = undefined; + + showPresets() { + (this.model as any)["showPresets"]?.(); + } + + protected getModel() { + return this.model; + } +} + +AngularComponentFactory.Instance.registerComponent("svc-presets-property-grid", PresetsPropertyGridWrapperComponent); \ No newline at end of file diff --git a/packages/survey-creator-angular/src/presets/presets.component.html b/packages/survey-creator-angular/src/presets/presets.component.html new file mode 100644 index 0000000000..9081cb855a --- /dev/null +++ b/packages/survey-creator-angular/src/presets/presets.component.html @@ -0,0 +1,6 @@ +
+ +
+
+ +
diff --git a/packages/survey-creator-angular/src/presets/presets.component.ts b/packages/survey-creator-angular/src/presets/presets.component.ts new file mode 100644 index 0000000000..6540d7726d --- /dev/null +++ b/packages/survey-creator-angular/src/presets/presets.component.ts @@ -0,0 +1,23 @@ +import { Component, Input } from "@angular/core"; +import { AngularComponentFactory, BaseAngular } from "survey-angular-ui"; +import { SurveyCreatorModel } from "survey-creator-core"; + +@Component({ + selector: "svc-tab-presets", + templateUrl: "./presets.component.html", + styles: [":host { display: none; }"] +}) +export class TabPresetsComponent extends BaseAngular { + @Input() data: any = undefined; + @Input() creator: SurveyCreatorModel = undefined; + + get model() { + return this.data?.model; + } + + protected getModel() { + return this.data; + } +} + +AngularComponentFactory.Instance.registerComponent("svc-tab-presets", TabPresetsComponent); diff --git a/packages/survey-creator-angular/src/presets/presets.module.ts b/packages/survey-creator-angular/src/presets/presets.module.ts new file mode 100644 index 0000000000..255323fd42 --- /dev/null +++ b/packages/survey-creator-angular/src/presets/presets.module.ts @@ -0,0 +1,28 @@ +import { NgModule } from "@angular/core"; +import { CommonModule } from "@angular/common"; +import { FormsModule } from "@angular/forms"; +import { SurveyModule } from "survey-angular-ui"; + +// Import presets components +import { TabPresetsComponent } from "./presets.component"; +import { PresetsIconItemComponent } from "./presets-icon-item.component"; +import { PresetsPropertyGridWrapperComponent } from "./presets-property-grid.component"; + +@NgModule({ + declarations: [ + TabPresetsComponent, + PresetsIconItemComponent, + PresetsPropertyGridWrapperComponent + ], + imports: [ + CommonModule, + FormsModule, + SurveyModule + ], + exports: [ + TabPresetsComponent, + PresetsIconItemComponent, + PresetsPropertyGridWrapperComponent + ] +}) +export class PresetsModule { } diff --git a/packages/survey-creator-angular/tsconfig.presets.json b/packages/survey-creator-angular/tsconfig.presets.json new file mode 100644 index 0000000000..ff158fd4c8 --- /dev/null +++ b/packages/survey-creator-angular/tsconfig.presets.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "paths": { + "survey-creator-core": [ + "./build" + ] + } + }, + "include": [ + "./src/entries/presets.ts" + ] +} \ No newline at end of file diff --git a/packages/survey-creator-angular/webpack.presets.config.js b/packages/survey-creator-angular/webpack.presets.config.js new file mode 100644 index 0000000000..31ec7071ca --- /dev/null +++ b/packages/survey-creator-angular/webpack.presets.config.js @@ -0,0 +1,193 @@ +"use strict"; + +const webpack = require("webpack"); +const path = require("path"); +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); +const TsconfigPathsPlugin = require("tsconfig-paths-webpack-plugin"); +const HtmlWebpackPlugin = require("html-webpack-plugin"); +var DashedNamePlugin = require("../../webpack-dashed-name"); +const packageJson = require("./package.json"); +const fs = require("fs"); + +const year = new Date().getFullYear(); +const banner = [ + "SurveyJS Creator Presets Angular v" + packageJson.version, + "(c) 2015-" + year + " Devsoft Baltic OÜ - http://surveyjs.io/", + "Github: https://github.com/surveyjs/survey-creator", + "License: https://surveyjs.io/Licenses#SurveyCreator" +].join("\n"); + +module.exports = function (options) { + const buildPath = __dirname + "/build/"; + const isProductionBuild = options.buildType === "prod"; + const emitDeclarations = !!options.emitDeclarations; + const emitNonSourceFiles = !!options.emitNonSourceFiles; + + const compilerOptions = emitDeclarations ? {} : { + declaration: false, + declarationDir: null + }; + + const config = { + mode: isProductionBuild ? "production" : "development", + entry: { + "survey-creator-angular-presets": path.resolve(__dirname, "./src/entries/presets.ts") + }, + resolve: { + extensions: [".ts", ".js", ".scss"], + plugins: [new TsconfigPathsPlugin({ configFile: "./tsconfig.json" })], + alias: { + tslib: path.join(__dirname, "./src/entries/helpers.ts") + } + }, + optimization: { + minimize: isProductionBuild + }, + module: { + rules: [ + { + test: /\.(ts)$/, + loader: "ts-loader", + options: { + configFile: options.tsConfigFile || "tsconfig.json", + compilerOptions + } + }, + { + test: /\.html$/, + exclude: [/node_modules/, require.resolve("./src/app/app.component.html")], + loader: "html-loader" + }, + { + test: /\.s(c|a)ss$/, + use: [ + MiniCssExtractPlugin.loader, + { + loader: "css-loader", + options: { + sourceMap: options.buildType !== "prod" + } + }, + { + loader: "sass-loader", + options: { + sourceMap: options.buildType !== "prod" + } + } + ] + }, + { + test: /\.(svg|png)$/, + use: { + loader: "url-loader", + options: {} + } + } + ] + }, + output: { + path: buildPath, + filename: options.libraryName || "survey-creator-angular-presets", + library: { + root: "SurveyCreatorAngularPresets", + amd: "survey-creator-angular-presets", + commonjs: "survey-creator-angular-presets", + }, + libraryTarget: "umd", + globalObject: "this", + umdNamedDefine: true + }, + externals: { + "@angular/core": { + root: "ng.core", + commonjs2: "@angular/core", + commonjs: "@angular/core", + amd: "@angular/core" + }, + "@angular/common": { + root: "ng.common", + commonjs2: "@angular/common", + commonjs: "@angular/common", + amd: "@angular/common" + }, + "@angular/forms": { + root: "ng.forms", + commonjs2: "@angular/forms", + commonjs: "@angular/forms", + amd: "@angular/forms" + }, + "rxjs": { + root: "Rx", + commonjs2: "rxjs", + commonjs: "rxjs", + amd: "rxjs" + }, + "survey-core": { + root: "Survey", + commonjs2: "survey-core", + commonjs: "survey-core", + amd: "survey-core" + }, + "survey-angular-ui": { + root: "SurveyAngular", + commonjs2: "survey-angular-ui", + commonjs: "survey-angular-ui", + amd: "survey-angular-ui" + }, + "survey-creator-core": { + root: "SurveyCreatorCore", + commonjs2: "survey-creator-core", + commonjs: "survey-creator-core", + amd: "survey-creator-core" + }, + "survey-creator-core-presets": { + root: "SurveyCreatorCorePresets", + commonjs2: "survey-creator-core-presets", + commonjs: "survey-creator-core-presets", + amd: "survey-creator-core-presets" + }, + "survey-creator-angular": { + root: "SurveyCreatorAngular", + commonjs2: "survey-creator-angular", + commonjs: "survey-creator-angular", + amd: "survey-creator-angular" + } + }, + plugins: [ + new DashedNamePlugin(), + new webpack.DefinePlugin({ + "process.env.ENVIRONMENT": JSON.stringify(options.buildType), + "process.env.VERSION": JSON.stringify(packageJson.version) + }), + new MiniCssExtractPlugin({ + filename: isProductionBuild ? "[name].min.css" : "[name].css" + }), + new webpack.BannerPlugin({ + banner: banner + }) + ] + }; + + if (isProductionBuild) { + config.plugins.push = config.plugins.concat([]); + } else { + config.devtool = "source-map"; + config.plugins = config.plugins.concat([ + new webpack.LoaderOptionsPlugin({ debug: true }), + new HtmlWebpackPlugin({ + filename: "index.html", + inject: "body", + template: "src/index.html" + }), + ]); + config.devServer = { + static: { + directory: path.join(__dirname, "."), + }, + compress: false, + port: 8085 + }; + } + + return config; +}; diff --git a/packages/survey-creator-core/junit.presets.xml b/packages/survey-creator-core/junit.presets.xml new file mode 100644 index 0000000000..be0c770eba --- /dev/null +++ b/packages/survey-creator-core/junit.presets.xml @@ -0,0 +1,24 @@ + + + + + + + + TypeError: Cannot read properties of undefined (reading 'actions') + at CreatorPresetEditorModelTester.Object.<anonymous>.CreatorPresetEditorModelTester.getRowContextActions (C:\Projects\surveyjs\survey-creator\packages\survey-creator-core\tests-presets\presets-editor-item-menu.tests.ts:11:43) + at Object.<anonymous> (C:\Projects\surveyjs\survey-creator\packages\survey-creator-core\tests-presets\presets-editor-item-menu.tests.ts:81:26) + at Promise.then.completed (C:\Projects\surveyjs\survey-creator\packages\survey-creator-core\node_modules\jest-circus\build\utils.js:298:28) + at new Promise (<anonymous>) + at callAsyncCircusFn (C:\Projects\surveyjs\survey-creator\packages\survey-creator-core\node_modules\jest-circus\build\utils.js:231:10) + at _callCircusTest (C:\Projects\surveyjs\survey-creator\packages\survey-creator-core\node_modules\jest-circus\build\run.js:316:40) + at _runTest (C:\Projects\surveyjs\survey-creator\packages\survey-creator-core\node_modules\jest-circus\build\run.js:252:3) + at _runTestsForDescribeBlock (C:\Projects\surveyjs\survey-creator\packages\survey-creator-core\node_modules\jest-circus\build\run.js:126:9) + at run (C:\Projects\surveyjs\survey-creator\packages\survey-creator-core\node_modules\jest-circus\build\run.js:71:3) + at runAndTransformResultsToJestFormat (C:\Projects\surveyjs\survey-creator\packages\survey-creator-core\node_modules\jest-circus\build\legacy-code-todo-rewrite\jestAdapterInit.js:122:21) + at jestAdapter (C:\Projects\surveyjs\survey-creator\packages\survey-creator-core\node_modules\jest-circus\build\legacy-code-todo-rewrite\jestAdapter.js:79:19) + at runTestInternal (C:\Projects\surveyjs\survey-creator\packages\survey-creator-core\node_modules\jest-runner\build\runTest.js:367:16) + at runTest (C:\Projects\surveyjs\survey-creator\packages\survey-creator-core\node_modules\jest-runner\build\runTest.js:444:34) + + + \ No newline at end of file diff --git a/packages/survey-creator-vue/package.json b/packages/survey-creator-vue/package.json index b308686fca..17eab68b9a 100644 --- a/packages/survey-creator-vue/package.json +++ b/packages/survey-creator-vue/package.json @@ -12,6 +12,8 @@ "build:example:prod": "npm run build --prefix ./example", "build": "vite build && npm run build:types", "build:dev": "vite build --mode development", + "build:presets": "vite build --config vite.presets.config.ts", + "watch:presets": "vite build --config vite.presets.config.ts --watch", "build:types": "vue-tsc --project tsconfig.types.json --emitDeclarationOnly", "type-check": "vue-tsc --project tsconfig.types.json --noEmit", "test": "vitest --no-threads tests/test.spec.ts", diff --git a/packages/survey-creator-vue/src/entries/presets.ts b/packages/survey-creator-vue/src/entries/presets.ts new file mode 100644 index 0000000000..1b809b9d80 --- /dev/null +++ b/packages/survey-creator-vue/src/entries/presets.ts @@ -0,0 +1,2 @@ +export * from "../presets"; +import "../presets/register"; diff --git a/packages/survey-creator-vue/src/presets/Presets.vue b/packages/survey-creator-vue/src/presets/Presets.vue new file mode 100644 index 0000000000..77b71f2f9f --- /dev/null +++ b/packages/survey-creator-vue/src/presets/Presets.vue @@ -0,0 +1,29 @@ + + + diff --git a/packages/survey-creator-vue/src/presets/PresetsIconItem.vue b/packages/survey-creator-vue/src/presets/PresetsIconItem.vue new file mode 100644 index 0000000000..d301651bee --- /dev/null +++ b/packages/survey-creator-vue/src/presets/PresetsIconItem.vue @@ -0,0 +1,20 @@ + + + diff --git a/packages/survey-creator-vue/src/presets/PresetsPropertyGrid.vue b/packages/survey-creator-vue/src/presets/PresetsPropertyGrid.vue new file mode 100644 index 0000000000..6d099a14b2 --- /dev/null +++ b/packages/survey-creator-vue/src/presets/PresetsPropertyGrid.vue @@ -0,0 +1,37 @@ + + + diff --git a/packages/survey-creator-vue/src/presets/index.ts b/packages/survey-creator-vue/src/presets/index.ts new file mode 100644 index 0000000000..b838a7e0d2 --- /dev/null +++ b/packages/survey-creator-vue/src/presets/index.ts @@ -0,0 +1,4 @@ +export { default as TabPresetsComponent } from "./Presets.vue"; +export { default as PresetsPropertyGridComponent } from "./PresetsPropertyGrid.vue"; +export { default as PresetsIconItemComponent } from "./PresetsIconItem.vue"; +export { default as PresetsComponent } from "./Presets.vue"; diff --git a/packages/survey-creator-vue/src/presets/register.ts b/packages/survey-creator-vue/src/presets/register.ts new file mode 100644 index 0000000000..9aad17409d --- /dev/null +++ b/packages/survey-creator-vue/src/presets/register.ts @@ -0,0 +1,11 @@ +import { ComponentFactory } from "survey-vue3-ui"; + +// Import presets components +import TabPresets from "./Presets.vue"; +import PresetsIconItem from "./PresetsIconItem.vue"; +import PresetsPropertyGrid from "./PresetsPropertyGrid.vue"; + +// Register presets components +ComponentFactory.Instance.registerComponent("svc-tab-presets", TabPresets); +ComponentFactory.Instance.registerComponent("svc-presets-icon-item", PresetsIconItem); +ComponentFactory.Instance.registerComponent("svc-presets-property-grid", PresetsPropertyGrid); diff --git a/packages/survey-creator-vue/tsconfig.presets.json b/packages/survey-creator-vue/tsconfig.presets.json new file mode 100644 index 0000000000..ff158fd4c8 --- /dev/null +++ b/packages/survey-creator-vue/tsconfig.presets.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "paths": { + "survey-creator-core": [ + "./build" + ] + } + }, + "include": [ + "./src/entries/presets.ts" + ] +} \ No newline at end of file diff --git a/packages/survey-creator-vue/vite.presets.config.ts b/packages/survey-creator-vue/vite.presets.config.ts new file mode 100644 index 0000000000..911e9448a7 --- /dev/null +++ b/packages/survey-creator-vue/vite.presets.config.ts @@ -0,0 +1,87 @@ +import { resolve } from "node:path"; +import { defineConfig } from "vite"; +import vue from "@vitejs/plugin-vue"; +import copy from "rollup-plugin-copy"; +import generatePackageJson from "rollup-plugin-generate-package-json"; + +const packageJson = require("./package.json"); + +const libraryName = "survey-creator-vue-presets"; + +export default defineConfig(({ mode }) => { + return { + plugins: [vue()], + + build: { + emptyOutDir: false, + sourcemap: mode == "development", + outDir: "./build", + lib: { + // Set the entry point for presets + entry: resolve(__dirname, "src/entries/presets.ts"), + // Name of the library. + name: "SurveyCreatorVuePresets", + // Generate preset files + fileName: (format) => { + if (format === "es") return `${libraryName}.es.js`; + if (format === "cjs") return `${libraryName}.cjs.js`; + return `${libraryName}.js`; + }, + }, + rollupOptions: { + // External dependencies + external: [ + "vue", + "survey-core", + "survey-creator-core", + "survey-creator-core-presets", + "survey-vue3-ui", + "survey-creator-vue", + ], + + plugins: [ + copy({ + hook: "writeBundle", + targets: [{ src: "./README.md", dest: "./build" }], + }), + generatePackageJson({ + inputFolder: "publish", + outputFolder: "./build", + baseContents: { + name: libraryName, + version: packageJson.version, + main: `${libraryName}.cjs.js`, + module: `${libraryName}.es.js`, + esm: `${libraryName}.es.js`, + type: "module", + peerDependencies: { + vue: "^3.0.0", + "survey-core": "^1.0.0", + "survey-creator-core": "^1.0.0", + "survey-creator-core-presets": "^1.0.0", + "survey-vue3-ui": "^1.0.0", + "survey-creator-vue": "^1.0.0" + } + }, + }), + ], + output: { + globals: { + vue: "Vue", + "survey-core": "Survey", + "survey-creator-core": "SurveyCreatorCore", + "survey-creator-core-presets": "SurveyCreatorCorePresets", + "survey-vue3-ui": "SurveyVue3", + "survey-creator-vue": "SurveyCreatorVue", + }, + }, + }, + }, + resolve: { + dedupe: ["survey-core", "vue"], + alias: { + "@": resolve(__dirname, "src"), + }, + }, + }; +}); From 1354e7ee88d0d401e98bbb549233bfd123acb119 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 3 Oct 2025 14:01:00 +0300 Subject: [PATCH 159/240] #7004 - vue build --- packages/survey-creator-angular/package.json | 2 +- packages/survey-creator-vue/package.json | 4 +- packages/survey-creator-vue/src/App.vue | 2 +- .../survey-creator-vue/src/entries/presets.ts | 2 +- .../survey-creator-vue/src/presets/index.ts | 24 ++++++++++-- .../src/presets/register.ts | 11 ------ .../tsconfig.types.presets.json | 38 +++++++++++++++++++ .../survey-creator-vue/vite.presets.config.ts | 1 + 8 files changed, 65 insertions(+), 19 deletions(-) delete mode 100644 packages/survey-creator-vue/src/presets/register.ts create mode 100644 packages/survey-creator-vue/tsconfig.types.presets.json diff --git a/packages/survey-creator-angular/package.json b/packages/survey-creator-angular/package.json index 2f317c753e..8e3f36c1df 100644 --- a/packages/survey-creator-angular/package.json +++ b/packages/survey-creator-angular/package.json @@ -104,4 +104,4 @@ "test:scr": "playwright test --project scr --ui", "test:scr:ci": "playwright test --project scr" } -} +} \ No newline at end of file diff --git a/packages/survey-creator-vue/package.json b/packages/survey-creator-vue/package.json index 17eab68b9a..f0ad519b24 100644 --- a/packages/survey-creator-vue/package.json +++ b/packages/survey-creator-vue/package.json @@ -12,9 +12,11 @@ "build:example:prod": "npm run build --prefix ./example", "build": "vite build && npm run build:types", "build:dev": "vite build --mode development", - "build:presets": "vite build --config vite.presets.config.ts", + "build:presets": "vite build --config vite.presets.config.ts && npm run build:types:presets", + "build:presets:dev": "vite build --config vite.presets.config.ts --mode development && npm run build:types:presets", "watch:presets": "vite build --config vite.presets.config.ts --watch", "build:types": "vue-tsc --project tsconfig.types.json --emitDeclarationOnly", + "build:types:presets": "vue-tsc --project tsconfig.types.presets.json --emitDeclarationOnly && node -e \"require('fs').writeFileSync('./build/types/presets/index.d.ts', 'export * from \\\"./src/presets\\\";')\"", "type-check": "vue-tsc --project tsconfig.types.json --noEmit", "test": "vitest --no-threads tests/test.spec.ts", "test:single": "vitest --no-watch --no-threads tests/test.spec.ts", diff --git a/packages/survey-creator-vue/src/App.vue b/packages/survey-creator-vue/src/App.vue index bd0c240493..6870752273 100644 --- a/packages/survey-creator-vue/src/App.vue +++ b/packages/survey-creator-vue/src/App.vue @@ -1,7 +1,7 @@ diff --git a/packages/survey-creator-vue/src/presets/Presets.vue b/packages/survey-creator-vue/src/presets/Presets.vue index 77b71f2f9f..177c85719b 100644 --- a/packages/survey-creator-vue/src/presets/Presets.vue +++ b/packages/survey-creator-vue/src/presets/Presets.vue @@ -18,12 +18,12 @@ import { useBase } from "survey-vue3-ui"; import { computed } from "vue"; const props = defineProps<{ - data: any; - creator: SurveyCreatorModel; + model: any; + data: SurveyCreatorModel; }>(); -const model = computed(() => props.data?.model); -const creator = computed(() => props.creator); +const model = computed(() => props.model?.model); +const creator = computed(() => props.data); useBase(() => model.value); diff --git a/packages/survey-creator-vue/src/presets/PresetsPropertyGrid.vue b/packages/survey-creator-vue/src/presets/PresetsPropertyGrid.vue index 6d099a14b2..f4df08e5a2 100644 --- a/packages/survey-creator-vue/src/presets/PresetsPropertyGrid.vue +++ b/packages/survey-creator-vue/src/presets/PresetsPropertyGrid.vue @@ -1,26 +1,24 @@ From dcbe53a1ad18bbcfca141360d618649e947165ac Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 7 Oct 2025 18:38:17 +0300 Subject: [PATCH 172/240] #7004 - fix angular build --- .../survey-creator-angular/presets/src/presets.component.html | 2 +- .../src/side-bar/tab-control.component.html | 2 +- packages/survey-creator-core/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/survey-creator-angular/presets/src/presets.component.html b/packages/survey-creator-angular/presets/src/presets.component.html index 40026861b7..62caaabad0 100644 --- a/packages/survey-creator-angular/presets/src/presets.component.html +++ b/packages/survey-creator-angular/presets/src/presets.component.html @@ -4,7 +4,7 @@
- +
diff --git a/packages/survey-creator-angular/src/side-bar/tab-control.component.html b/packages/survey-creator-angular/src/side-bar/tab-control.component.html index 1a786ac866..f0d33513e3 100644 --- a/packages/survey-creator-angular/src/side-bar/tab-control.component.html +++ b/packages/survey-creator-angular/src/side-bar/tab-control.component.html @@ -15,7 +15,7 @@
- +
diff --git a/packages/survey-creator-core/package.json b/packages/survey-creator-core/package.json index 4957a457b0..f3014a8e27 100644 --- a/packages/survey-creator-core/package.json +++ b/packages/survey-creator-core/package.json @@ -11,7 +11,7 @@ "build": "webpack --env buildType=dev --env emitDeclarations --env emitStyles --env emitNonSourceFiles && webpack --env buildType=prod --env emitStyles && rollup -c", "build:i18n": "webpack --config ./webpack.i18n.js --env buildType=dev && webpack --config ./webpack.i18n.js --env buildType=prod && rollup -c rollup.i18n.config.js", "build:themes": "node creator-themes-import.js && webpack --config ./webpack.themes.config.js --env buildType=dev --env emitDeclarations && webpack --config ./webpack.themes.config.js --env buildType=prod && rollup -c rollup.themes.config.js", - "build:all": "npm run build && npm run build:i18n && npm run build:themes", + "build:all": "npm run build && npm run build:i18n && npm run build:themes && npm run build:presets", "build:presets": "webpack --config ./webpack.presets.config.js --env buildType=dev --env emitDeclarations && webpack --config ./webpack.presets.config.js --env buildType=prod && rollup -c rollup.presets.config.js --bundleConfigAsCjs", "watch:presets": "webpack --config ./webpack.presets.config.js --watch --env buildType=dev --env emitDeclarations && webpack --config ./webpack.presets.config.js --env buildType=prod && rollup -c rollup.presets.config.js --bundleConfigAsCjs", "test": "jest", From 455c53b7681bd227d2925abaab81fd8d5bae9bd3 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 7 Oct 2025 19:04:32 +0300 Subject: [PATCH 173/240] #7004 - fix some css --- .../src/presets/presets-theme/blocks/sps-matrixdynamic.scss | 1 + .../src/presets/presets-theme/blocks/sps-question.scss | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss index 8c37dc95ff..89ade5e780 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-matrixdynamic.scss @@ -119,6 +119,7 @@ margin: 0 calc(-1 * var(--sjs2-spacing-x150, 12px)) var(--sjs2-spacing-x150, 12px); padding: 0 var(--sjs2-spacing-x150, 12px) var(--sjs2-spacing-x150, 12px); border-bottom: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #d4d4d4); + display: flex; } .sps-table-wrapper ~ .sps-matrixdynamic__footer { border-bottom: none; diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss index 1ab3893303..d497258a45 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-question.scss @@ -33,7 +33,7 @@ padding: var(--sjs2-spacing-x150, 12px) var(--sjs2-spacing-x250, 20px) var(--sjs2-spacing-x250, 20px) var(--sjs2-spacing-x250, 20px); flex-direction: column; - align-items: flex-start; + align-items: stretch; align-self: stretch; } From 5d2bc4d51618f826185ee04b738927e8e9917f76 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 7 Oct 2025 19:15:18 +0300 Subject: [PATCH 174/240] #7004 - fix lint --- packages/survey-creator-vue/src/presets/Presets.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/survey-creator-vue/src/presets/Presets.vue b/packages/survey-creator-vue/src/presets/Presets.vue index b2b8a00027..ea217a8fcf 100644 --- a/packages/survey-creator-vue/src/presets/Presets.vue +++ b/packages/survey-creator-vue/src/presets/Presets.vue @@ -13,7 +13,6 @@ - + - + From c4f57050985c1eb920b19cf84cc419ae0416eba9 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 9 Oct 2025 13:10:52 +0300 Subject: [PATCH 179/240] #7004 title in dialogs --- .../src/presets/localization/english.ts | 4 +++- .../src/presets/presets-editable-base.ts | 5 +++-- .../src/presets/presets-editable-categorized.ts | 1 + .../src/presets/presets-editable-list.ts | 7 +++++-- .../src/presets/presets-editable-toolbox.ts | 3 ++- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/survey-creator-core/src/presets/localization/english.ts b/packages/survey-creator-core/src/presets/localization/english.ts index 0d2d5eb362..f8558fce4b 100644 --- a/packages/survey-creator-core/src/presets/localization/english.ts +++ b/packages/survey-creator-core/src/presets/localization/english.ts @@ -50,7 +50,9 @@ export const enStrings = { addCustomItem: "Add Custom Item", addNewItem: "Add a new item", addNewSubitem: "Add a new subitem", - noRowsText: "There are no items" + noRowsText: "There are no items", + newItem: "New item in", + newCategory: "New category in", }, propertyGrid: { title: "Customize the Property Grid", diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index 2061d2648f..f96186e14a 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -25,6 +25,7 @@ export class CreatorPresetEditableBase { } public get pageName(): string { return "page_" + this.fullPath; } public getPageTitle(model: SurveyModel): string { return model.getPageByName(this.pageName).title; } + public getPageShortTitle(model: SurveyModel): string { return model.getPageByName(this.pageName).navigationTitle; } protected get mainPanelName() { return this.path + "_mainPanel"; } public getMainElementNames() : any { return [this.mainPanelName]; } public getMainPanelName() : any { return this.mainPanelName; } @@ -180,7 +181,7 @@ export class CreatorPresetEditableBase { return Helpers.getUnbindValue(json); } - protected showDetailPanelInPopup(matrix: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, rootElement: HTMLElement, options: {actions?: IAction[]}) { + protected showDetailPanelInPopup(matrix: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, rootElement: HTMLElement, options: {actions?: IAction[], title?: string}) { const data = matrix.value[(matrix.visibleRows as any).findIndex(r => r === row)]; const survey = new SurveyModel({ elements: matrix.toJSON().detailElements }); survey.fitToContainer = false; @@ -207,7 +208,7 @@ export class CreatorPresetEditableBase { return true; }, cssClass: "sps-popup svc-property-editor svc-creator-popup", - title: getLocString("presets.editor.edit"), + title: options.title || getLocString("presets.editor.edit"), displayMode: "popup" }, rootElement); if (survey.getAllQuestions().filter(q => !q.startWithNewLine).length > 0) { diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 25c35cf0b2..518bb4c166 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -264,6 +264,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre super.onMatrixRowAdded(model, creator, options); if (options.question.name == this.nameCategories) { this.setDefaultValueForRow(model, options.question, options.row); + this.editItem(model, creator, options.question, options.row, { description: "xxx" }); } } } diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 63e7b2277b..34f25211fc 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -111,7 +111,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { }); } - private editItem(model: SurveyModel, creator: SurveyCreatorModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { + protected editItem(model: SurveyModel, creator: SurveyCreatorModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, options?: {description: string}) { let survey: SurveyModel; let resetAction; const itemKey = this.getMatrixKeyColumnName(question); @@ -129,7 +129,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { } }; resetAction = new Action(resetActionParams); - survey = this.showDetailPanelInPopup(question, row, model.rootElement, { actions: [resetAction] }); + survey = this.showDetailPanelInPopup(question, row, model.rootElement, { actions: [resetAction], title: options?.description }); resetAction.enabled = !Helpers.isTwoValueEquals(survey.data, this.getDefaultItem(question, survey.getValue(itemKey))); survey.onValueChanged.add(()=>resetAction.enabled = true); const keyQuestion = survey.getQuestionByName(itemKey); @@ -226,6 +226,9 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { public onMatrixRowAdded(model: SurveyModel, creator: SurveyCreatorModel, options: any) { if (this.isItemsMatrix(options.question.name)) { this.setDefaultValueForRow(model, options.question, options.row); + this.editItem(model, creator, options.question, options.row, { + description: getLocString("presets.toolbox.newItem") + " " + options.question.locTitle.renderedText + }); } } public onMatrixCellValueChanged(model: SurveyModel, creator: SurveyCreatorModel, options: any) { diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index f080106dc3..e119a0bc68 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -77,7 +77,8 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita addRowButtonLocation: "bottom", name: this.nameSubitems, valueName: "subitems", - titleLocation: "hidden", + titleLocation: "top", + title: "{row.title}", startWithNewLine: false }, false)); } From 96016c29ddcd6a45c994de9088756baf0ab3ce1b Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 9 Oct 2025 15:26:48 +0300 Subject: [PATCH 180/240] #7004 - fix new item creating and editing --- .../src/presets/presets-editable-categorized.ts | 4 +++- .../survey-creator-core/src/presets/presets-editable-list.ts | 2 +- .../src/presets/presets-editable-toolbox.ts | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 518bb4c166..8fceacc646 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -264,7 +264,9 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre super.onMatrixRowAdded(model, creator, options); if (options.question.name == this.nameCategories) { this.setDefaultValueForRow(model, options.question, options.row); - this.editItem(model, creator, options.question, options.row, { description: "xxx" }); + this.editItem(model, creator, options.question, options.row, { + description: getLocString("presets.toolbox.newCategory") + " " + this.getPageShortTitle(model) + }); } } } diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 34f25211fc..02a5e84bfe 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -227,7 +227,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { if (this.isItemsMatrix(options.question.name)) { this.setDefaultValueForRow(model, options.question, options.row); this.editItem(model, creator, options.question, options.row, { - description: getLocString("presets.toolbox.newItem") + " " + options.question.locTitle.renderedText + description: getLocString("presets.toolbox.newItem") + " " + (options.question.data?.value?.title || this.getPageShortTitle(model)) }); } } diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index e119a0bc68..deb7ce2afc 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -454,7 +454,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita // question.value = value; // } private updateItemsFromCategories(model: SurveyModel) { - this.getQuestionItems(model).value = this.getQuestionCategories(model).value.map(r => [...r.items]).flat(); + this.getQuestionItems(model).value = this.getQuestionCategories(model).value.map(r => [...(r.items || [])]).flat(); } private updateCategoriesFromItems(model: SurveyModel) { From 46cb0cf06900299f35bf5548c45c29876795599c Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 9 Oct 2025 15:54:34 +0300 Subject: [PATCH 181/240] #7004 - protect from undefined values --- .../survey-creator-core/src/presets/presets-editable-list.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 02a5e84bfe..795c18de4a 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -46,7 +46,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { if (!actions) return; const keyColumn = this.getMatrixKeyColumnName(question); if (!question.value) return; - const rowData = question.value.filter(r => row.value[keyColumn] == r[keyColumn])[0]; + const rowData = question.value.filter(r => row.value?.[keyColumn] == r?.[keyColumn])[0]; if (!rowData) return; actions.forEach(a => this.updateRowAction(question, rowData, keyColumn, a)); } From 32fdda9912318f29f88bbafbeb1b7891336f20bf Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 9 Oct 2025 16:30:30 +0300 Subject: [PATCH 182/240] #7004 - do not clear child items on reset from dialog --- .../src/presets/presets-editable-base.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index f96186e14a..9ccb4fbbcc 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -196,7 +196,13 @@ export class CreatorPresetEditableBase { onApply: () => { if (survey.validate()) { const newValue = [...matrix.value]; - const newRowValue = { ...row.value, ...survey.data }; + const newData: any = { }; + survey.getAllQuestions().forEach(q => { + if (q.visible) { + newData[q.name] = survey.data[q.name]; + } + }); + const newRowValue = { ...row.value, ...newData }; newValue[row.index] = newRowValue; matrix.value = newValue; return true; From 42f4fcd97e135be299a00ba8e4915f04798ac1e6 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 9 Oct 2025 16:40:11 +0300 Subject: [PATCH 183/240] #87004 - fix test --- .../tests-presets/presets-editor-item-menu.tests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts b/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts index aa3ffea182..6c937ad41e 100644 --- a/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts +++ b/packages/survey-creator-core/tests-presets/presets-editor-item-menu.tests.ts @@ -315,7 +315,7 @@ test("Preset edit (no categories), check categories context menu - check actions "move-as-subitem", ]); const subitemsAction = actions[2]; - expect(subitemsAction.items.map(a => a.id)).toEqual(["tosubitem-text", "tosubitem-comment", "tosubitem-multipletext", + expect(subitemsAction.items.map(a => a.id)).toEqual(["tosubitem-text", "tosubitem-multipletext", "tosubitem-panel", "tosubitem-paneldynamic"]); }); From a0147f18d4075318708e960426255bab885dffe2 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 13 Oct 2025 16:45:25 +0300 Subject: [PATCH 184/240] #7004 fixed unexpected property hiding --- .../presets/presets-editable-properties.ts | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 6ede707910..8da528d5d9 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -51,17 +51,16 @@ export class SurveyQuestionPresetPropertiesDetail { private properties: SurveyQuestionPresetProperties; private propertyGridValue: PropertyGridModel; private propertyGridDefaultValue: PropertyGridModel; - private allPropertiesNames: Array; private obj; constructor(private className: string, private currentJson: ISurveyPropertyGridDefinition) { const cls = {}; const obj = this.createObj(); this.obj = obj; this.properties = new SurveyQuestionPresetProperties(obj, className, currentJson); - this.allPropertiesNames = this.properties.getAllVisiblePropertiesNames(true); + const allPropertiesNames = this.properties.getAllVisiblePropertiesNames(true); const objProps = {}; Serializer.getPropertiesByObj(obj).forEach(prop => objProps[prop.name] = prop); - this.allPropertiesNames.forEach(name => { + allPropertiesNames.forEach(name => { const prop = objProps[name]; if (prop) { const propClassName = this.getPropClassName(prop); @@ -102,7 +101,6 @@ export class SurveyQuestionPresetPropertiesDetail { } return res; } - public getAllPropertiesNames(): Array { return this.allPropertiesNames; } public getInitialJson(useDefaults: boolean) { const pgJSON = (useDefaults ? this.propertyGridDefaultValue : this.propertyGridValue).survey.toJSON(); return pgJSON.pages.map(p => { @@ -318,7 +316,6 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare public getJsonValueCore(model: SurveyModel, creator: SurveyCreatorModel, defaultJson: any): any { if (!this.isModified) return undefined; - this.updateCurrentJson(model); return { definition: this.currentJson }; } @@ -375,6 +372,7 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare }); }); } + if (!this.firstTimeLoading)this.updateCurrentJson(model); } // if ((options.target)?.isQuestion) { // if (options.name === "title") { @@ -393,20 +391,20 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare if (name !== this.nameSelector) return; this.firstTimeLoading = true; - this.updateCurrentJson(model); if (this.currentProperties) { this.currentProperties = undefined; } const selQuestion = this.getSelector(model); this.currentClassName = selQuestion.value; - if (!this.currentClassName) return; - this.currentProperties = new SurveyQuestionPresetPropertiesDetail(this.currentClassName, this.currentJson); - this.setupDefaults(model); - this.propertyGridSetObj(this.currentProperties.getObj()); - const categories = this.currentProperties.getInitialJson(false); - model.setValue(this.nameCategories, categories); - const items = this.getCurrentlyHiddenItems(categories); - model.setValue(this.nameMatrix, items); + if (this.currentClassName) { + this.currentProperties = new SurveyQuestionPresetPropertiesDetail(this.currentClassName, this.currentJson); + this.setupDefaults(model); + this.propertyGridSetObj(this.currentProperties.getObj()); + const categories = this.currentProperties.getInitialJson(false); + model.setValue(this.nameCategories, categories); + const items = this.getCurrentlyHiddenItems(categories); + model.setValue(this.nameMatrix, items); + } this.firstTimeLoading = false; //this.propCreator.JSON = this.updateCreatorJSON(this.currentProperties.propertyGrid.survey.toJSON()); //this.setupCreatorToolbox(this.propCreator); From 74df1a64d7991581df143fa5c05b2b77015417cf Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 13 Oct 2025 17:20:17 +0300 Subject: [PATCH 185/240] #7004 - fixed pg context menu --- .../src/presets/presets-editable-categorized.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 8fceacc646..d65826c20e 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -93,7 +93,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre } if (!hasCategories) return actions; - const currentCategory = categories.filter(c => c.items.filter(i => i.name == row.value?.name).length > 0)[0]; + const currentCategory = categories.filter(c => c[this.nameInnerMatrix].filter(i => i.name == row.value?.name).length > 0)[0]; const moveToCategories = categories.filter((i: any) => i.category != currentCategory?.category).map((i: any) => new Action({ id: "to-" + i.category, title: i.title, From 3f313d57dc0bd12138c07d55e5d2c243dd706113 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 13 Oct 2025 21:39:54 +0300 Subject: [PATCH 186/240] #7004 - working on styles --- .../src/presets/localization/english.ts | 4 ++-- .../src/presets/presets-editable-categorized.ts | 1 + .../src/presets/presets-editable-toolbox.ts | 3 +-- .../src/presets/presets-theme/blocks/sps-action-bar.scss | 1 + .../src/presets/presets-theme/blocks/sps-panel.scss | 2 +- .../src/presets/presets-theme/blocks/sps-table.scss | 9 +++++---- .../src/presets/presets-theme/presets.scss | 9 ++++----- 7 files changed, 15 insertions(+), 14 deletions(-) diff --git a/packages/survey-creator-core/src/presets/localization/english.ts b/packages/survey-creator-core/src/presets/localization/english.ts index f8558fce4b..21f0d1fdb6 100644 --- a/packages/survey-creator-core/src/presets/localization/english.ts +++ b/packages/survey-creator-core/src/presets/localization/english.ts @@ -46,8 +46,8 @@ export const enStrings = { deleteCustomItem: "Delete Custom Item", removeFrom: "Remove from {0}", unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category", - addCustomItem: "Add Custom Item", + addCustomCategory: "New Category", + addCustomItem: "New Item", addNewItem: "Add a new item", addNewSubitem: "Add a new subitem", noRowsText: "There are no items", diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index d65826c20e..a9e8e9d6e2 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -114,6 +114,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre title: getLocString("presets.toolbox.moveToCategory") }); catGroup.setSubItems({ items: moveToCategories, cssClasses: listComponentCss }); + catGroup.markerIconName = "icon-chevronright-24x24"; actions.push(catGroup); } else { actions.push(...moveToCategories); diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index deb7ce2afc..3ba24a7209 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -77,8 +77,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita addRowButtonLocation: "bottom", name: this.nameSubitems, valueName: "subitems", - titleLocation: "top", - title: "{row.title}", + titleLocation: "hidden", startWithNewLine: false }, false)); } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss index dad3235036..815b3f9b0a 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-action-bar.scss @@ -103,6 +103,7 @@ background-color $creator-transition-duration, opacity $creator-transition-duration; + &.sps-action-button--pressed, &:hover, &:focus { opacity: 1; diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss index 07b0da6e3d..0eccdf2ce2 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-panel.scss @@ -19,7 +19,7 @@ position: relative; display: flex; flex-direction: row-reverse; - padding: var(--sjs2-spacing-x150, 12px); + padding: var(--sjs2-spacing-x150, 12px) var(--sjs2-spacing-x150, 12px) var(--sjs2-spacing-x150, 12px) var(--sjs2-spacing-x250, 20px); align-items: center; gap: var(--sjs2-spacing-x150, 12px); diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss index bda0104075..c58d01f76f 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-table.scss @@ -45,7 +45,6 @@ .sd-table__row--expanded { & > td { & > div { - background: var(--sjs2-color-bg-basic-primary-dim, rgba(28, 27, 32, 0.05)); .sps-input { @include sjs2--typography--default-strong; } @@ -76,12 +75,14 @@ padding-bottom: calc(var(--sjs2-spacing-x075, 6px) + var(--sjs2-spacing-x050, 4px)); padding-top: calc(var(--sjs2-spacing-x075, 6px) + var(--sjs2-spacing-x050, 4px)); border-top: var(--sjs2-border-width-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #d4d4d4); + &.sps-table__cell--detail-panel { + border-top: none; + padding: 0 0 var(--sjs2-spacing-x075, 6px) 0; + } } .sps-table__cell--detail-panel { - padding: 0 0 var(--sjs2-spacing-x075, 6px) 0; - border-top: none; - + .sps-panel__content { box-shadow: none; } diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index 366421949e..9867d506a2 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -46,13 +46,13 @@ } .sps-page__title { - color: var(--sjs2-color-fg-basic-primary, #1C1B20); + color: var(--sjs2-color-fg-basic-primary, #1c1b20); @include sjs2--typography--medium-strong; } .sps-page__description { - color: var(--sjs2-color-fg-basic-secondary, rgba(28, 27, 32, 0.60)); + color: var(--sjs2-color-fg-basic-secondary, rgba(28, 27, 32, 0.6)); @include sjs2--typography--default; @@ -61,7 +61,6 @@ .sps-action-title-bar { margin-inline-end: var(--ctr-data-table-border-width, var(--sjs-stroke-x1)); - padding-inline-end: var(--ctr-caption-with-actions-actionbar-padding-right, calcSize(0.5)); gap: var(--sjs2-spacing-x150, 12px); .sv-action--hidden { display: none; @@ -96,7 +95,7 @@ align-items: flex-start; gap: var(--sjs2-spacing-x075, 6px); align-self: stretch; - border-right: var(--sjs2-border-width-static-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #D4D4D4); + border-right: var(--sjs2-border-width-static-x100, 1px) solid var(--sjs2-color-border-basic-secondary, #d4d4d4); &:last-child { border: none; } @@ -105,4 +104,4 @@ .svc-tabbed-menu-item-container--presets { display: none; -} \ No newline at end of file +} From 0f42024ae918a0064bfae41384dbd72f5eb94426 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 13 Oct 2025 21:40:23 +0300 Subject: [PATCH 187/240] #7004 - add icons --- .../survey-creator-core/src/images-v2/chevronleft-24x24.svg | 3 +++ .../survey-creator-core/src/images-v2/chevronright-24x24.svg | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 packages/survey-creator-core/src/images-v2/chevronleft-24x24.svg create mode 100644 packages/survey-creator-core/src/images-v2/chevronright-24x24.svg diff --git a/packages/survey-creator-core/src/images-v2/chevronleft-24x24.svg b/packages/survey-creator-core/src/images-v2/chevronleft-24x24.svg new file mode 100644 index 0000000000..38cccb1220 --- /dev/null +++ b/packages/survey-creator-core/src/images-v2/chevronleft-24x24.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/packages/survey-creator-core/src/images-v2/chevronright-24x24.svg b/packages/survey-creator-core/src/images-v2/chevronright-24x24.svg new file mode 100644 index 0000000000..48ec2cc442 --- /dev/null +++ b/packages/survey-creator-core/src/images-v2/chevronright-24x24.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file From 1b7813040c2b0be90e4a401604eaec8c2a086330 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 14 Oct 2025 11:49:57 +0300 Subject: [PATCH 188/240] #7004 fixed icons --- .../src/presets/presets-editable-categorized.ts | 8 ++++++-- .../src/presets/presets-editable-toolbox.ts | 4 ++-- .../src/presets/presets-theme/blocks/sps-list.scss | 4 ++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index a9e8e9d6e2..0a18dba37b 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -56,6 +56,11 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre return true; } + protected setSubitemsToAction(action: Action, items: Action[]) { + action.setSubItems({ items: items, cssClasses: listComponentCss }); + action.markerIconName = "icon-chevronright-24x24"; + } + protected getItemMenuActionsCore(model: SurveyModel, question: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel) { const categories = this.getQuestionCategories(model).value; const actions = [] as IAction[]; @@ -113,8 +118,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre id: "move-to-categories", title: getLocString("presets.toolbox.moveToCategory") }); - catGroup.setSubItems({ items: moveToCategories, cssClasses: listComponentCss }); - catGroup.markerIconName = "icon-chevronright-24x24"; + this.setSubitemsToAction(catGroup, moveToCategories); actions.push(catGroup); } else { actions.push(...moveToCategories); diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 3ba24a7209..af6d4b0a66 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -241,7 +241,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita this.moveToSubitems(model, question, row, i.name, true); } })); - catAction.setSubItems({ items: itemsActions, cssClasses: listComponentCss }); + this.setSubitemsToAction(catAction, itemsActions); } return catAction; } @@ -278,7 +278,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita id: "move-as-subitem", title: getLocString("presets.toolbox.moveAsSubitem") }); - subitemsAction.setSubItems({ items: subItems, cssClasses: listComponentCss }); + this.setSubitemsToAction(subitemsAction, subItems); actions.push(subitemsAction); } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss index 44dcacbcdf..296b63a175 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss @@ -115,8 +115,8 @@ display: flex; padding: 0; align-items: flex-start; - width: 16px; - height: 16px; + width: 24px; + height: 24px; box-sizing: content-box; justify-content: center; From b39362ab8ec9f247fc68acc57294f70871ef72f7 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 14 Oct 2025 16:54:22 +0300 Subject: [PATCH 189/240] #7004 - fixed styles --- .../src/presets/localization/english.ts | 6 +++++- .../presets/presets-editable-categorized.ts | 1 + .../src/presets/presets-editable-toolbox.ts | 3 ++- .../src/presets/presets-plugin.ts | 14 +++++++++---- .../presets-theme/blocks/sps-list.scss | 21 +++++++++++++++---- .../presets-theme/blocks/sps-popup.scss | 11 +++++++++- .../src/presets/presets-theme/presets.ts | 7 +++++++ 7 files changed, 52 insertions(+), 11 deletions(-) diff --git a/packages/survey-creator-core/src/presets/localization/english.ts b/packages/survey-creator-core/src/presets/localization/english.ts index 21f0d1fdb6..159adfc94c 100644 --- a/packages/survey-creator-core/src/presets/localization/english.ts +++ b/packages/survey-creator-core/src/presets/localization/english.ts @@ -37,7 +37,7 @@ export const enStrings = { jsonObject: "JSON object to apply when users select this toolbox item", subcategories: "Subcategories", convertToSubcategory: "Convert to subcategory...", - moveAsSubitem: "Move as subitem", + moveAsSubitem: "Move as a subitem to...", moveTo: "Move To...", addToToolbox: "Add to Toolbox", categories_label: "Categories", @@ -78,6 +78,7 @@ export const enStrings = { load: "Load", saveExit: "Save & Exit", back: "Back", + resetToDefault: "Reset to default", resetToDefaults: "All settings restored to default", resoredToDefault: "resored to default", itemRestoredToDefault: "Item restored to default", @@ -98,9 +99,12 @@ preset.apply(creator);` }, plugin: { presetsTab: "Presets", + creatorPresets: "Ctreator Presets", save: "Save & Exit", + file: "File", import: "Import", export: "Export", + edit: "Edit", resetLanguages: "Reset Languages to default", resetAll: "Reset all changes", resetToDefaults: "Reset {0} to defaults" diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index 0a18dba37b..bdef753119 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -144,6 +144,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre new Action({ id: "remove-custom-item", title: getLocString("presets.toolbox.deleteCustomItem"), + css: "sps-list__item--alert", needSeparator: true, action: () => { this.ejectRowData(question, row, true); diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index af6d4b0a66..367af514f9 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -276,7 +276,8 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita } const subitemsAction = new Action({ id: "move-as-subitem", - title: getLocString("presets.toolbox.moveAsSubitem") + title: getLocString("presets.toolbox.moveAsSubitem"), + needSeparator: true }); this.setSubitemsToAction(subitemsAction, subItems); actions.push(subitemsAction); diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 955f81bbc8..8ad4c3e2c5 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -50,11 +50,13 @@ export class TabPresetsPlugin implements ICreatorPlugin { const presets = this.model?.model.pages.map(p => { id: p.name, title: p.navigationTitle }); const tools = [ - { id: "save", title: getLocString("presets.plugin.save"), css: "sps-list__item--positive", markerIconName: "check-24x24", needSeparator: true, action: () => this.hidePresets() }, + { id: "save", title: getLocString("presets.plugin.save"), markerIconName: "check-24x24", needSeparator: true, action: () => this.hidePresets() }, + { id: "file", title: getLocString("presets.plugin.file"), needSeparator: true, css: "sps-list__item--label", enabled: false }, { id: "import", title: getLocString("presets.plugin.import"), markerIconName: "import-24x24", action: () => { this.model?.loadJsonFile(); } }, { id: "export", title: getLocString("presets.plugin.export"), markerIconName: "download-24x24", action: () => { this.model?.downloadJsonFile(); } }, - { id: "reset-current", title: getLocString("presets.plugin.resetLanguages"), needSeparator: true, action: () => { this.model?.resetToDefaults("page_languages"); } }, - { id: "reset", title: getLocString("presets.plugin.resetAll"), action: () => { this.model?.resetToDefaults(); } }, + { id: "edit", title: getLocString("presets.plugin.edit"), needSeparator: true, css: "sps-list__item--label", enabled: false }, + { id: "reset-current", title: getLocString("presets.plugin.resetLanguages"), action: () => { this.model?.resetToDefaults("page_languages"); } }, + { id: "reset", title: getLocString("presets.plugin.resetAll"), css: "sps-list__item--alert", action: () => { this.model?.resetToDefaults(); } }, ]; let settingsAction; let presetsList; @@ -76,10 +78,14 @@ export class TabPresetsPlugin implements ICreatorPlugin { } } }, { - items: [...presets, ...tools], + items: [ + { id: "creator-presets", title: getLocString("presets.plugin.creatorPresets"), css: "sps-list__item--label", enabled: false }, + ...presets, + ...tools], showPointer: false, verticalPosition: "top", horizontalPosition: "center", + searchEnabled: false, cssClass: "sps-popup-menu sps-popup-menu--always-on-top", cssClasses: listComponentCss, onHide: () => { settingsAction.iconName = "navmenu-24x24"; }, diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss index 296b63a175..7be9ad8fab 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-list.scss @@ -4,10 +4,9 @@ .sps-list { width: 100%; display: flex; - padding: var(--sjs2-spacing-x150, 12px); + padding: var(--sjs2-spacing-x100, 8px); flex-direction: column; align-items: flex-start; - gap: var(--sjs2-spacing-x050, 4px); align-self: stretch; margin: 0; overflow-y: auto; @@ -31,6 +30,12 @@ } } +.sps-list__item--alert { + .sps-list__item-body { + color: var(--sjs2-color-fg-alert-primary, #C30935); + } +} + .sps-list__item-body { @include textEllipsis; @include sjs2--typography--default; @@ -66,7 +71,7 @@ opacity: 1; .sps-list__item-body { display: flex; - padding: var(--sjs2-spacing-x050, 4px) var(--sjs2-spacing-x100, 8px) var(--sjs2-spacing-x000, 0) var(--sjs2-spacing-x150, 12px); + padding: var(--sjs2-spacing-x100, 8px) var(--sjs2-spacing-x100, 8px) var(--sjs2-spacing-x050, 4px) var(--sjs2-spacing-x150, 12px); align-items: center; gap: 8px; align-self: stretch; @@ -76,6 +81,7 @@ @include sjs2--typography--small-strong; } + padding-bottom: var(--sjs2-spacing-x050, 4px); } .sps-list__item--group { @@ -93,6 +99,13 @@ } } +.sps-list__item--alert:focus, +.sps-list__item--alert:hover { + & > .sps-list__item-body { + background: var(--sjs2-color-bg-alert-tertiary-dim, rgba(229, 10, 62, 0.10)); + } +} + .sps-list__item--selected, .sps-list__item--selected:hover, .sps-list__item--selected:focus, @@ -107,7 +120,7 @@ .sps-list__item-separator { width: calc(100% + var(--sjs2-spacing-x150, 12px)); height: var(--sjs2-border-width-x100, 1px); - margin: 0 calc(-1 * var(--sjs2-spacing-x150, 12px)) var(--sjs2-spacing-x050, 4px); + margin: var(--sjs2-spacing-x100, 8px) calc(-1 * var(--sjs2-spacing-x150, 12px)); background: var(--sjs2-color-border-basic-secondary, #d4d4d4); } diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss index f04840d34f..3efd74a28b 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss @@ -8,7 +8,9 @@ } .sv-popup__container { border: initial; - padding: var(--sjs2-spacing-x150, 12px); + padding: 0 var(--sjs2-spacing-x150, 12px); + margin: -13px 0; + box-shadow: initial; background: initial; box-sizing: border-box; @@ -59,6 +61,13 @@ padding-right: 0; padding-top: 0; } + + .sps-question__title { + color: var(--sjs2-color-fg-basic-secondary, rgba(28, 27, 32, 0.6)); + + @include sjs2--typography--default; + } + .sps-question__content { padding-left: 0; padding-right: 0; diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.ts b/packages/survey-creator-core/src/presets/presets-theme/presets.ts index 4c03ff8ba2..62499166c8 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.ts +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.ts @@ -180,6 +180,13 @@ export var presetsCss = { remainingCharacterCounter: "sps-remaining-character-counter", onError: "sps-input--error" }, + comment: { + root: "sps-input sps-comment", + content: "sps-question__content sps-comment__content", + remainingCharacterCounter: "sps-remaining-character-counter", + small: "sps-row__question--small", + onError: "sps-input--error" + }, dropdown: { root: "sps-selectbase", popup: "sps-dropdown-popup svc-creator-popup", From 2644decb16358c96bc8305a89c171c62a4a7860a Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Tue, 14 Oct 2025 17:58:23 +0300 Subject: [PATCH 190/240] #7004 - fix presets indexing --- packages/survey-creator-core/src/presets/presets-plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-plugin.ts b/packages/survey-creator-core/src/presets/presets-plugin.ts index 8ad4c3e2c5..b512cad2a9 100644 --- a/packages/survey-creator-core/src/presets/presets-plugin.ts +++ b/packages/survey-creator-core/src/presets/presets-plugin.ts @@ -98,7 +98,7 @@ export class TabPresetsPlugin implements ICreatorPlugin { const resetCurrentAction = presetsList.getActionById("reset-current"); presetsList.selectedItem = presetsList.actions[0]; this.model.model.onCurrentPageChanged.add((_, options) => { - presetsList.selectedItem = presetsList.actions[this.model.model.currentPageNo]; + presetsList.selectedItem = presetsList.actions[this.model.model.currentPageNo + 1]; resetCurrentAction.title = getLocString("presets.plugin.resetToDefaults").replace("{0}", this.model.model.currentPage.navigationTitle); resetCurrentAction.action = () => { this.model?.resetToDefaults(presetsList.selectedItem.id); }; }); From 5a7393308d83ca1e48086bce942613573826d597 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 15 Oct 2025 09:21:07 +0300 Subject: [PATCH 191/240] #7004 css - fill the area --- .../src/presets/presets-theme/presets.scss | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index 9867d506a2..0ef4337405 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -25,6 +25,16 @@ display: flex; flex-direction: column; @include sjs2--typography--default; + + :has(.sps-page) { + height: 0; + flex-grow: 1; + display: flex; + flex-direction: column; + &.sv-components-column--expandable { + min-width: 100%; + } + } } .sps-container { From 5fffc3fd01cf9b1d843e52087899a228f6d22d4b Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 15 Oct 2025 11:44:20 +0300 Subject: [PATCH 192/240] #7004 - switch off title actions responsivity --- packages/survey-creator-core/src/presets/presets-editor.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/survey-creator-core/src/presets/presets-editor.ts b/packages/survey-creator-core/src/presets/presets-editor.ts index a2a6e3d9d0..6eda3efeae 100644 --- a/packages/survey-creator-core/src/presets/presets-editor.ts +++ b/packages/survey-creator-core/src/presets/presets-editor.ts @@ -148,6 +148,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit model.onGetQuestionTitleActions.add((_, options) => { editablePresets.forEach(item => { if (options.question.name == item.getNavigationElementName()) { + options.question.getTitleToolbar().isResponsivenessDisabled = true; options.actions = model.navigationBar.actions; } }); @@ -155,6 +156,7 @@ export class CreatorPresetEditorModel extends Base implements ICreatorPresetEdit model.onGetPanelTitleActions.add((_, options) => { editablePresets.forEach(item => { if (options.panel.name == item.getNavigationElementName()) { + options.panel.getTitleToolbar().isResponsivenessDisabled = true; options.actions = model.navigationBar.actions; } }); From 6c88540b4c871d3126afbc3cc499f41482c309ea Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 15 Oct 2025 11:47:09 +0300 Subject: [PATCH 193/240] #7004 - fixed language to default --- .../src/presets/presets-editable-languages.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-languages.ts b/packages/survey-creator-core/src/presets/presets-editable-languages.ts index 592c642a79..3bc0d84046 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-languages.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-languages.ts @@ -106,7 +106,7 @@ export class CreatorPresetEditableLanguages extends CreatorPresetEditableBase { private get surveyUseEnglishNames(): string { return this.path + "_surveyUseEnglishNames"; } public get questionNames() { - return [this.surveyLocalesName, this.surveyUseEnglishNames]; + return [this.creatorLocaleName, this.surveyLocalesName, this.surveyUseEnglishNames]; } private getIsShowInEnglishSelected(model: SurveyModel): boolean { return model.getValue(this.surveyUseEnglishNames) === true; } private getCreatorLocales(): Array { From 877a7bea32fc417c1c1f4bdb99d96c7074ffa622 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 15 Oct 2025 13:58:25 +0300 Subject: [PATCH 194/240] #7004 -fixed some constants --- .../src/presets/localization/english.ts | 36 +++++++++++++------ .../presets/presets-editable-categorized.ts | 16 +++++---- .../src/presets/presets-editable-list.ts | 9 +++-- .../src/presets/presets-editable-tabs.ts | 2 +- 4 files changed, 42 insertions(+), 21 deletions(-) diff --git a/packages/survey-creator-core/src/presets/localization/english.ts b/packages/survey-creator-core/src/presets/localization/english.ts index 159adfc94c..756852e7e7 100644 --- a/packages/survey-creator-core/src/presets/localization/english.ts +++ b/packages/survey-creator-core/src/presets/localization/english.ts @@ -13,8 +13,8 @@ export const enStrings = { title: "Configure tabs", navigationTitle: "Tabs", description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - tabs: "Tabs", - unsortedItems: "Unsorted items", + items: "Visible tabs", + unsortedItems: "Hidden tabs", defaultTab: "Default tab", unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", name: "Name", @@ -27,7 +27,7 @@ export const enStrings = { description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", toolbox: "Toolbox", categories: "Categories", - unsortedItems: "Unsorted items", + unsortedItems: "Hidden toolbox items", enableGrouping: "Enable grouping", showCategoryTitles: "Show category titles", categoryName: "Name", @@ -36,15 +36,10 @@ export const enStrings = { iconName: "Icon name", jsonObject: "JSON object to apply when users select this toolbox item", subcategories: "Subcategories", - convertToSubcategory: "Convert to subcategory...", + convertToSubcategory: "Enable subitems for this question...", moveAsSubitem: "Move as a subitem to...", - moveTo: "Move To...", addToToolbox: "Add to Toolbox", - categories_label: "Categories", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category", deleteCustomItem: "Delete Custom Item", - removeFrom: "Remove from {0}", unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", addCustomCategory: "New Category", addCustomItem: "New Item", @@ -52,7 +47,6 @@ export const enStrings = { addNewSubitem: "Add a new subitem", noRowsText: "There are no items", newItem: "New item in", - newCategory: "New category in", }, propertyGrid: { title: "Customize the Property Grid", @@ -66,10 +60,30 @@ export const enStrings = { iconName: "Icon name", name: "Name", titleField: "Title", - descriptionField: "Description", + descriptionField: "Helper Text", unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", addCustomCategory: "Add Custom Category" }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, editor: { title: "Creator Presets", presetJson: "Preset JSON:", diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index bdef753119..a23cb39470 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -24,6 +24,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre actions.forEach(a => { if (a.id == "remove-row") { a.iconName = "icon-delete_24x24"; + a.tooltip = getLocString("presets.items.delete"); a.innerCss = "sps-action-button sps-action-button--icon sps-action-button--danger"; } if (a.id == "reset-to-default") { @@ -70,7 +71,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre actions.push( new Action({ id: "remove-from", - title: getLocString("presets.toolbox.removeFrom").replace("{0}", question.title), + title: getLocString("presets.items.removeFrom").replace("{0}", question.title), action: () => { const rowDataIndex = question.visibleRows.indexOf(row); question.removeRow(rowDataIndex); @@ -81,7 +82,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre if (hasCategories) { actions.push(new Action({ id: "move-to", - title: getLocString("presets.toolbox.moveTo"), + title: getLocString("presets.items.moveTo"), css: "sps-list__item--label", enabled: false })); @@ -109,14 +110,14 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre if (!isUnsorted) { actions.push(new Action({ id: "categories", - title: getLocString("presets.toolbox.categories_label"), + title: getLocString("presets.items.categoriesLabel"), css: "sps-list__item--label", enabled: false, needSeparator: true })); const catGroup = new Action({ id: "move-to-categories", - title: getLocString("presets.toolbox.moveToCategory") + title: getLocString("presets.items.moveToCategory") }); this.setSubitemsToAction(catGroup, moveToCategories); actions.push(catGroup); @@ -127,7 +128,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre actions.push( new Action({ id: "move-to-new-category", - title: getLocString("presets.toolbox.moveToNewCategory"), + title: getLocString("presets.items.moveToNewCategory"), needSeparator: isUnsorted, action: () => { this.moveToCategory(model, question, row, this.getDefaultValueForRow(model, question, "category"), true); @@ -143,7 +144,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre actions.push( new Action({ id: "remove-custom-item", - title: getLocString("presets.toolbox.deleteCustomItem"), + title: getLocString("presets.items.deleteCustomItem"), css: "sps-list__item--alert", needSeparator: true, action: () => { @@ -163,6 +164,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre const addAction = createDropdownActionModel({ id: "context-menu", iconName: "more-circle-24x24", + tooltip: getLocString("presets.items.more"), location: "end", visibleIndex: 20 }, { @@ -271,7 +273,7 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre if (options.question.name == this.nameCategories) { this.setDefaultValueForRow(model, options.question, options.row); this.editItem(model, creator, options.question, options.row, { - description: getLocString("presets.toolbox.newCategory") + " " + this.getPageShortTitle(model) + description: getLocString("presets.items.newCategory") + " " + this.getPageShortTitle(model) }); } } diff --git a/packages/survey-creator-core/src/presets/presets-editable-list.ts b/packages/survey-creator-core/src/presets/presets-editable-list.ts index 795c18de4a..7ce5bab20d 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-list.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-list.ts @@ -1,4 +1,4 @@ -import { Helpers, MatrixDynamicRowModel, QuestionMatrixDynamicModel, SurveyModel, Action, IAction, SvgRegistry, Question } from "survey-core"; +import { Helpers, MatrixDynamicRowModel, QuestionMatrixDynamicModel, SurveyModel, Action, IAction, SvgRegistry, Question, ComputedUpdater } from "survey-core"; import { CreatorPresetEditableBase } from "./presets-editable-base"; import { SurveyCreatorModel, SurveyHelper, getLocString } from "survey-creator-core"; export class CreatorPresetEditableList extends CreatorPresetEditableBase { @@ -68,6 +68,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { return { id: "reset-to-default", iconName: "icon-reset", + tooltip: getLocString("presets.items.restoreToDefault"), location: "end", visibleIndex: 15, action: action @@ -78,6 +79,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { return { id: "edit-item", iconName: "icon-edit", + tooltip: getLocString("presets.items.edit"), location: "end", visibleIndex: 13, action: () => { this.editItem(model, creator, question, row); } @@ -99,6 +101,8 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { if (a.id == "show-detail") { a.location = "end"; a.iconName = "icon-expand-24x24"; + a.title = new ComputedUpdater(() => row.isDetailPanelShowing ? getLocString("presets.items.collapse") : getLocString("presets.items.expand")); + a.tooltip = getLocString("presets.items.expand"); a.visibleIndex = 10; a.visible = allowExpand; } @@ -107,6 +111,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { a.component = "sv-action-bar-item"; a.action = () => question.removeRowUI(row); a.iconName = isItemsMatrix ? "icon-add_24x24" : "icon-remove_24x24"; + a.tooltip = isItemsMatrix ? getLocString("presets.items.add") : getLocString("presets.items.add"); } }); } @@ -227,7 +232,7 @@ export class CreatorPresetEditableList extends CreatorPresetEditableBase { if (this.isItemsMatrix(options.question.name)) { this.setDefaultValueForRow(model, options.question, options.row); this.editItem(model, creator, options.question, options.row, { - description: getLocString("presets.toolbox.newItem") + " " + (options.question.data?.value?.title || this.getPageShortTitle(model)) + description: getLocString("presets.items.newItem") + " " + (options.question.data?.value?.title || this.getPageShortTitle(model)) }); } } diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index 720c498725..bd14d31cfc 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -45,7 +45,7 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { name: this.mainPanelName, elements: [ this.createItemsMatrixJSON({ - title: getLocString("presets.tabs.tabs"), + title: getLocString("presets.tabs.items"), name: this.nameItems }), this.createItemsMatrixJSON({ From 80e183044240cf0791f4279e75632891e5b73f57 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 15 Oct 2025 16:14:38 +0300 Subject: [PATCH 195/240] #7004 - fix popup sizing --- .../src/presets/presets-theme/presets.scss | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/survey-creator-core/src/presets/presets-theme/presets.scss b/packages/survey-creator-core/src/presets/presets-theme/presets.scss index 0ef4337405..59ac1b6f1a 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/presets.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/presets.scss @@ -27,7 +27,6 @@ @include sjs2--typography--default; :has(.sps-page) { - height: 0; flex-grow: 1; display: flex; flex-direction: column; @@ -37,6 +36,12 @@ } } +.sps-popup { + :has(.sps-page) { + flex-grow: 0; + } +} + .sps-container { width: 100%; height: 100%; From f4c2819840d0c152a1fc37166581fcfa099543ea Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Wed, 15 Oct 2025 18:04:10 +0300 Subject: [PATCH 196/240] #7004 - add localization --- package.json | 3 - packages/survey-creator-core/package.json | 1 + .../rollup.i18n.presets.config.js | 25 ++++ .../survey-creator-core/src/presets/i18n.ts | 36 ++++++ .../src/presets/localization/arabic.ts | 118 ++++++++++++++++++ .../src/presets/localization/bulgarian.ts | 118 ++++++++++++++++++ .../src/presets/localization/burmese.ts | 118 ++++++++++++++++++ .../src/presets/localization/croatian.ts | 118 ++++++++++++++++++ .../src/presets/localization/czech.ts | 118 ++++++++++++++++++ .../src/presets/localization/danish.ts | 118 ++++++++++++++++++ .../src/presets/localization/dutch.ts | 118 ++++++++++++++++++ .../src/presets/localization/english.ts | 14 +-- .../src/presets/localization/finnish.ts | 118 ++++++++++++++++++ .../src/presets/localization/french.ts | 118 ++++++++++++++++++ .../src/presets/localization/german.ts | 118 ++++++++++++++++++ .../src/presets/localization/greek.ts | 118 ++++++++++++++++++ .../presets/localization/haitian-creole.ts | 118 ++++++++++++++++++ .../src/presets/localization/hebrew.ts | 118 ++++++++++++++++++ .../src/presets/localization/hungarian.ts | 118 ++++++++++++++++++ .../src/presets/localization/indonesian.ts | 118 ++++++++++++++++++ .../src/presets/localization/italian.ts | 118 ++++++++++++++++++ .../src/presets/localization/japanese.ts | 118 ++++++++++++++++++ .../src/presets/localization/korean.ts | 118 ++++++++++++++++++ .../src/presets/localization/malay.ts | 118 ++++++++++++++++++ .../src/presets/localization/mongolian.ts | 118 ++++++++++++++++++ .../src/presets/localization/norwegian.ts | 118 ++++++++++++++++++ .../src/presets/localization/persian.ts | 118 ++++++++++++++++++ .../src/presets/localization/polish.ts | 118 ++++++++++++++++++ .../src/presets/localization/portuguese.ts | 118 ++++++++++++++++++ .../src/presets/localization/romanian.ts | 118 ++++++++++++++++++ .../src/presets/localization/russian.ts | 118 ++++++++++++++++++ .../localization/simplified-chinese.ts | 118 ++++++++++++++++++ .../src/presets/localization/slovak.ts | 118 ++++++++++++++++++ .../src/presets/localization/slovenian.ts | 118 ++++++++++++++++++ .../src/presets/localization/spanish.ts | 118 ++++++++++++++++++ .../src/presets/localization/swedish.ts | 118 ++++++++++++++++++ .../src/presets/localization/tajik.ts | 118 ++++++++++++++++++ .../src/presets/localization/thai.ts | 118 ++++++++++++++++++ .../localization/traditional-chinese.ts | 118 ++++++++++++++++++ .../src/presets/localization/turkish.ts | 118 ++++++++++++++++++ .../tsconfig.i18n.presets.json | 12 ++ .../webpack.i18n.presets.js | 38 ++++++ 42 files changed, 4244 insertions(+), 15 deletions(-) create mode 100644 packages/survey-creator-core/rollup.i18n.presets.config.js create mode 100644 packages/survey-creator-core/src/presets/i18n.ts create mode 100644 packages/survey-creator-core/src/presets/localization/arabic.ts create mode 100644 packages/survey-creator-core/src/presets/localization/bulgarian.ts create mode 100644 packages/survey-creator-core/src/presets/localization/burmese.ts create mode 100644 packages/survey-creator-core/src/presets/localization/croatian.ts create mode 100644 packages/survey-creator-core/src/presets/localization/czech.ts create mode 100644 packages/survey-creator-core/src/presets/localization/danish.ts create mode 100644 packages/survey-creator-core/src/presets/localization/dutch.ts create mode 100644 packages/survey-creator-core/src/presets/localization/finnish.ts create mode 100644 packages/survey-creator-core/src/presets/localization/french.ts create mode 100644 packages/survey-creator-core/src/presets/localization/german.ts create mode 100644 packages/survey-creator-core/src/presets/localization/greek.ts create mode 100644 packages/survey-creator-core/src/presets/localization/haitian-creole.ts create mode 100644 packages/survey-creator-core/src/presets/localization/hebrew.ts create mode 100644 packages/survey-creator-core/src/presets/localization/hungarian.ts create mode 100644 packages/survey-creator-core/src/presets/localization/indonesian.ts create mode 100644 packages/survey-creator-core/src/presets/localization/italian.ts create mode 100644 packages/survey-creator-core/src/presets/localization/japanese.ts create mode 100644 packages/survey-creator-core/src/presets/localization/korean.ts create mode 100644 packages/survey-creator-core/src/presets/localization/malay.ts create mode 100644 packages/survey-creator-core/src/presets/localization/mongolian.ts create mode 100644 packages/survey-creator-core/src/presets/localization/norwegian.ts create mode 100644 packages/survey-creator-core/src/presets/localization/persian.ts create mode 100644 packages/survey-creator-core/src/presets/localization/polish.ts create mode 100644 packages/survey-creator-core/src/presets/localization/portuguese.ts create mode 100644 packages/survey-creator-core/src/presets/localization/romanian.ts create mode 100644 packages/survey-creator-core/src/presets/localization/russian.ts create mode 100644 packages/survey-creator-core/src/presets/localization/simplified-chinese.ts create mode 100644 packages/survey-creator-core/src/presets/localization/slovak.ts create mode 100644 packages/survey-creator-core/src/presets/localization/slovenian.ts create mode 100644 packages/survey-creator-core/src/presets/localization/spanish.ts create mode 100644 packages/survey-creator-core/src/presets/localization/swedish.ts create mode 100644 packages/survey-creator-core/src/presets/localization/tajik.ts create mode 100644 packages/survey-creator-core/src/presets/localization/thai.ts create mode 100644 packages/survey-creator-core/src/presets/localization/traditional-chinese.ts create mode 100644 packages/survey-creator-core/src/presets/localization/turkish.ts create mode 100644 packages/survey-creator-core/tsconfig.i18n.presets.json create mode 100644 packages/survey-creator-core/webpack.i18n.presets.js diff --git a/package.json b/package.json index 242ab8c1b6..fcdb0f4875 100644 --- a/package.json +++ b/package.json @@ -10,9 +10,6 @@ "version": "0.0.1", "scripts": { "dev": "concurrently \"npm run dev --prefix ../survey-library\" \"http-server -p 7777 --silent\" \"npm run watch:dev --prefix packages/survey-creator-core\" \"npm run watch:prod --prefix packages/survey-creator-core\" \"npm run watch:dev --prefix packages/survey-creator-knockout\" \"npm run watch:prod --prefix packages/survey-creator-knockout\" \"npm run watch:dev --prefix packages/survey-creator-react\" \"npm run watch:prod --prefix packages/survey-creator-react\" ", - "build:presets": "npm run build:presets --prefix packages/survey-creator-vue && npm run build:presets --prefix packages/survey-creator-angular", - "build:presets:dev": "npm run build:presets:dev --prefix packages/survey-creator-vue && npm run build:presets:dev --prefix packages/survey-creator-angular", - "watch:presets": "concurrently \"npm run watch:presets --prefix packages/survey-creator-vue\" \"npm run watch:presets --prefix packages/survey-creator-angular\"", "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --max-warnings=0", "lint:fix": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --max-warnings=0 --fix", "pre-push-check": "npm run lint", diff --git a/packages/survey-creator-core/package.json b/packages/survey-creator-core/package.json index 9b6169d566..5a16cebc9d 100644 --- a/packages/survey-creator-core/package.json +++ b/packages/survey-creator-core/package.json @@ -13,6 +13,7 @@ "build:themes": "node creator-themes-import.js && webpack --config ./webpack.themes.config.js --env buildType=dev --env emitDeclarations && webpack --config ./webpack.themes.config.js --env buildType=prod && rollup -c rollup.themes.config.js", "build:all": "npm run build && npm run build:i18n && npm run build:themes && npm run build:presets", "build:presets": "webpack --config ./webpack.presets.config.js --env buildType=dev --env emitDeclarations && webpack --config ./webpack.presets.config.js --env buildType=prod && rollup -c rollup.presets.config.js --bundleConfigAsCjs", + "build:i18n:presets": "webpack --config ./webpack.i18n.presets.js --env buildType=dev --env emitDeclarations && webpack --config ./webpack.i18n.presets.js --env buildType=prod && rollup -c rollup.i18n.presets.config.js --bundleConfigAsCjs", "watch:presets": "webpack --config ./webpack.presets.config.js --watch --env buildType=dev --env emitDeclarations && webpack --config ./webpack.presets.config.js --env buildType=prod && rollup -c rollup.presets.config.js --bundleConfigAsCjs", "test": "jest", "test:cov": "jest --coverage", diff --git a/packages/survey-creator-core/rollup.i18n.presets.config.js b/packages/survey-creator-core/rollup.i18n.presets.config.js new file mode 100644 index 0000000000..46f7a3b73f --- /dev/null +++ b/packages/survey-creator-core/rollup.i18n.presets.config.js @@ -0,0 +1,25 @@ +const defaultConfig = require("./rollup.config"); +const path = require("path"); +const fs = require("fs"); +const input = {}; + +function patchEntries() { + fs.readdirSync(path.resolve(__dirname, "./src/presets/localization")).forEach(file => { + var extension = path.extname(file); + if (extension.toLowerCase() === ".ts") { + input[`presets/i18n/${path.basename(file, extension)}`] = (path.resolve(__dirname, "./src/presets/localization") + "/" + file); + } + }); + input["presets/i18n/index"] = path.resolve(__dirname, "./src/presets/i18n.ts"); +} + +module.exports = () => { + let options = { + tsconfig: path.resolve(__dirname, "./tsconfig.i18n.presets.json") + }; + const config = defaultConfig(options); + patchEntries(); + config.input = input; + config.external = ["survey-creator-core"]; + return config; +}; \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/i18n.ts b/packages/survey-creator-core/src/presets/i18n.ts new file mode 100644 index 0000000000..71540278e7 --- /dev/null +++ b/packages/survey-creator-core/src/presets/i18n.ts @@ -0,0 +1,36 @@ +//localization +import "./localization/arabic"; +import "./localization/bulgarian"; +import "./localization/burmese"; +import "./localization/croatian"; +import "./localization/czech"; +import "./localization/danish"; +import "./localization/dutch"; +import "./localization/finnish"; +import "./localization/french"; +import "./localization/german"; +import "./localization/hebrew"; +import "./localization/hungarian"; +import "./localization/indonesian"; +import "./localization/italian"; +import "./localization/japanese"; +import "./localization/korean"; +import "./localization/malay"; +import "./localization/mongolian"; +import "./localization/norwegian"; +import "./localization/persian"; +import "./localization/polish"; +import "./localization/portuguese"; +import "./localization/romanian"; +import "./localization/russian"; +import "./localization/simplified-chinese"; +import "./localization/slovak"; +import "./localization/slovenian"; +import "./localization/spanish"; +import "./localization/swedish"; +import "./localization/tajik"; +import "./localization/thai"; +import "./localization/traditional-chinese"; +import "./localization/turkish"; +import "./localization/haitian-creole"; +import "./localization/greek"; \ No newline at end of file diff --git a/packages/survey-creator-core/src/presets/localization/arabic.ts b/packages/survey-creator-core/src/presets/localization/arabic.ts new file mode 100644 index 0000000000..ee534cbbc9 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/arabic.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const arStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("ar"); +locale.presets = arStrings; diff --git a/packages/survey-creator-core/src/presets/localization/bulgarian.ts b/packages/survey-creator-core/src/presets/localization/bulgarian.ts new file mode 100644 index 0000000000..24b5f76bcc --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/bulgarian.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const bgStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("bg"); +locale.presets = bgStrings; diff --git a/packages/survey-creator-core/src/presets/localization/burmese.ts b/packages/survey-creator-core/src/presets/localization/burmese.ts new file mode 100644 index 0000000000..6941af1bd6 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/burmese.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const myStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("my"); +locale.presets = myStrings; diff --git a/packages/survey-creator-core/src/presets/localization/croatian.ts b/packages/survey-creator-core/src/presets/localization/croatian.ts new file mode 100644 index 0000000000..0e9a5dc408 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/croatian.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const hrStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("hr"); +locale.presets = hrStrings; diff --git a/packages/survey-creator-core/src/presets/localization/czech.ts b/packages/survey-creator-core/src/presets/localization/czech.ts new file mode 100644 index 0000000000..d93a4daaa1 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/czech.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const csStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("cs"); +locale.presets = csStrings; diff --git a/packages/survey-creator-core/src/presets/localization/danish.ts b/packages/survey-creator-core/src/presets/localization/danish.ts new file mode 100644 index 0000000000..46244d88ef --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/danish.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const daStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("da"); +locale.presets = daStrings; diff --git a/packages/survey-creator-core/src/presets/localization/dutch.ts b/packages/survey-creator-core/src/presets/localization/dutch.ts new file mode 100644 index 0000000000..ca015c8c05 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/dutch.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const nlStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("nl"); +locale.presets = nlStrings; diff --git a/packages/survey-creator-core/src/presets/localization/english.ts b/packages/survey-creator-core/src/presets/localization/english.ts index 756852e7e7..4d530cac27 100644 --- a/packages/survey-creator-core/src/presets/localization/english.ts +++ b/packages/survey-creator-core/src/presets/localization/english.ts @@ -99,21 +99,11 @@ export const enStrings = { categoryRestoredToDefault: "Category restored to default", edit: "Edit", completeText: "Save & Exit", - pagePrevText: "Back", - usageExample: `Use the following code to apply the preset: -import { SurveyCreatorModel, CreatorPreset } from "survey-creator-core"; -const creator = new SurveyCreatorModel({ ... }); - -const presetJson = { - // Copy the JSON object from below -} - -const preset = new CreatorPreset(presetJson); -preset.apply(creator);` + pagePrevText: "Back" }, plugin: { presetsTab: "Presets", - creatorPresets: "Ctreator Presets", + creatorPresets: "Creator Presets", save: "Save & Exit", file: "File", import: "Import", diff --git a/packages/survey-creator-core/src/presets/localization/finnish.ts b/packages/survey-creator-core/src/presets/localization/finnish.ts new file mode 100644 index 0000000000..831ce0b037 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/finnish.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const fiStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("fi"); +locale.presets = fiStrings; diff --git a/packages/survey-creator-core/src/presets/localization/french.ts b/packages/survey-creator-core/src/presets/localization/french.ts new file mode 100644 index 0000000000..259a8490b3 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/french.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const frStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("fr"); +locale.presets = frStrings; diff --git a/packages/survey-creator-core/src/presets/localization/german.ts b/packages/survey-creator-core/src/presets/localization/german.ts new file mode 100644 index 0000000000..535dcdef58 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/german.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const deStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("de"); +locale.presets = deStrings; diff --git a/packages/survey-creator-core/src/presets/localization/greek.ts b/packages/survey-creator-core/src/presets/localization/greek.ts new file mode 100644 index 0000000000..fc93921ef0 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/greek.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const elStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("el"); +locale.presets = elStrings; diff --git a/packages/survey-creator-core/src/presets/localization/haitian-creole.ts b/packages/survey-creator-core/src/presets/localization/haitian-creole.ts new file mode 100644 index 0000000000..1e637228e2 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/haitian-creole.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const htStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("ht"); +locale.presets = htStrings; diff --git a/packages/survey-creator-core/src/presets/localization/hebrew.ts b/packages/survey-creator-core/src/presets/localization/hebrew.ts new file mode 100644 index 0000000000..ccfc7811e4 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/hebrew.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const heStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("he"); +locale.presets = heStrings; diff --git a/packages/survey-creator-core/src/presets/localization/hungarian.ts b/packages/survey-creator-core/src/presets/localization/hungarian.ts new file mode 100644 index 0000000000..c6e1811f8d --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/hungarian.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const huStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("hu"); +locale.presets = huStrings; diff --git a/packages/survey-creator-core/src/presets/localization/indonesian.ts b/packages/survey-creator-core/src/presets/localization/indonesian.ts new file mode 100644 index 0000000000..c83139b88b --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/indonesian.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const idStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("id"); +locale.presets = idStrings; diff --git a/packages/survey-creator-core/src/presets/localization/italian.ts b/packages/survey-creator-core/src/presets/localization/italian.ts new file mode 100644 index 0000000000..4d1d2565c9 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/italian.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const itStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("it"); +locale.presets = itStrings; diff --git a/packages/survey-creator-core/src/presets/localization/japanese.ts b/packages/survey-creator-core/src/presets/localization/japanese.ts new file mode 100644 index 0000000000..f15ef3ac69 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/japanese.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const jaStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("ja"); +locale.presets = jaStrings; diff --git a/packages/survey-creator-core/src/presets/localization/korean.ts b/packages/survey-creator-core/src/presets/localization/korean.ts new file mode 100644 index 0000000000..2390c86ea0 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/korean.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const koStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("ko"); +locale.presets = koStrings; diff --git a/packages/survey-creator-core/src/presets/localization/malay.ts b/packages/survey-creator-core/src/presets/localization/malay.ts new file mode 100644 index 0000000000..98ccd0964d --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/malay.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const msStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("ms"); +locale.presets = msStrings; diff --git a/packages/survey-creator-core/src/presets/localization/mongolian.ts b/packages/survey-creator-core/src/presets/localization/mongolian.ts new file mode 100644 index 0000000000..3c4d67c992 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/mongolian.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const mnStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("mn"); +locale.presets = mnStrings; diff --git a/packages/survey-creator-core/src/presets/localization/norwegian.ts b/packages/survey-creator-core/src/presets/localization/norwegian.ts new file mode 100644 index 0000000000..19c703b427 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/norwegian.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const noStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("no"); +locale.presets = noStrings; diff --git a/packages/survey-creator-core/src/presets/localization/persian.ts b/packages/survey-creator-core/src/presets/localization/persian.ts new file mode 100644 index 0000000000..cd7a9120ed --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/persian.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const faStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("fa"); +locale.presets = faStrings; diff --git a/packages/survey-creator-core/src/presets/localization/polish.ts b/packages/survey-creator-core/src/presets/localization/polish.ts new file mode 100644 index 0000000000..8c0940d24d --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/polish.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const plStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("pl"); +locale.presets = plStrings; diff --git a/packages/survey-creator-core/src/presets/localization/portuguese.ts b/packages/survey-creator-core/src/presets/localization/portuguese.ts new file mode 100644 index 0000000000..a14eb7412f --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/portuguese.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const ptStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("pt"); +locale.presets = ptStrings; diff --git a/packages/survey-creator-core/src/presets/localization/romanian.ts b/packages/survey-creator-core/src/presets/localization/romanian.ts new file mode 100644 index 0000000000..ed4552192a --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/romanian.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const roStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("ro"); +locale.presets = roStrings; diff --git a/packages/survey-creator-core/src/presets/localization/russian.ts b/packages/survey-creator-core/src/presets/localization/russian.ts new file mode 100644 index 0000000000..29c172ed56 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/russian.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const ruStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("ru"); +locale.presets = ruStrings; diff --git a/packages/survey-creator-core/src/presets/localization/simplified-chinese.ts b/packages/survey-creator-core/src/presets/localization/simplified-chinese.ts new file mode 100644 index 0000000000..20ad8a0475 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/simplified-chinese.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const zhStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("zh"); +locale.presets = zhStrings; diff --git a/packages/survey-creator-core/src/presets/localization/slovak.ts b/packages/survey-creator-core/src/presets/localization/slovak.ts new file mode 100644 index 0000000000..2d500b6bd5 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/slovak.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const skStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("sk"); +locale.presets = skStrings; diff --git a/packages/survey-creator-core/src/presets/localization/slovenian.ts b/packages/survey-creator-core/src/presets/localization/slovenian.ts new file mode 100644 index 0000000000..c89b4d93dd --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/slovenian.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const slStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("sl"); +locale.presets = slStrings; diff --git a/packages/survey-creator-core/src/presets/localization/spanish.ts b/packages/survey-creator-core/src/presets/localization/spanish.ts new file mode 100644 index 0000000000..4597091aff --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/spanish.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const esStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("es"); +locale.presets = esStrings; diff --git a/packages/survey-creator-core/src/presets/localization/swedish.ts b/packages/survey-creator-core/src/presets/localization/swedish.ts new file mode 100644 index 0000000000..c4090091ce --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/swedish.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const svStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("sv"); +locale.presets = svStrings; diff --git a/packages/survey-creator-core/src/presets/localization/tajik.ts b/packages/survey-creator-core/src/presets/localization/tajik.ts new file mode 100644 index 0000000000..94c1337e69 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/tajik.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const tgStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("tg"); +locale.presets = tgStrings; diff --git a/packages/survey-creator-core/src/presets/localization/thai.ts b/packages/survey-creator-core/src/presets/localization/thai.ts new file mode 100644 index 0000000000..70a09ab494 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/thai.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const thStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("th"); +locale.presets = thStrings; diff --git a/packages/survey-creator-core/src/presets/localization/traditional-chinese.ts b/packages/survey-creator-core/src/presets/localization/traditional-chinese.ts new file mode 100644 index 0000000000..8a3dfbf47e --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/traditional-chinese.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const zhTwStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("zh-tw"); +locale.presets = zhTwStrings; diff --git a/packages/survey-creator-core/src/presets/localization/turkish.ts b/packages/survey-creator-core/src/presets/localization/turkish.ts new file mode 100644 index 0000000000..a9a18cac08 --- /dev/null +++ b/packages/survey-creator-core/src/presets/localization/turkish.ts @@ -0,0 +1,118 @@ +import { getLocaleStrings } from "survey-creator-core"; +export const trStrings = { + languages: { + title: "Languages", + navigationTitle: "Languages", + description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", + creatorUI: "Creator UI language", + surveyLanguages: "Survey languages", + searchPlaceholder: "Type to search...", + translateToEnglish: "Translate Survey language names to English" + }, + tabs: { + title: "Configure tabs", + navigationTitle: "Tabs", + description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", + items: "Visible tabs", + unsortedItems: "Hidden tabs", + defaultTab: "Default tab", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + name: "Name", + titleField: "Title", + iconName: "Icon name" + }, + toolbox: { + title: "Set up the Toolbox", + navigationTitle: "Toolbox", + description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + toolbox: "Toolbox", + categories: "Categories", + unsortedItems: "Hidden toolbox items", + enableGrouping: "Enable grouping", + showCategoryTitles: "Show category titles", + categoryName: "Name", + categoryTitle: "Title", + tooltip: "Tooltip", + iconName: "Icon name", + jsonObject: "JSON object to apply when users select this toolbox item", + subcategories: "Subcategories", + convertToSubcategory: "Enable subitems for this question...", + moveAsSubitem: "Move as a subitem to...", + addToToolbox: "Add to Toolbox", + deleteCustomItem: "Delete Custom Item", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "New Category", + addCustomItem: "New Item", + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + noRowsText: "There are no items", + newItem: "New item in", + }, + propertyGrid: { + title: "Customize the Property Grid", + navigationTitle: "Property Grid", + description: "Select an element to customize its settings available in the Property Grid.", + selectElement: "Select an element to customize its settings available in the Property Grid", + propertyGrid: "Property Grid", + unsortedItems: "Unsorted items", + categoryName: "Name", + categoryTitle: "Title", + iconName: "Icon name", + name: "Name", + titleField: "Title", + descriptionField: "Helper Text", + unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + addCustomCategory: "Add Custom Category" + }, + items: { + addNewItem: "Add a new item", + addNewSubitem: "Add a new subitem", + newItem: "New item in", + addCustomCategory: "New Category", + newCategory: "New category in", + moveToCategory: "Move to category...", + moveToNewCategory: "Move to new category...", + categoriesLabel: "Categories", + moveTo: "Move To...", + removeFrom: "Remove from {0}", + more: "More", + restoreToDefault: "Restore", + edit: "Edit", + expand: "Expand", + collapse: "Collapse", + remove: "Remove", + add: "Add", + delete: "Delete" + }, + editor: { + title: "Creator Presets", + presetJson: "Preset JSON:", + copy: "Copy", + download: "Download", + load: "Load", + saveExit: "Save & Exit", + back: "Back", + resetToDefault: "Reset to default", + resetToDefaults: "All settings restored to default", + resoredToDefault: "resored to default", + itemRestoredToDefault: "Item restored to default", + categoryRestoredToDefault: "Category restored to default", + edit: "Edit", + completeText: "Save & Exit", + pagePrevText: "Back" + }, + plugin: { + presetsTab: "Presets", + creatorPresets: "Creator Presets", + save: "Save & Exit", + file: "File", + import: "Import", + export: "Export", + edit: "Edit", + resetLanguages: "Reset Languages to default", + resetAll: "Reset all changes", + resetToDefaults: "Reset {0} to defaults" + } +}; +const locale = getLocaleStrings("tr"); +locale.presets = trStrings; diff --git a/packages/survey-creator-core/tsconfig.i18n.presets.json b/packages/survey-creator-core/tsconfig.i18n.presets.json new file mode 100644 index 0000000000..ee36db92da --- /dev/null +++ b/packages/survey-creator-core/tsconfig.i18n.presets.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": false, + "declarationDir": null, + "paths": { + "survey-creator-core": [ + "./src/editorLocalization.ts" + ] + }, + } +} \ No newline at end of file diff --git a/packages/survey-creator-core/webpack.i18n.presets.js b/packages/survey-creator-core/webpack.i18n.presets.js new file mode 100644 index 0000000000..7983ff51d8 --- /dev/null +++ b/packages/survey-creator-core/webpack.i18n.presets.js @@ -0,0 +1,38 @@ +"use strict"; +const webpackCommonConfigCreator = require("./webpack.config"); +const path = require("path"); +const fs = require("fs"); +const { merge } = require("webpack-merge"); + +const config = { + entry: { + }, + externals: { + "survey-creator-core": { + root: "SurveyCreatorCore", + commonjs2: "survey-creator-core", + commonjs: "survey-creator-core", + amd: "survey-creator-core" + } + } +}; + +function patchEntries() { + fs.readdirSync(path.resolve(__dirname, "./src/presets/localization")).forEach(file => { + var extension = path.extname(file); + if (extension.toLowerCase() === ".ts") { + config.entry[`presets/i18n/${path.basename(file, extension)}`] = (path.resolve(__dirname, "./src/presets/localization") + "/" + file); + } + }); + config.entry["presets/i18n/index"] = path.resolve(__dirname, "./src/presets/i18n.ts"); +} + +module.exports = function (options) { + options.platform = "i18n"; + options.libraryName = "SurveyCreatorLocalesPresets"; + options.tsConfigFile = "tsconfig.i18n.presets.json"; + patchEntries(); + const mainConfig = webpackCommonConfigCreator(options); + mainConfig.entry = {}; + return merge(mainConfig, config); +}; \ No newline at end of file From 8c138b4f0377aa5371715c3321b37d5574c390e7 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 16 Oct 2025 12:32:52 +0300 Subject: [PATCH 197/240] #7004 fixed empty json apply --- .../src/presets-creator/presets-base.ts | 2 +- .../src/presets-creator/presets-languages.ts | 1 - .../src/presets-creator/presets-toolbox.ts | 3 +-- .../tests/presets.tests.ts | 23 +++++++++++++++++++ 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/packages/survey-creator-core/src/presets-creator/presets-base.ts b/packages/survey-creator-core/src/presets-creator/presets-base.ts index ec01756acd..d44f3bae7f 100644 --- a/packages/survey-creator-core/src/presets-creator/presets-base.ts +++ b/packages/survey-creator-core/src/presets-creator/presets-base.ts @@ -28,7 +28,7 @@ export abstract class CreatorPresetBase implements ICreatorPreset { this.onApplied.fire(this, {}); } public abstract getPath(): string; - protected applyEmptyJson(): boolean { return false; } + protected applyEmptyJson(): boolean { return true; } protected applyCore(creator: SurveyCreatorModel, internal: boolean = false): void { } protected createPresets(): Array { return []; diff --git a/packages/survey-creator-core/src/presets-creator/presets-languages.ts b/packages/survey-creator-core/src/presets-creator/presets-languages.ts index a969c36141..c10e3f6a24 100644 --- a/packages/survey-creator-core/src/presets-creator/presets-languages.ts +++ b/packages/survey-creator-core/src/presets-creator/presets-languages.ts @@ -4,7 +4,6 @@ import { surveyLocalization } from "survey-core"; export class CreatorPresetLanguages extends CreatorPresetBase { public getPath(): string { return "languages"; } - protected applyEmptyJson(): boolean { return true; } protected applyCore(creator: SurveyCreatorModel): void { super.applyCore(creator); const locale = this.json?.creator || ""; diff --git a/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts b/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts index d3ab03892d..b8c4387fac 100644 --- a/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts +++ b/packages/survey-creator-core/src/presets-creator/presets-toolbox.ts @@ -49,14 +49,13 @@ export class CreatorPresetToolboxDefinition extends CreatorPresetBase { export class CreatorPresetToolboxConfigurator extends CreatorPresetBase { public getPath(): string { return ""; } protected applyCore(creator: SurveyCreatorModel): void { - if (!this.json) return; super.applyCore(creator); creator.toolbox.showCategoryTitles = this.json.showCategoryTitles; const items = this.json["definition"]; const itemNames = items?.map(i => i.name); let categories = this.json["categories"]; if (!categories) { - categories = creator.toolbox.categories + categories = creator.toolbox.getDefaultCategories() .map(c => ({ category: c.name, items: c.items?.map(i => i.name).filter(name => !itemNames || itemNames.indexOf(name) != -1) diff --git a/packages/survey-creator-core/tests/presets.tests.ts b/packages/survey-creator-core/tests/presets.tests.ts index 320ff32c52..bf5bff58d0 100644 --- a/packages/survey-creator-core/tests/presets.tests.ts +++ b/packages/survey-creator-core/tests/presets.tests.ts @@ -156,6 +156,24 @@ test("set toolbox definition - no categories", () => { expect(tb.visibleActions).toHaveLength(4); }); +test("set toolbox definition - showCategoryTitles", () => { + const creator = new CreatorTester(); + const preset = new CreatorPreset({ + toolbox: { + showCategoryTitles: true + } + }); + preset.apply(creator); + const tb = creator.toolbox; + tb.flushUpdates(); + expect(tb.showCategoryTitles).toBeTruthy(); + + preset.setJson(undefined); + preset.apply(creator); + tb.flushUpdates(); + expect(tb.showCategoryTitles).toBeFalsy(); +}); + test("set toolbox definition - no categories, no definition", () => { const creator = new CreatorTester(); const preset = new CreatorPreset({ @@ -168,6 +186,11 @@ test("set toolbox definition - no categories, no definition", () => { tb.flushUpdates(); expect(tb.categories).toHaveLength(1); expect(tb.visibleActions.length).toBeGreaterThan(0); + + preset.setJson(undefined); + preset.apply(creator); + tb.flushUpdates(); + expect(tb.categories.length).toBeGreaterThan(1); }); test("Override toolbox JSON", () => { From 8ac40e1b12d3d3e848709e2a175e8998e03fb0a9 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 16 Oct 2025 17:14:45 +0300 Subject: [PATCH 198/240] #7004 - fix and translate localization --- .eslintrc.js | 5 +- .../src/presets/localization/arabic.ts | 297 +++++++++++------ .../src/presets/localization/bulgarian.ts | 297 +++++++++++------ .../src/presets/localization/burmese.ts | 303 ++++++++++++------ .../src/presets/localization/croatian.ts | 295 +++++++++++------ .../src/presets/localization/czech.ts | 297 +++++++++++------ .../src/presets/localization/danish.ts | 293 +++++++++++------ .../src/presets/localization/dutch.ts | 295 +++++++++++------ .../src/presets/localization/finnish.ts | 297 +++++++++++------ .../src/presets/localization/french.ts | 291 +++++++++++------ .../src/presets/localization/german.ts | 287 +++++++++++------ .../src/presets/localization/greek.ts | 297 +++++++++++------ .../presets/localization/haitian-creole.ts | 295 +++++++++++------ .../src/presets/localization/hebrew.ts | 297 +++++++++++------ .../src/presets/localization/hungarian.ts | 297 +++++++++++------ .../src/presets/localization/indonesian.ts | 291 +++++++++++------ .../src/presets/localization/italian.ts | 295 +++++++++++------ .../src/presets/localization/japanese.ts | 297 +++++++++++------ .../src/presets/localization/korean.ts | 297 +++++++++++------ .../src/presets/localization/malay.ts | 285 ++++++++++------ .../src/presets/localization/mongolian.ts | 283 ++++++++++------ .../src/presets/localization/norwegian.ts | 303 ++++++++++++------ .../src/presets/localization/persian.ts | 295 +++++++++++------ .../src/presets/localization/polish.ts | 295 +++++++++++------ .../src/presets/localization/portuguese.ts | 291 +++++++++++------ .../src/presets/localization/romanian.ts | 295 +++++++++++------ .../src/presets/localization/russian.ts | 297 +++++++++++------ .../localization/simplified-chinese.ts | 303 ++++++++++++------ .../src/presets/localization/slovak.ts | 291 +++++++++++------ .../src/presets/localization/slovenian.ts | 297 +++++++++++------ .../src/presets/localization/spanish.ts | 295 +++++++++++------ .../src/presets/localization/swedish.ts | 293 +++++++++++------ .../src/presets/localization/tajik.ts | 113 ------- .../src/presets/localization/thai.ts | 297 +++++++++++------ .../localization/traditional-chinese.ts | 297 +++++++++++------ .../src/presets/localization/turkish.ts | 297 +++++++++++------ 36 files changed, 6703 insertions(+), 3447 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 4f3833764a..9838cbb92d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -120,7 +120,10 @@ module.exports = { } }, { - "files": ["packages/survey-creator-core/src/localization/*.ts"], + "files": [ + "packages/survey-creator-core/src/localization/*.ts", + "packages/survey-creator-core/src/presets/localization/*.ts" + ], "rules": { "surveyjs/eslint-plugin-i18n/only-english-or-code": "off" } diff --git a/packages/survey-creator-core/src/presets/localization/arabic.ts b/packages/survey-creator-core/src/presets/localization/arabic.ts index ee534cbbc9..dd144e1f9f 100644 --- a/packages/survey-creator-core/src/presets/localization/arabic.ts +++ b/packages/survey-creator-core/src/presets/localization/arabic.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const arStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "اللغات", + // [Auto-translated] "Languages" + navigationTitle: "اللغات", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "حدد لغة واجهة مستخدم منشئ الاستطلاع والاستهداف\nلغات الاستطلاع التي يتم تكوينها.", + // [Auto-translated] "Creator UI language" + creatorUI: "لغة واجهة مستخدم منشئ المحتوى", + // [Auto-translated] "Survey languages" + surveyLanguages: "لغات الاستطلاع", + // [Auto-translated] "Type to search..." + searchPlaceholder: "اكتب للبحث ...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "ترجمة أسماء لغات الاستطلاع إلى اللغة الإنجليزية" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "تكوين علامات التبويب", + // [Auto-translated] "Tabs" + navigationTitle: "علامات التبويب", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "حدد علامات التبويب التي تريد إظهارها ، وأعد ترتيبها ، وقم بتغيير عناوينها ،\nواختر علامة التبويب التي ستكون نشطة افتراضيا.", + // [Auto-translated] "Visible tabs" + items: "علامات التبويب المرئية", + // [Auto-translated] "Hidden tabs" + unsortedItems: "علامات التبويب المخفية", + // [Auto-translated] "Default tab" + defaultTab: "علامة التبويب الافتراضية", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "اسحب عنصرا من هذا العمود إلى العمود الأيسر - سيظهر مرئيا في لوحة علامات التبويب. يمكنك أيضا نقل العناصر باستخدام زري الجمع (+) والطرح (-).", + // [Auto-translated] "Name" + name: "اسم", + // [Auto-translated] "Title" + titleField: "عنوان", + // [Auto-translated] "Icon name" + iconName: "اسم الرمز" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "قم بإعداد مربع الأدوات", + // [Auto-translated] "Toolbox" + navigationTitle: "ادوات", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "حدد عناصر مربع الأدوات التي تريد إظهارها، وقم بتجميعها في فئات، \nأعد تسميتها وقم بتغيير ترتيبها إذا لزم الأمر.", + // [Auto-translated] "Toolbox" + toolbox: "ادوات", + // [Auto-translated] "Categories" + categories: "فئات", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "عناصر صندوق الأدوات المخفية", + // [Auto-translated] "Enable grouping" + enableGrouping: "تمكين التجميع", + // [Auto-translated] "Show category titles" + showCategoryTitles: "عرض عناوين الفئات", + // [Auto-translated] "Name" + categoryName: "اسم", + // [Auto-translated] "Title" + categoryTitle: "عنوان", + // [Auto-translated] "Tooltip" + tooltip: "تلميح الأداة", + // [Auto-translated] "Icon name" + iconName: "اسم الرمز", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "JSON لتطبيقه عند تحديد المستخدمين لعنصر مربع الأدوات هذا", + // [Auto-translated] "Subcategories" + subcategories: "الفئات الفرعيه", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "تمكين العناصر الفرعية لهذا السؤال...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "نقل كعنصر فرعي إلى...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "أضف إلى Toolbox", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "حذف عنصر مخصص", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "اسحب عنصرا من هذا العمود إلى العمود الأيسر - سيظهر مرئيا في لوحة Toolbox. يمكنك أيضا نقل العناصر باستخدام زري الجمع (+) والطرح (-).", + // [Auto-translated] "New Category" + addCustomCategory: "فئة جديدة", + // [Auto-translated] "New Item" + addCustomItem: "عنصر جديد", + // [Auto-translated] "Add a new item" + addNewItem: "إضافة عنصر جديد", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "إضافة عنصر فرعي جديد", + // [Auto-translated] "There are no items" + noRowsText: "لا توجد عناصر", + // [Auto-translated] "New item in" + newItem: "عنصر جديد في" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "ت��صيص شبكة الخصائص", + // [Auto-translated] "Property Grid" + navigationTitle: "شبكة العقارات", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "حدد عنصرا لتخصيص إعداداته المتوفرة في شبكة الخصائص.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "حدد عنصرا لتخصيص إعداداته المتوفرة في شبكة الخصائص", + // [Auto-translated] "Property Grid" + propertyGrid: "شبكة العقارات", + // [Auto-translated] "Unsorted items" + unsortedItems: "العناصر غير المصنفة", + // [Auto-translated] "Name" + categoryName: "اسم", + // [Auto-translated] "Title" + categoryTitle: "عنوان", + // [Auto-translated] "Icon name" + iconName: "اسم الرمز", + // [Auto-translated] "Name" + name: "اسم", + // [Auto-translated] "Title" + titleField: "عنوان", + // [Auto-translated] "Helper Text" + descriptionField: "نص مساعد", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "اسحب عنصرا من هذا العمود إلى العمود الأيسر - سيظهر مرئيا في لوحة علامات التبويب. يمكنك أيضا نقل العناصر باستخدام زري الجمع (+) والطرح (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "إضافة فئة مخصصة" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "إضافة عنصر جديد", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "إضافة عنصر فرعي جديد", + // [Auto-translated] "New item in" + newItem: "عنصر جديد في", + // [Auto-translated] "New Category" + addCustomCategory: "فئة جديدة", + // [Auto-translated] "New category in" + newCategory: "فئة جديدة في", + // [Auto-translated] "Move to category..." + moveToCategory: "انتقل إلى الفئة...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "انتقل إلى فئة جديدة ...", + // [Auto-translated] "Categories" + categoriesLabel: "فئات", + // [Auto-translated] "Move To..." + moveTo: "انتقل إلى...", + // [Auto-translated] "Remove from {0}" + removeFrom: "إزالة من {0}", + // [Auto-translated] "More" + more: "أكثر", + // [Auto-translated] "Restore" + restoreToDefault: "يستعيد", + // [Auto-translated] "Edit" + edit: "حرر", + // [Auto-translated] "Expand" + expand: "ستوسع", + // [Auto-translated] "Collapse" + collapse: "تقوض", + // [Auto-translated] "Remove" + remove: "أبعد", + // [Auto-translated] "Add" + add: "جمع", + // [Auto-translated] "Delete" + delete: "حذف" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "الإعدادات المسبقة لمنشئي المحتوى", + // [Auto-translated] "Preset JSON:" + presetJson: "JSON الإعداد المسبق:", + // [Auto-translated] "Copy" + copy: "نسخ", + // [Auto-translated] "Download" + download: "تحميل", + // [Auto-translated] "Load" + load: "حمل", + // [Auto-translated] "Save & Exit" + saveExit: "حفظ وإنهاء", + // [Auto-translated] "Back" + back: "ظهر", + // [Auto-translated] "Reset to default" + resetToDefault: "إعادة التعيين إلى الوضع الافتراضي", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "تمت استعادة جميع الإعدادات إلى الوضع الافتراضي", + // [Auto-translated] "resored to default" + resoredToDefault: "تمت إعادة إعادته إلى الافتراضي", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "تمت استعادة العنصر إلى الوضع الافتراضي", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "تمت استعادة الفئة إلى الوضع الافتراضي", + // [Auto-translated] "Edit" + edit: "حرر", + // [Auto-translated] "Save & Exit" + completeText: "حفظ وإنهاء", + // [Auto-translated] "Back" + pagePrevText: "ظهر" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "المسبقه", + // [Auto-translated] "Creator Presets" + creatorPresets: "الإعدادات المسبقة لمنشئي المحتوى", + // [Auto-translated] "Save & Exit" + save: "حفظ وإنهاء", + // [Auto-translated] "File" + file: "ملف", + // [Auto-translated] "Import" + import: "استورد", + // [Auto-translated] "Export" + export: "تصدير", + // [Auto-translated] "Edit" + edit: "حرر", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "إعادة تعيين اللغات إلى الوضع الافتراضي", + // [Auto-translated] "Reset all changes" + resetAll: "إعادة تعيين جميع التغييرات", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "إعادة تعيين {0} إلى الإعدادات الافتراضية" } }; const locale = getLocaleStrings("ar"); diff --git a/packages/survey-creator-core/src/presets/localization/bulgarian.ts b/packages/survey-creator-core/src/presets/localization/bulgarian.ts index 24b5f76bcc..c931f293d1 100644 --- a/packages/survey-creator-core/src/presets/localization/bulgarian.ts +++ b/packages/survey-creator-core/src/presets/localization/bulgarian.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const bgStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Езици", + // [Auto-translated] "Languages" + navigationTitle: "Езици", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Изберете езика на потребителския интерфейс на създателя на проучване и насочване\nезици за конфигурирането на проучването.", + // [Auto-translated] "Creator UI language" + creatorUI: "Език на потребителския интерфейс на създателя", + // [Auto-translated] "Survey languages" + surveyLanguages: "Езици на проучването", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Въведете за търсене...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Превод на имената на езици на проучването на английски" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Конфигуриране на раздели", + // [Auto-translated] "Tabs" + navigationTitle: "Раздели", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Изберете разделите, които искате да покажете, пренаредете ги, променете заглавията им,\nи изберете раздела, който ще бъде активен по подразбиране.", + // [Auto-translated] "Visible tabs" + items: "Видими раздели", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Скрити раздели", + // [Auto-translated] "Default tab" + defaultTab: "Раздел по подразбиране", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Плъзнете елемент от тази колона в лявата - той ще се появи видим в панела Раздели. Можете също така да премествате елементи с помощта на бутоните плюс (+) и минус (-).", + // [Auto-translated] "Name" + name: "Име", + // [Auto-translated] "Title" + titleField: "Заглавие", + // [Auto-translated] "Icon name" + iconName: "Име на иконата" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "Настройване на кутията с инструменти", + // [Auto-translated] "Toolbox" + navigationTitle: "Инструменти", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Изберете елементите на кутията с инструменти, които искате да покажете, групирайте ги в категории, \nПреименувайте ги и променяйте реда им, ако е необходимо.", + // [Auto-translated] "Toolbox" + toolbox: "Инструменти", + // [Auto-translated] "Categories" + categories: "Категории", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Скрити елементи от кутия с инструменти", + // [Auto-translated] "Enable grouping" + enableGrouping: "Активиране на групиране", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Показване на заглавия на категории", + // [Auto-translated] "Name" + categoryName: "Име", + // [Auto-translated] "Title" + categoryTitle: "Заглавие", + // [Auto-translated] "Tooltip" + tooltip: "Пояснение", + // [Auto-translated] "Icon name" + iconName: "Име на иконата", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "JSON обект, който да се приложи, когато потребителите изберат този елемент от кутията с инструменти", + // [Auto-translated] "Subcategories" + subcategories: "Подкатегории", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Активирайте поделементи за този въпрос...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Преместване като поделемент към...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Добави в кутията с инструменти", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Изтриване на персонализиран елемент", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Плъзнете елемент от тази колона в лявата - той ще се появи видим �� панела Toolbox. Можете също така да премествате елементи с помощта на бутоните плюс (+) и минус (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Нова категория", + // [Auto-translated] "New Item" + addCustomItem: "Нов артикул", + // [Auto-translated] "Add a new item" + addNewItem: "Добавяне на нов елемент", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Добавяне на нов поделемент", + // [Auto-translated] "There are no items" + noRowsText: "Няма артикули", + // [Auto-translated] "New item in" + newItem: "Нов артикул в" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Персонализиране на мрежата със свойства", + // [Auto-translated] "Property Grid" + navigationTitle: "Мрежа от имоти", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Изберете елемент, за да персонализирате настройките му, налични в мрежата със свойства.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Изберете елемент, за да персонализирате настройките му, налични в мрежата със свойства", + // [Auto-translated] "Property Grid" + propertyGrid: "Мрежа от имоти", + // [Auto-translated] "Unsorted items" + unsortedItems: "Несортирани елементи", + // [Auto-translated] "Name" + categoryName: "Име", + // [Auto-translated] "Title" + categoryTitle: "Заглавие", + // [Auto-translated] "Icon name" + iconName: "Име на иконата", + // [Auto-translated] "Name" + name: "Име", + // [Auto-translated] "Title" + titleField: "Заглавие", + // [Auto-translated] "Helper Text" + descriptionField: "Помощен текст", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Плъзнете елемент от тази колона в лявата - той ще се появи видим в панела Раздели. Можете също така да премествате елементи с помощта на бутоните плюс (+) и минус (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Добавяне на персонализирана категория" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Добавяне на нов елемент", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Добавяне на нов поделемент", + // [Auto-translated] "New item in" + newItem: "Нов артикул в", + // [Auto-translated] "New Category" + addCustomCategory: "Нова категория", + // [Auto-translated] "New category in" + newCategory: "Нова категория в", + // [Auto-translated] "Move to category..." + moveToCategory: "Преместване в категория...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Преместване в нова категория...", + // [Auto-translated] "Categories" + categoriesLabel: "Категории", + // [Auto-translated] "Move To..." + moveTo: "Преместете се към...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Премахване от {0}", + // [Auto-translated] "More" + more: "Още", + // [Auto-translated] "Restore" + restoreToDefault: "Възстановявам", + // [Auto-translated] "Edit" + edit: "Редактирам", + // [Auto-translated] "Expand" + expand: "Разширявам", + // [Auto-translated] "Collapse" + collapse: "Срив", + // [Auto-translated] "Remove" + remove: "Махам", + // [Auto-translated] "Add" + add: "Добавям", + // [Auto-translated] "Delete" + delete: "Изтривам" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Предварително зададени настройки за създатели", + // [Auto-translated] "Preset JSON:" + presetJson: "Предварително зададена JSON:", + // [Auto-translated] "Copy" + copy: "Копирам", + // [Auto-translated] "Download" + download: "Свалям", + // [Auto-translated] "Load" + load: "Товаря", + // [Auto-translated] "Save & Exit" + saveExit: "Запазване и излизане", + // [Auto-translated] "Back" + back: "Гръб", + // [Auto-translated] "Reset to default" + resetToDefault: "Нулиране по подразбиране", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Всички настройки са възстановени по подразбиране", + // [Auto-translated] "resored to default" + resoredToDefault: "Възстановено по подразбиране", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Елементът е възстановен по подразбиране", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Категорията е възстановена по подразбиране", + // [Auto-translated] "Edit" + edit: "Редактирам", + // [Auto-translated] "Save & Exit" + completeText: "Запазване и излизане", + // [Auto-translated] "Back" + pagePrevText: "Гръб" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "Настройки", + // [Auto-translated] "Creator Presets" + creatorPresets: "Предварително зададени настройки за създатели", + // [Auto-translated] "Save & Exit" + save: "Запазване и излизане", + // [Auto-translated] "File" + file: "Файл", + // [Auto-translated] "Import" + import: "Внос", + // [Auto-translated] "Export" + export: "Износ", + // [Auto-translated] "Edit" + edit: "Редактирам", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Нулиране на езиците по подразбиране", + // [Auto-translated] "Reset all changes" + resetAll: "Нулиране на всички промени", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Нулиране на {0} по подразбиране" } }; const locale = getLocaleStrings("bg"); diff --git a/packages/survey-creator-core/src/presets/localization/burmese.ts b/packages/survey-creator-core/src/presets/localization/burmese.ts index 6941af1bd6..0dd6378df9 100644 --- a/packages/survey-creator-core/src/presets/localization/burmese.ts +++ b/packages/survey-creator-core/src/presets/localization/burmese.ts @@ -1,118 +1,217 @@ import { getLocaleStrings } from "survey-creator-core"; -export const myStrings = { +export const mmStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "ဘာသာစကားများ", + // [Auto-translated] "Languages" + navigationTitle: "ဘာသာစကားများ", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "စစ်တမ်း ဖန်တီးသူ UI နှင့် ရည်မှန်းချက်၏ ဘာသာစကားကို ရွေးပါ\nစစ်တမ်းအတွက် ဘာသာစကားများကို စီစဉ်ဖွဲ့စည်းထားသည်။", + // [Auto-translated] "Creator UI language" + creatorUI: "ဖန်တီးသူ UI ဘာသာစကား", + // [Auto-translated] "Survey languages" + surveyLanguages: "စစ်တမ်း ဘာသာစကား များ", + // [Auto-translated] "Type to search..." + searchPlaceholder: "ရှာဖွေရန် ရိုက်ပါ...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "စစ်တမ်း ဘာသာစကား အမည် များ ကို အင်္ဂလိပ် သို့ ပြန်ဆို ပါ" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "စာမျက်နှာများကို စီစဉ်ဖန်တီးပါ", + // [Auto-translated] "Tabs" + navigationTitle: "စာမျက်နှာများ", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "ပြချင်တဲ့ စာမျက်နှာတွေကို ရွေးပါ၊ ပြန်စီစဉ်ပါ၊ ခေါင်းစဉ်ပြောင်း၊\nစံထားချက်အားဖြင့် လှုပ်ရှားမယ့် စာမျက်နှာကို ရွေးပါ။", + // [Auto-translated] "Visible tabs" + items: "မြင်နိုင်သော စာမျက်နှာခွဲများ", + // [Auto-translated] "Hidden tabs" + unsortedItems: "ဖုံးကွယ်ထားသော စာမျက်နှာများ", + // [Auto-translated] "Default tab" + defaultTab: "စံထားချက် စာမျက်နှာခွဲ", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "ဒီကော်လံကနေ ဘယ်ဘက်ကို အရာတစ်ခုကို ဆွဲလိုက်ပါ၊ Tabs ဘောင်ကွက်ထဲမှာ မြင်ရလိမ့်မယ်။ သင်သည် အပေါင်း(+)နှင့် အနုတ် (-) ခလုတ်များကိုသုံး၍ ပစ္စည်းများကို ရွှေ့ပြောင်းနိုင်ပါသည်။", + // [Auto-translated] "Name" + name: "အမည်", + // [Auto-translated] "Title" + titleField: "ခေါင်းစဉ်", + // [Auto-translated] "Icon name" + iconName: "အိုင်ကွန်အမည်" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "ကိရိယာအိတ်ကို ပြင်ဆင်ပါ", + // [Auto-translated] "Toolbox" + navigationTitle: "ကိရိယာအိတ်", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "ပြချင်တဲ့ ကိရိယာအိတ် အချက်အလက်တွေကို ရွေးပြီး အမျိုးအစားတွေအဖြစ် စုလိုက်ပါ။ \nအမည်ပြောင်းပြီး လိုအပ်ပါက အစဉ်ကို ပြောင်းလဲပါ။", + // [Auto-translated] "Toolbox" + toolbox: "ကိရိယာအိတ်", + // [Auto-translated] "Categories" + categories: "အမျိုးအစား", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "ဝှက်ထားတဲ့ ကိရိယာအိတ် အချက်အလက်များ", + // [Auto-translated] "Enable grouping" + enableGrouping: "အုပ်စုလိုက်ခွင့်ပြုပါ", + // [Auto-translated] "Show category titles" + showCategoryTitles: "အမျိုးအစားခေါင်းစဉ်များကို ပြပါ", + // [Auto-translated] "Name" + categoryName: "အမည်", + // [Auto-translated] "Title" + categoryTitle: "ခေါင်းစဉ်", + // [Auto-translated] "Tooltip" + tooltip: "ကိရိယာအကြံ���ြုချက်", + // [Auto-translated] "Icon name" + iconName: "အိုင်ကွန်အမည်", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "သုံးစွဲသူတွေက ဒီကိရိယာအိတ် အချက်အလက်ကို ရွေးတဲ့အခါ အသုံးချဖို့ JSON အရာဝတ္ထု", + // [Auto-translated] "Subcategories" + subcategories: "အမျိုးအစား ခွဲ များ", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "ဒီမေးခွန်းအတွက် အစိတ်အပိုင်းများကို ခွင့်ပြုပါ...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "အပိုင်းအပိုင်းတစ်ခုအဖြစ် ရွှေ့ပြောင်းပါ...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "ကိရိယာအိတ်ထဲသို့ ပေါင်းထည့်ပါ", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "စိတ်ကြိုက် အချက်အလက်ကို ပယ်ဖျက်ပါ", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "ဒီကော်လံကနေ ဘယ်ဘက်ကို အရာတစ်ခုကို ဆွဲလိုက်ပါ၊ ကိရိယာအိတ် ဘောင်ကွက်ထဲမှာ မြင်နိုင်ပါလိမ့်မယ်။ သင်သည် အပေါင်း(+)နှင့် အနုတ် (-) ခလုတ်များကိုသုံး၍ ပစ္စည်းများကို ရွှေ့ပြောင်းနိုင်ပါသည်။", + // [Auto-translated] "New Category" + addCustomCategory: "အမျိုးအစား အသစ်", + // [Auto-translated] "New Item" + addCustomItem: "ပစ္စည်းအသစ်", + // [Auto-translated] "Add a new item" + addNewItem: "အချက်အလက်အသစ်တစ်ခု ပေါင်းထည့်ပါ", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "အချက်အလက်ငယ် အသစ်တခုကို ပေါင်းထည့်ပါ", + // [Auto-translated] "There are no items" + noRowsText: "ပစ္စည်း များ မ ရှိ ပါ", + // [Auto-translated] "New item in" + newItem: "အချက်အလက်အသစ်" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Property Grid ကို စိတ်ကြိုက် ပြုလုပ်ပါ", + // [Auto-translated] "Property Grid" + navigationTitle: "ပိုင်ဆိုင်ရာဂရစ်ကွက်", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Property Grid ထဲမှာ ရရှိနိုင်တဲ့ ၎င်းရဲ့ ဆက်တင်မှုများကို စိတ်ကြိုက် ရွေးချယ်ပါ။", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Property Grid ထဲမှာ ရရှိနိုင်တဲ့ ၎င်းရဲ့ ဆက်တင်မှုများကို စိတ်ကြိုက်ရွေးချယ်ဖို့ အစိတ်အပိုင်းတခုကို ရွေးပါ", + // [Auto-translated] "Property Grid" + propertyGrid: "ပိုင်ဆိုင်ရာဂရစ်ကွက်", + // [Auto-translated] "Unsorted items" + unsortedItems: "မစီထားတဲ့ အရာဝတ္ထု", + // [Auto-translated] "Name" + categoryName: "အမည်", + // [Auto-translated] "Title" + categoryTitle: "ခေါင်းစဉ်", + // [Auto-translated] "Icon name" + iconName: "အိုင်ကွန်အမည်", + // [Auto-translated] "Name" + name: "အမည်", + // [Auto-translated] "Title" + titleField: "ခေါင်းစဉ်", + // [Auto-translated] "Helper Text" + descriptionField: "ကူညီသူ စာသား", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "ဒီကော်လံကနေ ဘယ်ဘက်ကို အရာတစ်ခုကို ဆွဲလိုက်ပါ၊ Tabs ဘောင်ကွက်ထဲမှာ မြင်ရလိမ့်မယ်။ သင်သည် အပေါင်း(+)နှင့် အနုတ် (-) ခလုတ်များကိုသုံး၍ ပစ္စည်းများကို ရွှေ့ပြောင်းနိုင်ပါသည်။", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "စိတ်ကြိုက် အမျိုးအစား ပေါင်းထည့်ပါ" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "အချက်အလက်အသစ်တစ်ခု ပေါင်းထည့်ပါ", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "အချက်အလက်ငယ် အသစ်တခုကို ပေါင်းထည့်ပါ", + // [Auto-translated] "New item in" + newItem: "အချက်အလက်အသစ်", + // [Auto-translated] "New Category" + addCustomCategory: "အမျိုးအစား အသစ်", + // [Auto-translated] "New category in" + newCategory: "အမျိုးအစားအသစ်", + // [Auto-translated] "Move to category..." + moveToCategory: "အမျိုးအစားသို့ ရွှေ့ပြောင်းပါ...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "အမျိုးအစားအသစ်သို့ ရွှေ့ပြောင်းပါ...", + // [Auto-translated] "Categories" + categoriesLabel: "အမျိုးအစား", + // [Auto-translated] "Move To..." + moveTo: "သို့ ရွှေ့ပြောင်းပါ...", + // [Auto-translated] "Remove from {0}" + removeFrom: "{0} မှ ဖယ်ရှား", + // [Auto-translated] "More" + more: "ပိုမို", + // [Auto-translated] "Restore" + restoreToDefault: "ပြန်လည်ထူထောင်ပါ", + // [Auto-translated] "Edit" + edit: "တည်းဖြတ်", + // [Auto-translated] "Expand" + expand: "ချဲ့ပါ", + // [Auto-translated] "Collapse" + collapse: "ပြိုလဲသွားပါ", + // [Auto-translated] "Remove" + remove: "ဖယ်ရှားပါ", + // [Auto-translated] "Add" + add: "ပေါင်းထည့်", + // [Auto-translated] "Delete" + delete: "ပယ်ဖျက်ပါ" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "ဖန်တီးသူ ကြိုတင်သတ်မှတ်ချက်များ", + // [Auto-translated] "Preset JSON:" + presetJson: "ကြိုတင်သတ်မှတ်ထားသော JSON -", + // [Auto-translated] "Copy" + copy: "မိတ္တူကူး", + // [Auto-translated] "Download" + download: "ကူးယူပါ", + // [Auto-translated] "Load" + load: "ဖွင့်ပါ", + // [Auto-translated] "Save & Exit" + saveExit: "သိမ်းဆည်း & ထွက်", + // [Auto-translated] "Back" + back: "နောက်ပြန်", + // [Auto-translated] "Reset to default" + resetToDefault: "စံထားချက်အတိုင်း ပြန်ချိန်ပါ", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "ဆက်တင်မှုအားလုံးကို စံထားချက်အတိုင်း ပြန်ထားပါ", + // [Auto-translated] "resored to default" + resoredToDefault: "စံထားချက်အတိုင်း ပြန်ပြောင်းထားသည်", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "အရာဝတ္ထုကို စံထားချက်အတိုင်း ပြန်ထားပါ", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "အမျိုးအစားကို စံထားချက်အတိုင်း ပြန်ထားပါ", + // [Auto-translated] "Edit" + edit: "တည်းဖြတ်", + // [Auto-translated] "Save & Exit" + completeText: "သိမ်းဆည်း & ထွက်", + // [Auto-translated] "Back" + pagePrevText: "နောက်ပြန်" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "ကြိုတင်သတ်မှတ်ချက်များ", + // [Auto-translated] "Creator Presets" + creatorPresets: "ဖန်တီးသူ ကြိုတင်သတ်မှတ်ချက်များ", + // [Auto-translated] "Save & Exit" + save: "သိမ်းဆည်း & ထွက်", + // [Auto-translated] "File" + file: "ဖိုင်", + // [Auto-translated] "Import" + import: "ထည့်သွင်း", + // [Auto-translated] "Export" + export: "ထုတ်ပို့", + // [Auto-translated] "Edit" + edit: "တည်းဖြတ်", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "ဘာသာစကားများကို စံထားချက်အတိုင်း ပြန်ချိန်ပါ", + // [Auto-translated] "Reset all changes" + resetAll: "အပြောင်းအလဲများ အားလုံးကို ပြန်ချိန်ပါ", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "{0} စံထားချက်အတိုင်း ပြန်ချိန်ပါ" } }; -const locale = getLocaleStrings("my"); -locale.presets = myStrings; +const locale = getLocaleStrings("mm"); +locale.presets = mmStrings; diff --git a/packages/survey-creator-core/src/presets/localization/croatian.ts b/packages/survey-creator-core/src/presets/localization/croatian.ts index 0e9a5dc408..61734caf49 100644 --- a/packages/survey-creator-core/src/presets/localization/croatian.ts +++ b/packages/survey-creator-core/src/presets/localization/croatian.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const hrStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Jezici", + // [Auto-translated] "Languages" + navigationTitle: "Jezici", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Odaberite jezik korisničkog sučelja i cilja Survey Creator\njezika za anketu koja se konfigurira.", + // [Auto-translated] "Creator UI language" + creatorUI: "Jezik korisničkog sučelja autora", + // [Auto-translated] "Survey languages" + surveyLanguages: "Anketni jezici", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Upišite za pretraživanje...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Prevedi nazive jezika ankete na engleski" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Konfiguriranje kartica", + // [Auto-translated] "Tabs" + navigationTitle: "Tabulatori", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Odaberite kartice koje želite prikazati, promijenite njihov redoslijed, promijenite njihove naslove,\ni odaberite karticu koja će biti aktivna prema zadanim postavkama.", + // [Auto-translated] "Visible tabs" + items: "Vidljive kartice", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Skrivene kartice", + // [Auto-translated] "Default tab" + defaultTab: "Zadana kartica", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Povucite stavku iz ovog stupca ulijevo - pojavit će se vidljiva na ploči Kartice. Također možete premještati stavke pomoću tipki plus (+) i minus (-).", + // [Auto-translated] "Name" + name: "Ime", + // [Auto-translated] "Title" + titleField: "Naslov", + // [Auto-translated] "Icon name" + iconName: "Naziv ikone" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "Postavljanje Toolboxa", + // [Auto-translated] "Toolbox" + navigationTitle: "Alatni okvir", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Odaberite stavke okvira s alatima koje želite prikazati, grupirajte ih u kategorije, \nPreimenujte ih i promijenite njihov redoslijed ako je potrebno.", + // [Auto-translated] "Toolbox" + toolbox: "Alatni okvir", + // [Auto-translated] "Categories" + categories: "Kategorije", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Skrivene stavke kutije s alatima", + // [Auto-translated] "Enable grouping" + enableGrouping: "Omogućivanje grupiranja", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Prikaži nazive kategorija", + // [Auto-translated] "Name" + categoryName: "Ime", + // [Auto-translated] "Title" + categoryTitle: "Naslov", + // [Auto-translated] "Tooltip" + tooltip: "Opis alata", + // [Auto-translated] "Icon name" + iconName: "Naziv ikone", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "JSON objekt koji će se primijeniti kada korisnici odaberu ovu stavku alata", + // [Auto-translated] "Subcategories" + subcategories: "Podkategorije", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Omogućite podstavke za ovo pitanje...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Premjesti kao podstavku u...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Dodaj u okvir s alatima", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Izbriši prilagođenu stavku", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Povucite stavku iz ovog stupca ulijevo - pojavit će se vidljiva na ploči Toolbox. Također možete premještati stavke pomoću tipki plus (+) i minus (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Nova kategorija", + // [Auto-translated] "New Item" + addCustomItem: "Nova stavka", + // [Auto-translated] "Add a new item" + addNewItem: "Dodavanje nove stavke", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Dodavanje nove podstavke", + // [Auto-translated] "There are no items" + noRowsText: "Nema stavki", + // [Auto-translated] "New item in" + newItem: "Nova stavka u" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Prilagodba rešetke svojstava", + // [Auto-translated] "Property Grid" + navigationTitle: "Mreža nekretnina", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Odaberite element da biste prilagodili njegove postavke dostupne u rešetki svojstava.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Odaberite element da biste prilagodili njegove postavke dostupne u rešetki svojstava", + // [Auto-translated] "Property Grid" + propertyGrid: "Mreža nekretnina", + // [Auto-translated] "Unsorted items" + unsortedItems: "Nerazvrstane stavke", + // [Auto-translated] "Name" + categoryName: "Ime", + // [Auto-translated] "Title" + categoryTitle: "Naslov", + // [Auto-translated] "Icon name" + iconName: "Naziv ikone", + // [Auto-translated] "Name" + name: "Ime", + // [Auto-translated] "Title" + titleField: "Naslov", + // [Auto-translated] "Helper Text" + descriptionField: "Pomoćni tekst", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Povucite stavku iz ovog stupca ulijevo - pojavit će se vidljiva na ploči Kartice. Također možete premještati stavke pomoću tipki plus (+) i minus (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Dodaj prilagođenu kategoriju" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Dodavanje nove stavke", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Dodavanje nove podstavke", + // [Auto-translated] "New item in" + newItem: "Nova stavka u", + // [Auto-translated] "New Category" + addCustomCategory: "Nova kategorija", + // [Auto-translated] "New category in" + newCategory: "Nova kategorija u", + // [Auto-translated] "Move to category..." + moveToCategory: "Premjesti u kategoriju...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Premjesti u novu kategoriju...", + // [Auto-translated] "Categories" + categoriesLabel: "Kategorije", + // [Auto-translated] "Move To..." + moveTo: "Premjesti u...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Uklonite iz {0}", + // [Auto-translated] "More" + more: "Više", + // [Auto-translated] "Restore" + restoreToDefault: "Vratiti", + // [Auto-translated] "Edit" + edit: "Urediti", + // [Auto-translated] "Expand" + expand: "Proširiti", + // [Auto-translated] "Collapse" + collapse: "Kolaps", + // [Auto-translated] "Remove" + remove: "Odstraniti", + // [Auto-translated] "Add" + add: "Dodati", + // [Auto-translated] "Delete" + delete: "Izbrisati" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Unaprijed postavljene postavke kreatora", + // [Auto-translated] "Preset JSON:" + presetJson: "Unaprijed postavljeni JSON:", + // [Auto-translated] "Copy" + copy: "Kopija", + // [Auto-translated] "Download" + download: "Preuzimanje", + // [Auto-translated] "Load" + load: "Opterećenje", + // [Auto-translated] "Save & Exit" + saveExit: "Spremi i izađi", + // [Auto-translated] "Back" + back: "Leđa", + // [Auto-translated] "Reset to default" + resetToDefault: "Vraćanje na zadane postavke", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Sve postavke vraćene na zadane postavke", + // [Auto-translated] "resored to default" + resoredToDefault: "resored na default", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Stavka vraćena na zadane postavke", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Kategorija vraćena na zadane postavke", + // [Auto-translated] "Edit" + edit: "Urediti", + // [Auto-translated] "Save & Exit" + completeText: "Spremi i izađi", + // [Auto-translated] "Back" + pagePrevText: "Leđa" }, plugin: { + // [Auto-translated] "Presets" presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Creator Presets" + creatorPresets: "Unaprijed postavljene postavke kreatora", + // [Auto-translated] "Save & Exit" + save: "Spremi i izađi", + // [Auto-translated] "File" + file: "Datoteka", + // [Auto-translated] "Import" + import: "Uvoz", + // [Auto-translated] "Export" + export: "Izvoz", + // [Auto-translated] "Edit" + edit: "Urediti", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Vratite jezike na zadane", + // [Auto-translated] "Reset all changes" + resetAll: "Poništi sve promjene", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Vraćanje {0} na zadane postavke" } }; const locale = getLocaleStrings("hr"); diff --git a/packages/survey-creator-core/src/presets/localization/czech.ts b/packages/survey-creator-core/src/presets/localization/czech.ts index d93a4daaa1..548f3d5541 100644 --- a/packages/survey-creator-core/src/presets/localization/czech.ts +++ b/packages/survey-creator-core/src/presets/localization/czech.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const csStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Jazyky", + // [Auto-translated] "Languages" + navigationTitle: "Jazyky", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Vyberte jazyk uživatelského rozhraní a cíle aplikace Survey Creator\njazyky konfigurovaného průzkumu.", + // [Auto-translated] "Creator UI language" + creatorUI: "Jazyk uživatelského rozhraní tvůrce", + // [Auto-translated] "Survey languages" + surveyLanguages: "Jazyky průzkumu", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Zadejte pro vyhledávání...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Přeložte názvy zeměměřických jazyků do angličtiny" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Konfigurace karet", + // [Auto-translated] "Tabs" + navigationTitle: "Tabulátory", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Vyberte karty, které chcete zobrazit, změňte jejich pořadí, změňte jejich názvy,\na vyberte kartu, která bude ve výchozím nastavení aktivní.", + // [Auto-translated] "Visible tabs" + items: "Viditelné karty", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Skryté karty", + // [Auto-translated] "Default tab" + defaultTab: "Výchozí karta", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Přetáhněte položku z tohoto sloupce do levého sloupce - zobrazí se viditelná v panelu Karty. Položky můžete také přesouvat pomocí tlačítek plus (+) a mínus (-).", + // [Auto-translated] "Name" + name: "Jméno", + // [Auto-translated] "Title" + titleField: "Titul", + // [Auto-translated] "Icon name" + iconName: "Název ikony" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "Nastavení panelu nástrojů", + // [Auto-translated] "Toolbox" + navigationTitle: "Souprava nářadí", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Vyberte položky panelu nástrojů, které chcete zobrazit, seskupte je do kategorií, \nPřejmenujte je a v případě potřeby změňte jejich pořadí.", + // [Auto-translated] "Toolbox" + toolbox: "Souprava nářadí", + // [Auto-translated] "Categories" + categories: "Kategorie", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Skryté položky panelu nástrojů", + // [Auto-translated] "Enable grouping" + enableGrouping: "Povolit seskupení", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Zobrazit názvy kategorií", + // [Auto-translated] "Name" + categoryName: "Jméno", + // [Auto-translated] "Title" + categoryTitle: "Titul", + // [Auto-translated] "Tooltip" + tooltip: "Popisek nástroje", + // [Auto-translated] "Icon name" + iconName: "Název ikony", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "Objekt JSON, který se použije, když uživatelé vyberou tuto položku panelu nástrojů", + // [Auto-translated] "Subcategories" + subcategories: "Podkategorie", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Povolit podpoložky pro tuto otázku...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Přesunout jako podpoložku do...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Přidat do panelu nástrojů", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Odstranit vlastní položku", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Přetáhněte položku z tohoto sloupce do levého - zobrazí se viditelná v panelu Toolbox. Položky můžete také přesouvat pomocí tlačítek plus (+) a mínus (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Nová kategorie", + // [Auto-translated] "New Item" + addCustomItem: "Nová položka", + // [Auto-translated] "Add a new item" + addNewItem: "Přidat novou položku", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Přidání nové podpoložky", + // [Auto-translated] "There are no items" + noRowsText: "Nejsou zde žádné položky", + // [Auto-translated] "New item in" + newItem: "Nová položka v" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Přizpůsobení mřížky vlastností", + // [Auto-translated] "Property Grid" + navigationTitle: "Mřížka vlastností", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Vyberte prvek, jehož nastavení je k dispozici v mřížce vlastností.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Vyberte prvek, jehož nastavení je k dispozici v mřížce vlastností", + // [Auto-translated] "Property Grid" + propertyGrid: "Mřížka vlastností", + // [Auto-translated] "Unsorted items" + unsortedItems: "Neseřazené položky", + // [Auto-translated] "Name" + categoryName: "Jméno", + // [Auto-translated] "Title" + categoryTitle: "Titul", + // [Auto-translated] "Icon name" + iconName: "Název ikony", + // [Auto-translated] "Name" + name: "Jméno", + // [Auto-translated] "Title" + titleField: "Titul", + // [Auto-translated] "Helper Text" + descriptionField: "Pomocný text", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Přetáhněte položku z tohoto sloupce do levého sloupce - zobrazí se viditelná v panelu Karty. Položky můžete také přesouvat pomocí tlačítek plus (+) a mínus (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Přidat vlastní kategorii" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Přidat novou položku", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Přidání nové podpoložky", + // [Auto-translated] "New item in" + newItem: "Nová položka v", + // [Auto-translated] "New Category" + addCustomCategory: "Nová kategorie", + // [Auto-translated] "New category in" + newCategory: "Nová kategorie v", + // [Auto-translated] "Move to category..." + moveToCategory: "Přesunout do kategorie...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Přesunout do nové kategorie...", + // [Auto-translated] "Categories" + categoriesLabel: "Kategorie", + // [Auto-translated] "Move To..." + moveTo: "Přesunout do...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Odebrat z {0}", + // [Auto-translated] "More" + more: "Více", + // [Auto-translated] "Restore" + restoreToDefault: "Obnovit", + // [Auto-translated] "Edit" + edit: "Upravit", + // [Auto-translated] "Expand" + expand: "Expandovat", + // [Auto-translated] "Collapse" + collapse: "Zhroucení", + // [Auto-translated] "Remove" + remove: "Odstranit", + // [Auto-translated] "Add" + add: "Přidat", + // [Auto-translated] "Delete" + delete: "Vymazat" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Předvolby pro tvůrce", + // [Auto-translated] "Preset JSON:" + presetJson: "Přednastavený kód JSON:", + // [Auto-translated] "Copy" + copy: "Kopírovat", + // [Auto-translated] "Download" + download: "Stáhnout", + // [Auto-translated] "Load" + load: "Náklad", + // [Auto-translated] "Save & Exit" + saveExit: "Uložit a ukončit", + // [Auto-translated] "Back" + back: "Hřbet", + // [Auto-translated] "Reset to default" + resetToDefault: "Obnovit výchozí nastavení", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Všechna nastavení byla obnovena na výchozí hodnoty", + // [Auto-translated] "resored to default" + resoredToDefault: "Změněno na výchozí", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Položka obnovena na výchozí nastavení", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Kategorie obnovena na výchozí", + // [Auto-translated] "Edit" + edit: "Upravit", + // [Auto-translated] "Save & Exit" + completeText: "Uložit a ukončit", + // [Auto-translated] "Back" + pagePrevText: "Hřbet" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "Přednastavuje", + // [Auto-translated] "Creator Presets" + creatorPresets: "Předvolby pro tvůrce", + // [Auto-translated] "Save & Exit" + save: "Uložit a ukončit", + // [Auto-translated] "File" + file: "Soubor", + // [Auto-translated] "Import" + import: "Dovoz", + // [Auto-translated] "Export" + export: "Vývoz", + // [Auto-translated] "Edit" + edit: "Upravit", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Obnovení jazyků na výchozí", + // [Auto-translated] "Reset all changes" + resetAll: "Obnovit všechny změny", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Obnovení {0} na výchozí hodnoty" } }; const locale = getLocaleStrings("cs"); diff --git a/packages/survey-creator-core/src/presets/localization/danish.ts b/packages/survey-creator-core/src/presets/localization/danish.ts index 46244d88ef..adf41bbcb4 100644 --- a/packages/survey-creator-core/src/presets/localization/danish.ts +++ b/packages/survey-creator-core/src/presets/localization/danish.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const daStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Sprog", + // [Auto-translated] "Languages" + navigationTitle: "Sprog", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Vælg sproget for brugergrænsefladen og målet for Survey Creator\nsprog til den undersøgelse, der konfigureres.", + // [Auto-translated] "Creator UI language" + creatorUI: "Sprog i brugergrænsefladen for skabere", + // [Auto-translated] "Survey languages" + surveyLanguages: "Sprog til spørgeundersøgelser", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Skriv for at søge...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Oversæt navne på undersøgelsessprog til engelsk" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Konfigurere faner", + // [Auto-translated] "Tabs" + navigationTitle: "Faner", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Vælg de faner, du vil vise, omarranger dem, skift deres titler,\nog vælg den fane, der skal være aktiv som standard.", + // [Auto-translated] "Visible tabs" + items: "Synlige faner", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Skjulte faner", + // [Auto-translated] "Default tab" + defaultTab: "Fanen Standard", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Træk et element fra denne kolonne til venstre - det vises synligt i panelet Faner. Du kan også flytte elementer ved hjælp af plus- (+) og minusknapperne (-).", + // [Auto-translated] "Name" + name: "Navn", + // [Auto-translated] "Title" + titleField: "Titel", + // [Auto-translated] "Icon name" + iconName: "Ikon navn" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "Opsætning af værktøjskassen", + // [Auto-translated] "Toolbox" + navigationTitle: "Værktøjskasse", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Vælg de værktøjskasseelementer, du vil vise, gruppér dem i kategorier, \nomdøb dem, og skift deres rækkefølge, hvis det er nødvendigt.", + // [Auto-translated] "Toolbox" + toolbox: "Værktøjskasse", + // [Auto-translated] "Categories" + categories: "Kategorier", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Skjulte elementer i værktøjskassen", + // [Auto-translated] "Enable grouping" + enableGrouping: "Aktivere gruppering", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Vis kategorititler", + // [Auto-translated] "Name" + categoryName: "Navn", + // [Auto-translated] "Title" + categoryTitle: "Titel", + // [Auto-translated] "Tooltip" + tooltip: "Værktøjstip", + // [Auto-translated] "Icon name" + iconName: "Ikon navn", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "JSON-objekt, der skal anvendes, når brugere vælger dette værktøjskasseelement", + // [Auto-translated] "Subcategories" + subcategories: "Underkategorier", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Aktiver underelementer for dette spørgsmål...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Flyt som et underemne til...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Føj til værktøjskasse", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Slet brugerdefineret element", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Træk et element fra denne kolonne til venstre - det vises synligt i værktøjskassepanelet. Du kan også flytte elementer ved hjælp af plus- (+) og minusknapperne (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Ny kategori", + // [Auto-translated] "New Item" + addCustomItem: "Ny vare", + // [Auto-translated] "Add a new item" + addNewItem: "Tilføj et nyt element", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Tilføj et nyt underelement", + // [Auto-translated] "There are no items" + noRowsText: "Der er ingen varer", + // [Auto-translated] "New item in" + newItem: "Ny vare i" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Tilpas egenskabsgitteret", + // [Auto-translated] "Property Grid" + navigationTitle: "Ejendom Grid", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Vælg et element for at tilpasse dets indstillinger, der er tilgængelige i egenskabsgitteret.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Vælg et element for at tilpasse de indstillinger, der er tilgængelige i egenskabsgitteret", + // [Auto-translated] "Property Grid" + propertyGrid: "Ejendom Grid", + // [Auto-translated] "Unsorted items" + unsortedItems: "Usorterede elementer", + // [Auto-translated] "Name" + categoryName: "Navn", + // [Auto-translated] "Title" + categoryTitle: "Titel", + // [Auto-translated] "Icon name" + iconName: "Ikon navn", + // [Auto-translated] "Name" + name: "Navn", + // [Auto-translated] "Title" + titleField: "Titel", + // [Auto-translated] "Helper Text" + descriptionField: "Hjælper tekst", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Træk et element fra denne kolonne til venstre - det vises synligt i panelet Faner. Du kan også flytte elementer ved hjælp af plus- (+) og minusknapperne (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Tilføj brugerdefineret kategori" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Tilføj et nyt element", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Tilføj et nyt underelement", + // [Auto-translated] "New item in" + newItem: "Ny vare i", + // [Auto-translated] "New Category" + addCustomCategory: "Ny kategori", + // [Auto-translated] "New category in" + newCategory: "Ny kategori i", + // [Auto-translated] "Move to category..." + moveToCategory: "Flyt til kategori...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Flyt til ny kategori...", + // [Auto-translated] "Categories" + categoriesLabel: "Kategorier", + // [Auto-translated] "Move To..." + moveTo: "Flyt til...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Fjern fra {0}", + // [Auto-translated] "More" + more: "Mere", + // [Auto-translated] "Restore" + restoreToDefault: "Genskabe", + // [Auto-translated] "Edit" + edit: "Redigere", + // [Auto-translated] "Expand" + expand: "Ekspandere", + // [Auto-translated] "Collapse" + collapse: "Sammenbrud", + // [Auto-translated] "Remove" + remove: "Fjerne", + // [Auto-translated] "Add" + add: "Tilføje", + // [Auto-translated] "Delete" + delete: "Slette" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Forudindstillinger for skabere", + // [Auto-translated] "Preset JSON:" + presetJson: "Forudindstillet JSON:", + // [Auto-translated] "Copy" + copy: "Eksemplar", + // [Auto-translated] "Download" + download: "Downloade", + // [Auto-translated] "Load" + load: "Læs", + // [Auto-translated] "Save & Exit" + saveExit: "Gem og afslut", + // [Auto-translated] "Back" + back: "Ryg", + // [Auto-translated] "Reset to default" + resetToDefault: "Nulstil til standard", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Alle indstillinger gendannet til standard", + // [Auto-translated] "resored to default" + resoredToDefault: "Omdannet til misligholdelse", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Element gendannet til standard", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Kategori gendannet til standard", + // [Auto-translated] "Edit" + edit: "Redigere", + // [Auto-translated] "Save & Exit" + completeText: "Gem og afslut", + // [Auto-translated] "Back" + pagePrevText: "Ryg" }, plugin: { + // [Auto-translated] "Presets" presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", + // [Auto-translated] "Creator Presets" + creatorPresets: "Forudindstillinger for skabere", + // [Auto-translated] "Save & Exit" + save: "Gem og afslut", + // [Auto-translated] "File" + file: "Fil", + // [Auto-translated] "Import" import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Export" + export: "Eksport", + // [Auto-translated] "Edit" + edit: "Redigere", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Nulstil sprog til standard", + // [Auto-translated] "Reset all changes" + resetAll: "Nulstil alle ændringer", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Nulstil {0} til standardindstillinger" } }; const locale = getLocaleStrings("da"); diff --git a/packages/survey-creator-core/src/presets/localization/dutch.ts b/packages/survey-creator-core/src/presets/localization/dutch.ts index ca015c8c05..1aa22728cf 100644 --- a/packages/survey-creator-core/src/presets/localization/dutch.ts +++ b/packages/survey-creator-core/src/presets/localization/dutch.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const nlStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Talen", + // [Auto-translated] "Languages" + navigationTitle: "Talen", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Selecteer de taal van de gebruikersinterface en het doel van Survey Creator\ntalen voor de enquête die wordt geconfigureerd.", + // [Auto-translated] "Creator UI language" + creatorUI: "UI-taal voor makers", + // [Auto-translated] "Survey languages" + surveyLanguages: "Talen voor enquêtes", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Typ om te zoeken...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Taalnamen van enquêtes vertalen naar het Engels" }, tabs: { - title: "Configure tabs", + // [Auto-translated] "Configure tabs" + title: "Tabbladen configureren", + // [Auto-translated] "Tabs" navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Selecteer de tabbladen die u wilt weergeven, herschik ze, wijzig hun titels,\nen kies het tabblad dat standaard actief zal zijn.", + // [Auto-translated] "Visible tabs" + items: "Zichtbare tabbladen", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Verborgen tabbladen", + // [Auto-translated] "Default tab" + defaultTab: "Tabblad Standaard", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Sleep een item van deze kolom naar de linkerkolom - het wordt zichtbaar weergegeven in het deelvenster Tabbladen. U kunt ook items verplaatsen met behulp van de plus- (+) en minknop (-).", + // [Auto-translated] "Name" + name: "Naam", + // [Auto-translated] "Title" + titleField: "Titel", + // [Auto-translated] "Icon name" + iconName: "Naam pictogram" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "De toolbox instellen", + // [Auto-translated] "Toolbox" + navigationTitle: "Gereedschapskist", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Selecteer de items in de gereedschapskist die u wilt weergeven, groepeer ze in categorieën, \nHernoem ze en wijzig hun volgorde indien nodig.", + // [Auto-translated] "Toolbox" + toolbox: "Gereedschapskist", + // [Auto-translated] "Categories" + categories: "Categorieën", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Verborgen gereedschapskistitems", + // [Auto-translated] "Enable grouping" + enableGrouping: "Groeperen inschakelen", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Titels van categorieën weergeven", + // [Auto-translated] "Name" + categoryName: "Naam", + // [Auto-translated] "Title" + categoryTitle: "Titel", + // [Auto-translated] "Tooltip" + tooltip: "Knopinfo", + // [Auto-translated] "Icon name" + iconName: "Naam pictogram", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "JSON-object dat moet worden toegepast wanneer gebruikers dit toolbox-item selecteren", + // [Auto-translated] "Subcategories" + subcategories: "Subcategorieën", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Schakel subitems in voor deze vraag...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Verplaats als subitem naar...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Toevoegen aan Toolbox", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Aangepast item verwijderen", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Sleep een item van deze kolom naar de linkerkolom - het wordt zichtbaar weergegeven in het deelvenster Gereedschapsset. U kunt ook items verplaatsen met behulp van de plus- (+) en minknop (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Nieuwe categorie", + // [Auto-translated] "New Item" + addCustomItem: "Nieuw item", + // [Auto-translated] "Add a new item" + addNewItem: "Een nieuw item toevoegen", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Een nieuw subitem toevoegen", + // [Auto-translated] "There are no items" + noRowsText: "Er zijn geen artikelen", + // [Auto-translated] "New item in" + newItem: "Nieuw item in" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Het eigenschappenraster aanpassen", + // [Auto-translated] "Property Grid" + navigationTitle: "Eigendom raster", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Selecteer een element om de instellingen aan te passen die beschikbaar zijn in het eigenschappenraster.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Selecteer een element om de instellingen aan te passen die beschikbaar zijn in het eigenschappenraster", + // [Auto-translated] "Property Grid" + propertyGrid: "Eigendom raster", + // [Auto-translated] "Unsorted items" + unsortedItems: "Ongesorteerde artikelen", + // [Auto-translated] "Name" + categoryName: "Naam", + // [Auto-translated] "Title" + categoryTitle: "Titel", + // [Auto-translated] "Icon name" + iconName: "Naam pictogram", + // [Auto-translated] "Name" + name: "Naam", + // [Auto-translated] "Title" + titleField: "Titel", + // [Auto-translated] "Helper Text" + descriptionField: "Helper Tekst", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Sleep een item van deze kolom naar de linkerkolom - het wordt zichtbaar weergegeven in het deelvenster Tabbladen. U kunt ook items verplaatsen met behulp van de plus- (+) en minknop (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Aangepaste categorie toevoegen" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Een nieuw item toevoegen", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Een nieuw subitem toevoegen", + // [Auto-translated] "New item in" + newItem: "Nieuw item in", + // [Auto-translated] "New Category" + addCustomCategory: "Nieuwe categorie", + // [Auto-translated] "New category in" + newCategory: "Nieuwe categorie in", + // [Auto-translated] "Move to category..." + moveToCategory: "Verplaatsen naar categorie...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Verplaatsen naar nieuwe categorie...", + // [Auto-translated] "Categories" + categoriesLabel: "Categorieën", + // [Auto-translated] "Move To..." + moveTo: "Verplaatsen naar...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Verwijderen uit {0}", + // [Auto-translated] "More" + more: "Meer", + // [Auto-translated] "Restore" + restoreToDefault: "Herstellen", + // [Auto-translated] "Edit" + edit: "Bewerken", + // [Auto-translated] "Expand" + expand: "Uitbreiden", + // [Auto-translated] "Collapse" + collapse: "Instorting", + // [Auto-translated] "Remove" + remove: "Verwijderen", + // [Auto-translated] "Add" + add: "Toevoegen", + // [Auto-translated] "Delete" + delete: "Verwijderen" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Voorinstellingen voor makers", + // [Auto-translated] "Preset JSON:" + presetJson: "Vooraf ingestelde JSON:", + // [Auto-translated] "Copy" + copy: "Kopiëren", + // [Auto-translated] "Download" + download: "Downloaden", + // [Auto-translated] "Load" + load: "Lading", + // [Auto-translated] "Save & Exit" + saveExit: "Opslaan en afsluiten", + // [Auto-translated] "Back" + back: "Terug", + // [Auto-translated] "Reset to default" + resetToDefault: "Reset naar standaard", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Alle instellingen hersteld naar de standaardinstellingen", + // [Auto-translated] "resored to default" + resoredToDefault: "teruggezet naar standaard", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Item hersteld naar standaard", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Categorie hersteld naar standaard", + // [Auto-translated] "Edit" + edit: "Bewerken", + // [Auto-translated] "Save & Exit" + completeText: "Opslaan en afsluiten", + // [Auto-translated] "Back" + pagePrevText: "Terug" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "Voorinstellingen", + // [Auto-translated] "Creator Presets" + creatorPresets: "Voorinstellingen voor makers", + // [Auto-translated] "Save & Exit" + save: "Opslaan en afsluiten", + // [Auto-translated] "File" + file: "Bestand", + // [Auto-translated] "Import" + import: "Importeren", + // [Auto-translated] "Export" + export: "Exporteren", + // [Auto-translated] "Edit" + edit: "Bewerken", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Talen terugzetten naar de standaardinstelling", + // [Auto-translated] "Reset all changes" + resetAll: "Alle wijzigingen opnieuw instellen", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "De standaardinstellingen van {0} terugzetten" } }; const locale = getLocaleStrings("nl"); diff --git a/packages/survey-creator-core/src/presets/localization/finnish.ts b/packages/survey-creator-core/src/presets/localization/finnish.ts index 831ce0b037..f2700ad9eb 100644 --- a/packages/survey-creator-core/src/presets/localization/finnish.ts +++ b/packages/survey-creator-core/src/presets/localization/finnish.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const fiStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Kielet", + // [Auto-translated] "Languages" + navigationTitle: "Kielet", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Valitse kyselyn luojan käyttöliittymän ja kohteen kieli\nmääritettävän kyselyn kielet.", + // [Auto-translated] "Creator UI language" + creatorUI: "Sisällöntuottajan käyttöliittymän kieli", + // [Auto-translated] "Survey languages" + surveyLanguages: "Kyselyn kielet", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Kirjoita etsiäksesi...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Käännä kyselyn kielten nimet englanniksi" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Välilehtien määrittäminen", + // [Auto-translated] "Tabs" + navigationTitle: "Välilehdet", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Valitse välilehdet, jotka haluat näyttää, järjestä ne uudelleen, muuta niiden otsikoita,\nja valitse välilehti, joka on oletuksena aktiivinen.", + // [Auto-translated] "Visible tabs" + items: "Näkyvät välilehdet", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Piilotetut välilehdet", + // [Auto-translated] "Default tab" + defaultTab: "Oletus-välilehti", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Vedä kohde tästä sarakkeesta vasemmalle - se näkyy Välilehdet-paneelissa. Voit myös siirtää kohteita plus- (+) ja miinuspainikkeilla (-).", + // [Auto-translated] "Name" + name: "Nimi", + // [Auto-translated] "Title" + titleField: "Nimike", + // [Auto-translated] "Icon name" + iconName: "Kuvakkeen nimi" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "Työkalupakin käyttöönotto", + // [Auto-translated] "Toolbox" + navigationTitle: "Työkalupakki", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Valitse näytettävät työkalupakin kohteet, ryhmittele ne luokkiin, \nNimeä ne uudelleen ja muuta niiden järjestystä tarvittaessa.", + // [Auto-translated] "Toolbox" + toolbox: "Työkalupakki", + // [Auto-translated] "Categories" + categories: "Luokat", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Piilotetut työkalupakin kohteet", + // [Auto-translated] "Enable grouping" + enableGrouping: "Ota ryhmittely käyttöön", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Näytä kategorioiden otsikot", + // [Auto-translated] "Name" + categoryName: "Nimi", + // [Auto-translated] "Title" + categoryTitle: "Nimike", + // [Auto-translated] "Tooltip" + tooltip: "Työkaluvihje", + // [Auto-translated] "Icon name" + iconName: "Kuvakkeen nimi", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "JSON-objekti, jota käytetään, kun käyttäjät valitsevat tämän työkalupalkin kohteen", + // [Auto-translated] "Subcategories" + subcategories: "Alaluokat", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Ota tämän kysymyksen alakohdat käyttöön...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Siirrä alikohteena...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Lisää työkalupakkiin", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Poista mukautettu kohde", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Vedä kohde tästä sarakkeesta vasemmalle - se näkyy Työkalupakki-paneelissa. Voit myös siirtää kohteita plus- (+) ja miinuspainikkeilla (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Uusi luokka", + // [Auto-translated] "New Item" + addCustomItem: "Uusi tuote", + // [Auto-translated] "Add a new item" + addNewItem: "Lisää uusi kohde", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Lisää uusi alakohde", + // [Auto-translated] "There are no items" + noRowsText: "Ei ole kohteita", + // [Auto-translated] "New item in" + newItem: "Uusi kohde" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Mukauta ominaisuusruudukkoa", + // [Auto-translated] "Property Grid" + navigationTitle: "Ominaisuuden ruudukko", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Valitse elementti, jos haluat mukauttaa sen asetuksia, jotka ovat käytettävissä ominaisuusruudukossa.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Valitse elementti, jos haluat mukauttaa sen asetuksia, jotka ovat käytettävissä ominaisuusruudukossa", + // [Auto-translated] "Property Grid" + propertyGrid: "Ominaisuuden ruudukko", + // [Auto-translated] "Unsorted items" + unsortedItems: "Lajittelemattomat kohteet", + // [Auto-translated] "Name" + categoryName: "Nimi", + // [Auto-translated] "Title" + categoryTitle: "Nimike", + // [Auto-translated] "Icon name" + iconName: "Kuvakkeen nimi", + // [Auto-translated] "Name" + name: "Nimi", + // [Auto-translated] "Title" + titleField: "Nimike", + // [Auto-translated] "Helper Text" + descriptionField: "Aputeksti", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Vedä kohde tästä sarakkeesta vasemmalle - se näkyy Välilehdet-paneelissa. Voit myös siirtää kohteita plus- (+) ja miinuspainikkeilla (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Lisää mukautettu luokka" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Lisää uusi kohde", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Lisää uusi alakohde", + // [Auto-translated] "New item in" + newItem: "Uusi kohde", + // [Auto-translated] "New Category" + addCustomCategory: "Uusi luokka", + // [Auto-translated] "New category in" + newCategory: "Uusi luokka", + // [Auto-translated] "Move to category..." + moveToCategory: "Siirrä luokkaan...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Siirrä uuteen luokkaan...", + // [Auto-translated] "Categories" + categoriesLabel: "Luokat", + // [Auto-translated] "Move To..." + moveTo: "Siirrä...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Poista {0}", + // [Auto-translated] "More" + more: "Enemmän", + // [Auto-translated] "Restore" + restoreToDefault: "Palauttaa", + // [Auto-translated] "Edit" + edit: "Muokata", + // [Auto-translated] "Expand" + expand: "Laajentaa", + // [Auto-translated] "Collapse" + collapse: "Romahdus", + // [Auto-translated] "Remove" + remove: "Poistaa", + // [Auto-translated] "Add" + add: "Lisätä", + // [Auto-translated] "Delete" + delete: "Poistaa" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Luojan esiasetukset", + // [Auto-translated] "Preset JSON:" + presetJson: "Esiasetettu JSON:", + // [Auto-translated] "Copy" + copy: "Kopioida", + // [Auto-translated] "Download" + download: "Ladata", + // [Auto-translated] "Load" + load: "Kuorma", + // [Auto-translated] "Save & Exit" + saveExit: "Tallenna ja poistu", + // [Auto-translated] "Back" + back: "Selkä", + // [Auto-translated] "Reset to default" + resetToDefault: "Palauta oletusasetukset", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Kaikki asetukset palautettu oletusasetuksiin", + // [Auto-translated] "resored to default" + resoredToDefault: "palautettu oletusarvoon", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Kohde palautettu oletusarvoon", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Luokka palautettu oletusarvoon", + // [Auto-translated] "Edit" + edit: "Muokata", + // [Auto-translated] "Save & Exit" + completeText: "Tallenna ja poistu", + // [Auto-translated] "Back" + pagePrevText: "Selkä" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "Esiasetukset", + // [Auto-translated] "Creator Presets" + creatorPresets: "Luojan esiasetukset", + // [Auto-translated] "Save & Exit" + save: "Tallenna ja poistu", + // [Auto-translated] "File" + file: "Tiedosto", + // [Auto-translated] "Import" + import: "Tuoda", + // [Auto-translated] "Export" + export: "Vienti", + // [Auto-translated] "Edit" + edit: "Muokata", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Palauta kielet oletusasetuksiin", + // [Auto-translated] "Reset all changes" + resetAll: "Palauta kaikki muutokset", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Palauta {0} oletusasetuksiin" } }; const locale = getLocaleStrings("fi"); diff --git a/packages/survey-creator-core/src/presets/localization/french.ts b/packages/survey-creator-core/src/presets/localization/french.ts index 259a8490b3..cd25929c36 100644 --- a/packages/survey-creator-core/src/presets/localization/french.ts +++ b/packages/survey-creator-core/src/presets/localization/french.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const frStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Traduction", + // [Auto-translated] "Languages" + navigationTitle: "Traduction", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Sélectionnez la langue de l’interface utilisateur du créateur d’enquête et ciblez-la.\nlangues de l’enquête en cours de configuration.", + // [Auto-translated] "Creator UI language" + creatorUI: "Langue de l’interface utilisateur du créateur", + // [Auto-translated] "Survey languages" + surveyLanguages: "Langues de l’enquête", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Tapez pour rechercher...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Traduire les noms de langues de l’enquête en anglais" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Configurer les onglets", + // [Auto-translated] "Tabs" + navigationTitle: "Onglets", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Sélectionnez les onglets que vous souhaitez afficher, réorganisez-les, modifiez leurs titres,\net choisissez l’onglet qui sera actif par défaut.", + // [Auto-translated] "Visible tabs" + items: "Onglets visibles", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Onglets cachés", + // [Auto-translated] "Default tab" + defaultTab: "Onglet par défaut", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Faites glisser un élément de cette colonne vers la gauche - il apparaîtra visible dans le panneau Onglets. Vous pouvez également déplacer des éléments à l’aide des boutons plus (+) et moins (-).", + // [Auto-translated] "Name" + name: "Nom", + // [Auto-translated] "Title" + titleField: "Titre", + // [Auto-translated] "Icon name" + iconName: "Nom de l’icône" }, toolbox: { - title: "Set up the Toolbox", + // [Auto-translated] "Set up the Toolbox" + title: "Configurer la boîte à outils", + // [Auto-translated] "Toolbox" navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Sélectionnez les éléments de la boîte à outils que vous souhaitez afficher, regroupez-les en catégories, \nRenommez-les et modifiez leur ordre si nécessaire.", + // [Auto-translated] "Toolbox" toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Categories" + categories: "Catégories", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Éléments de boîte à outils cachés", + // [Auto-translated] "Enable grouping" + enableGrouping: "Activer le regroupement", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Afficher les titres des catégories", + // [Auto-translated] "Name" + categoryName: "Nom", + // [Auto-translated] "Title" + categoryTitle: "Titre", + // [Auto-translated] "Tooltip" + tooltip: "Infobulle", + // [Auto-translated] "Icon name" + iconName: "Nom de l’icône", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "Objet JSON à appliquer lorsque les utilisateurs sélectionnent cet élément de la boîte à outils", + // [Auto-translated] "Subcategories" + subcategories: "Sous-catégories", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Activez les sous-éléments pour cette question...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Déplacer en tant que sous-élément vers...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Ajouter à la boîte à outils", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Supprimer un élément personnalisé", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Faites glisser un élément de cette colonne vers la gauche - il apparaîtra visible dans le panneau Boîte à outils. Vous pouvez également déplacer des éléments à l’aide des boutons plus (+) et moins (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Nouvelle catégorie", + // [Auto-translated] "New Item" + addCustomItem: "Nouvel article", + // [Auto-translated] "Add a new item" + addNewItem: "Ajouter un nouvel article", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Ajouter un nouveau sous-article", + // [Auto-translated] "There are no items" + noRowsText: "Il n’y a pas d’articles", + // [Auto-translated] "New item in" + newItem: "Nouvel article en" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Personnaliser la grille de propriétés", + // [Auto-translated] "Property Grid" + navigationTitle: "Grille des propriétés", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Sélectionnez un élément pour personnaliser ses paramètres disponibles dans la grille de propriétés.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Sélectionnez un élément pour personnaliser ses paramètres disponibles dans la grille de propriétés", + // [Auto-translated] "Property Grid" + propertyGrid: "Grille des propriétés", + // [Auto-translated] "Unsorted items" + unsortedItems: "Articles non triés", + // [Auto-translated] "Name" + categoryName: "Nom", + // [Auto-translated] "Title" + categoryTitle: "Titre", + // [Auto-translated] "Icon name" + iconName: "Nom de l’icône", + // [Auto-translated] "Name" + name: "Nom", + // [Auto-translated] "Title" + titleField: "Titre", + // [Auto-translated] "Helper Text" + descriptionField: "Texte d’aide", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Faites glisser un élément de cette colonne vers la gauche - il apparaîtra visible dans le panneau Onglets. Vous pouvez également déplacer des éléments à l’aide des boutons plus (+) et moins (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Ajouter une catégorie personnalisée" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Ajouter un nouvel article", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Ajouter un nouveau sous-article", + // [Auto-translated] "New item in" + newItem: "Nouvel article en", + // [Auto-translated] "New Category" + addCustomCategory: "Nouvelle catégorie", + // [Auto-translated] "New category in" + newCategory: "Nouvelle catégorie en", + // [Auto-translated] "Move to category..." + moveToCategory: "Déplacer vers la catégorie...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Passer à une nouvelle catégorie...", + // [Auto-translated] "Categories" + categoriesLabel: "Catégories", + // [Auto-translated] "Move To..." + moveTo: "Passer à...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Retirer de {0}", + // [Auto-translated] "More" + more: "Plus", + // [Auto-translated] "Restore" + restoreToDefault: "Restaurer", + // [Auto-translated] "Edit" + edit: "Éditer", + // [Auto-translated] "Expand" + expand: "Développer", + // [Auto-translated] "Collapse" + collapse: "Effondrement", + // [Auto-translated] "Remove" + remove: "Enlever", + // [Auto-translated] "Add" + add: "Ajouter", + // [Auto-translated] "Delete" + delete: "Supprimer" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Préréglages du créateur", + // [Auto-translated] "Preset JSON:" + presetJson: "JSON prédéfini :", + // [Auto-translated] "Copy" + copy: "Copier", + // [Auto-translated] "Download" + download: "Télécharger", + // [Auto-translated] "Load" + load: "Charger", + // [Auto-translated] "Save & Exit" + saveExit: "Enregistrer et quitter", + // [Auto-translated] "Back" + back: "Précédent", + // [Auto-translated] "Reset to default" + resetToDefault: "Réinitialiser les paramètres par défaut", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Tous les paramètres sont rétablis par défaut", + // [Auto-translated] "resored to default" + resoredToDefault: "résorbé à défaut", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Élément restauré par défaut", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Catégorie restaurée par défaut", + // [Auto-translated] "Edit" + edit: "Éditer", + // [Auto-translated] "Save & Exit" + completeText: "Enregistrer et quitter", + // [Auto-translated] "Back" + pagePrevText: "Précédent" }, plugin: { + // [Auto-translated] "Presets" presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Creator Presets" + creatorPresets: "Préréglages du créateur", + // [Auto-translated] "Save & Exit" + save: "Enregistrer et quitter", + // [Auto-translated] "File" + file: "Lime", + // [Auto-translated] "Import" + import: "Importation", + // [Auto-translated] "Export" + export: "Exportation", + // [Auto-translated] "Edit" + edit: "Éditer", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Réinitialiser les langues par défaut", + // [Auto-translated] "Reset all changes" + resetAll: "Réinitialiser toutes les modifications", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Rétablir les paramètres par défaut des {0}" } }; const locale = getLocaleStrings("fr"); diff --git a/packages/survey-creator-core/src/presets/localization/german.ts b/packages/survey-creator-core/src/presets/localization/german.ts index 535dcdef58..8f591fd326 100644 --- a/packages/survey-creator-core/src/presets/localization/german.ts +++ b/packages/survey-creator-core/src/presets/localization/german.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const deStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Sprachen", + // [Auto-translated] "Languages" + navigationTitle: "Sprachen", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Wählen Sie die Sprache der Survey Creator-Benutzeroberfläche und das Ziel aus\nSprachen für die Umfrage, die konfiguriert wird.", + // [Auto-translated] "Creator UI language" + creatorUI: "Sprache der Creator-Benutzeroberfläche", + // [Auto-translated] "Survey languages" + surveyLanguages: "Sprachen der Umfrage", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Geben Sie ein, um zu suchen...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Übersetzen Sie die Namen der Umfragesprachen ins Englische" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + // [Auto-translated] "Configure tabs" + title: "Konfigurieren von Registerkarten", + // [Auto-translated] "Tabs" + navigationTitle: "Tabulatoren", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Wählen Sie die Registerkarten aus, die Sie anzeigen möchten, ordnen Sie sie neu an, ändern Sie ihre Titel,\nund wählen Sie die Registerkarte aus, die standardmäßig aktiv sein soll.", + // [Auto-translated] "Visible tabs" + items: "Sichtbare Registerkarten", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Versteckte Registerkarten", + // [Auto-translated] "Default tab" + defaultTab: "Registerkarte \"Standard\"", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Ziehen Sie ein Element aus dieser Spalte in die linke Spalte – es wird im Tabs-Bedienfeld angezeigt. Sie können Elemente auch verschieben, indem Sie die Plus- (+) und Minus-Tasten (-) verwenden.", + // [Auto-translated] "Name" name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Title" + titleField: "Titel", + // [Auto-translated] "Icon name" + iconName: "Name des Symbols" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", + // [Auto-translated] "Set up the Toolbox" + title: "Einrichten der Toolbox", + // [Auto-translated] "Toolbox" + navigationTitle: "Werkzeugkasten", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Wählen Sie die Toolboxelemente aus, die Sie anzeigen möchten, und gruppieren Sie sie in Kategorien. \nBenennen Sie sie um und ändern Sie bei Bedarf ihre Reihenfolge.", + // [Auto-translated] "Toolbox" + toolbox: "Werkzeugkasten", + // [Auto-translated] "Categories" + categories: "Kategorien", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Versteckte Elemente der Toolbox", + // [Auto-translated] "Enable grouping" + enableGrouping: "Gruppierung aktivieren", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Kategorietitel anzeigen", + // [Auto-translated] "Name" categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Title" + categoryTitle: "Titel", + // [Auto-translated] "Tooltip" + tooltip: "Quickinfo", + // [Auto-translated] "Icon name" + iconName: "Name des Symbols", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "JSON-Objekt, das angewendet werden soll, wenn Benutzer dieses Toolboxelement auswählen", + // [Auto-translated] "Subcategories" + subcategories: "Unterkategorie", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Aktivieren Sie Unterpunkte für diese Frage...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Als Unterelement verschieben nach...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Zur Toolbox hinzufügen", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Benutzerdefiniertes Element löschen", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Ziehen Sie ein Element aus dieser Spalte in die linke Spalte - es wird im Toolbox-Panel sichtbar angezeigt. Sie können Elemente auch verschieben, indem Sie die Plus- (+) und Minus-Tasten (-) verwenden.", + // [Auto-translated] "New Category" + addCustomCategory: "Neue Kategorie", + // [Auto-translated] "New Item" + addCustomItem: "Neuer Artikel", + // [Auto-translated] "Add a new item" + addNewItem: "Hinzufügen eines neuen Elements", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Hinzufügen eines neuen Unterelements", + // [Auto-translated] "There are no items" + noRowsText: "Es gibt keine Artikel", + // [Auto-translated] "New item in" + newItem: "Neuer Artikel in" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", + // [Auto-translated] "Customize the Property Grid" + title: "Anpassen des Eigenschaftenrasters", + // [Auto-translated] "Property Grid" + navigationTitle: "Eigenschafts-Raster", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Wählen Sie ein Element aus, um die Einstellungen anzupassen, die im Eigenschaftenraster verfügbar sind.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Wählen Sie ein Element aus, um seine Einstellungen anzupassen, die im Eigenschaftenraster verfügbar sind", + // [Auto-translated] "Property Grid" + propertyGrid: "Eigenschafts-Raster", + // [Auto-translated] "Unsorted items" + unsortedItems: "Unsortierte Artikel", + // [Auto-translated] "Name" categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", + // [Auto-translated] "Title" + categoryTitle: "Titel", + // [Auto-translated] "Icon name" + iconName: "Name des Symbols", + // [Auto-translated] "Name" name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Title" + titleField: "Titel", + // [Auto-translated] "Helper Text" + descriptionField: "Hilfstext", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Ziehen Sie ein Element aus dieser Spalte in die linke Spalte – es wird im Tabs-Bedienfeld angezeigt. Sie können Elemente auch verschieben, indem Sie die Plus- (+) und Minus-Tasten (-) verwenden.", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Benutzerdefinierte Kategorie hinzufügen" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Hinzufügen eines neuen Elements", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Hinzufügen eines neuen Unterelements", + // [Auto-translated] "New item in" + newItem: "Neuer Artikel in", + // [Auto-translated] "New Category" + addCustomCategory: "Neue Kategorie", + // [Auto-translated] "New category in" + newCategory: "Neue Kategorie in", + // [Auto-translated] "Move to category..." + moveToCategory: "Zur Kategorie wechseln...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "In eine neue Kategorie wechseln...", + // [Auto-translated] "Categories" + categoriesLabel: "Kategorien", + // [Auto-translated] "Move To..." + moveTo: "Verschieben nach...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Aus {0} entfernen", + // [Auto-translated] "More" + more: "Mehr", + // [Auto-translated] "Restore" + restoreToDefault: "Wiederherstellen", + // [Auto-translated] "Edit" + edit: "Redigieren", + // [Auto-translated] "Expand" + expand: "Erweitern", + // [Auto-translated] "Collapse" + collapse: "Zusammenbruch", + // [Auto-translated] "Remove" + remove: "Entfernen", + // [Auto-translated] "Add" + add: "Hinzufügen", + // [Auto-translated] "Delete" + delete: "Löschen" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Creator-Voreinstellungen", + // [Auto-translated] "Preset JSON:" + presetJson: "Voreingestelltes JSON:", + // [Auto-translated] "Copy" + copy: "Kopieren", + // [Auto-translated] "Download" + download: "Herunterladen", + // [Auto-translated] "Load" + load: "Last", + // [Auto-translated] "Save & Exit" + saveExit: "Speichern & Beenden", + // [Auto-translated] "Back" + back: "Zurück", + // [Auto-translated] "Reset to default" + resetToDefault: "Auf Standard zurücksetzen", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Alle Einstellungen auf Standard zurückgesetzt", + // [Auto-translated] "resored to default" + resoredToDefault: "in Verzug geraten", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Artikel auf Standard zurückgesetzt", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Kategorie auf Standard zurückgesetzt", + // [Auto-translated] "Edit" + edit: "Redigieren", + // [Auto-translated] "Save & Exit" + completeText: "Speichern & Beenden", + // [Auto-translated] "Back" + pagePrevText: "Zurück" }, plugin: { + // [Auto-translated] "Presets" presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Creator Presets" + creatorPresets: "Creator-Voreinstellungen", + // [Auto-translated] "Save & Exit" + save: "Speichern & Beenden", + // [Auto-translated] "File" + file: "Datei", + // [Auto-translated] "Import" + import: "Importieren", + // [Auto-translated] "Export" + export: "Exportieren", + // [Auto-translated] "Edit" + edit: "Redigieren", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Sprachen auf Standard zurücksetzen", + // [Auto-translated] "Reset all changes" + resetAll: "Alle Änderungen zurücksetzen", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Zurücksetzen {0} auf die Standardeinstellungen" } }; const locale = getLocaleStrings("de"); diff --git a/packages/survey-creator-core/src/presets/localization/greek.ts b/packages/survey-creator-core/src/presets/localization/greek.ts index fc93921ef0..ea1589e483 100644 --- a/packages/survey-creator-core/src/presets/localization/greek.ts +++ b/packages/survey-creator-core/src/presets/localization/greek.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const elStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Γλώσσες", + // [Auto-translated] "Languages" + navigationTitle: "Γλώσσες", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Επιλέξτε τη γλώσσα της διεπαφής χρήστη του Survey Creator και στοχεύστε\nγλώσσες για την έρευνα που διαμορφώνεται.", + // [Auto-translated] "Creator UI language" + creatorUI: "Γλώσσα διεπαφής χρήστη δημιουργού", + // [Auto-translated] "Survey languages" + surveyLanguages: "Γλώσσες έρευνας", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Πληκτρολογήστε για αναζήτηση...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Μετάφραση ονομάτων γλωσσών έρευνας στα Αγγλικά" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Ρύθμιση παραμέτρων καρτελών", + // [Auto-translated] "Tabs" + navigationTitle: "Καρτέλες", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Επιλέξτε τις καρτέλες που θέλετε να εμφανίσετε, αναδιατάξτε τις, αλλάξτε τους τίτλους τους,\nκαι επιλέξτε την καρτέλα που θα είναι ενεργή από προεπιλογή.", + // [Auto-translated] "Visible tabs" + items: "Ορατές καρτέλες", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Κρυφές καρτέλες", + // [Auto-translated] "Default tab" + defaultTab: "Προεπιλεγμένη καρτέλα", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Σύρετε ένα στοιχείο από αυτήν τη στήλη προς τα αριστερά - θα εμφανιστεί ορατό στον πίνακα καρτελών. Μπορείτε επίσης να μετακινήσετε στοιχεία, χρησιμοποιώντας τα κουμπιά συν (+) και πλην (-).", + // [Auto-translated] "Name" + name: "Όνομα", + // [Auto-translated] "Title" + titleField: "Τίτλος", + // [Auto-translated] "Icon name" + iconName: "Όνομα εικονιδίου" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "Ρύθμιση της εργαλειοθήκης", + // [Auto-translated] "Toolbox" + navigationTitle: "Εργαλειοθήκη", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Επιλέξτε τα στοιχεία της εργαλειοθήκης που θέλετε να εμφανίσετε, ομαδοποιήστε τα σε κατηγορίες, \nμετονομάστε τους και αλλάξτε τη σειρά τους εάν απαιτείται.", + // [Auto-translated] "Toolbox" + toolbox: "Εργαλειοθήκη", + // [Auto-translated] "Categories" + categories: "Κατηγορίες", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Κρυφά στοιχεία εργαλειοθήκης", + // [Auto-translated] "Enable grouping" + enableGrouping: "Ενεργοποίηση ομαδοποίησης", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Εμφάνιση τίτλων κατηγοριών", + // [Auto-translated] "Name" + categoryName: "Όνομα", + // [Auto-translated] "Title" + categoryTitle: "Τίτλος", + // [Auto-translated] "Tooltip" + tooltip: "Συμβουλή εργαλείου", + // [Auto-translated] "Icon name" + iconName: "Όνομα εικονιδίου", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "Αντικείμενο JSON για εφαρμογή όταν οι χρήστες επιλέγουν αυτό το στοιχείο εργαλειοθήκης", + // [Auto-translated] "Subcategories" + subcategories: "Υποκατηγορίες", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Ενεργοποιήστε τα δευτερεύοντα στοιχεία για αυτήν την ερώτηση...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Μετακίνηση ως υποστοιχείο σε...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Προσθήκη στην εργαλειοθήκη", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Διαγραφή προσαρμοσμένου στοιχείου", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Σύρετε ένα στοιχείο από αυτήν τη στήλη προς τα αριστερά - θα ��μφανιστεί ορατό στον πίνακα Εργαλειοθήκη. Μπορείτε επίσης να μετακινήσετε στοιχεία, χρησιμοποιώντας τα κουμπιά συν (+) και πλην (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Νέα Κατηγορία", + // [Auto-translated] "New Item" + addCustomItem: "Νέο αντικείμενο", + // [Auto-translated] "Add a new item" + addNewItem: "Προσθήκη νέου στοιχείου", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Προσθήκη νέου υποστοιχείου", + // [Auto-translated] "There are no items" + noRowsText: "Δεν υπάρχουν αντικείμενα", + // [Auto-translated] "New item in" + newItem: "Νέο στοιχείο στο" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Προσαρμογή του πλέγματος ιδιοτήτων", + // [Auto-translated] "Property Grid" + navigationTitle: "Πλέγμα ιδιοκτησίας", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Επιλέξτε ένα στοιχείο για να προσαρμόσετε τις ρυθμίσεις του που είναι διαθέσιμες στο Πλέγμα Ιδιοτήτων.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Επιλέξτε ένα στοιχείο για να προσαρμόσετε τις ρυθμίσεις του που είναι διαθέσιμες στο Πλέγμα Ιδιότητας", + // [Auto-translated] "Property Grid" + propertyGrid: "Πλέγμα ιδιοκτησίας", + // [Auto-translated] "Unsorted items" + unsortedItems: "Αταξινόμητα αντικείμενα", + // [Auto-translated] "Name" + categoryName: "Όνομα", + // [Auto-translated] "Title" + categoryTitle: "Τίτλος", + // [Auto-translated] "Icon name" + iconName: "Όνομα εικονιδίου", + // [Auto-translated] "Name" + name: "Όνομα", + // [Auto-translated] "Title" + titleField: "Τίτλος", + // [Auto-translated] "Helper Text" + descriptionField: "Βοηθητικό κείμενο", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Σύρετε ένα στοιχείο από αυτήν τη στήλη προς τα αριστερά - θα εμφανιστεί ορατό στον πίνακα καρτελών. Μπορείτε επίσης να μετακινήσετε στοιχεία, χρησιμοποιώντας τα κουμπιά συν (+) και πλην (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Προσθήκη προσαρμοσμένης κατηγορίας" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Προσθήκη νέου στοιχείου", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Προσθήκη νέου υποστοιχείου", + // [Auto-translated] "New item in" + newItem: "Νέο στοιχείο στο", + // [Auto-translated] "New Category" + addCustomCategory: "Νέα Κατηγορία", + // [Auto-translated] "New category in" + newCategory: "Νέα κατηγορία στο", + // [Auto-translated] "Move to category..." + moveToCategory: "Μετακίνηση στην κατηγορία...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Μετακίνηση σε νέα κατηγορία...", + // [Auto-translated] "Categories" + categoriesLabel: "Κατηγορίες", + // [Auto-translated] "Move To..." + moveTo: "Μετακίνηση σε...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Αφαίρεση από {0}", + // [Auto-translated] "More" + more: "Περισσότερο", + // [Auto-translated] "Restore" + restoreToDefault: "Αποκαθιστώ", + // [Auto-translated] "Edit" + edit: "Επεξεργασία", + // [Auto-translated] "Expand" + expand: "Επεκτείνω", + // [Auto-translated] "Collapse" + collapse: "Κατάρρευση", + // [Auto-translated] "Remove" + remove: "Αφαιρώ", + // [Auto-translated] "Add" + add: "Προσθέτω", + // [Auto-translated] "Delete" + delete: "Διαγράφω" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Προεπιλογές δημιουργού", + // [Auto-translated] "Preset JSON:" + presetJson: "Προκαθορισμένο JSON:", + // [Auto-translated] "Copy" + copy: "Αντίγραφο", + // [Auto-translated] "Download" + download: "Καταφόρτωση", + // [Auto-translated] "Load" + load: "Φορτίο", + // [Auto-translated] "Save & Exit" + saveExit: "Αποθήκευση & Έξοδος", + // [Auto-translated] "Back" + back: "Πλάτη", + // [Auto-translated] "Reset to default" + resetToDefault: "Επαναφορά στις προεπιλογές", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Όλες οι ρυθμίσεις επανήλθαν στις προεπιλογές", + // [Auto-translated] "resored to default" + resoredToDefault: "Αθέτηση υποχρεώσεων", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Το στοιχείο επανήλθε στην προεπιλογή", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Η κατηγορία επανήλθε στην προεπιλογή", + // [Auto-translated] "Edit" + edit: "Επεξεργασία", + // [Auto-translated] "Save & Exit" + completeText: "Αποθήκευση & Έξοδος", + // [Auto-translated] "Back" + pagePrevText: "Πλάτη" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "Προεπιλογές", + // [Auto-translated] "Creator Presets" + creatorPresets: "Προεπιλογές δημιουργού", + // [Auto-translated] "Save & Exit" + save: "Αποθήκευση & Έξοδος", + // [Auto-translated] "File" + file: "Αρχείο", + // [Auto-translated] "Import" + import: "Εισαγωγή", + // [Auto-translated] "Export" + export: "Εξαγωγή", + // [Auto-translated] "Edit" + edit: "Επεξεργασία", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Επαναφορά γλωσσών στις προεπιλογές", + // [Auto-translated] "Reset all changes" + resetAll: "Επαναφορά όλων των αλλαγών", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Επαναφορά {0} στις προεπιλογές" } }; const locale = getLocaleStrings("el"); diff --git a/packages/survey-creator-core/src/presets/localization/haitian-creole.ts b/packages/survey-creator-core/src/presets/localization/haitian-creole.ts index 1e637228e2..2acbef33f8 100644 --- a/packages/survey-creator-core/src/presets/localization/haitian-creole.ts +++ b/packages/survey-creator-core/src/presets/localization/haitian-creole.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const htStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Lang", + // [Auto-translated] "Languages" + navigationTitle: "Lang", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Chwazi lang UI kreyatè sondaj la ak sib\nLang pou sondaj la ke yo te configuré.", + // [Auto-translated] "Creator UI language" + creatorUI: "Kreyatè UI lang", + // [Auto-translated] "Survey languages" + surveyLanguages: "Lang sondaj yo", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Kalite pou fè rechèch ...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Tradwi non lang sondaj an anglè" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", + // [Auto-translated] "Configure tabs" + title: "Konfigirasyon onglè yo", + // [Auto-translated] "Tabs" + navigationTitle: "Onglè yo", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Chwazi onglè yo ou vle montre, reorder yo, chanje yo,\nepi chwazi tab la ki pral aktif pa default.", + // [Auto-translated] "Visible tabs" + items: "Onglè vizib", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Onglè kache", + // [Auto-translated] "Default tab" defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Trennen yon atik soti nan kolòn sa a nan yon sèl la gòch - li pral parèt vizib nan panèl la Onglè. Ou kapab tou deplase atik, lè l sèvi avèk plis (+) ak mwens (-) bouton.", + // [Auto-translated] "Name" + name: "Fe-apel", + // [Auto-translated] "Title" + titleField: "Tit", + // [Auto-translated] "Icon name" + iconName: "Non icon" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "Mete kanpe bwat zouti a", + // [Auto-translated] "Toolbox" + navigationTitle: "Bwat zouti", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Chwazi atik yo bwat zouti ou vle montre, gwoup yo an kategori, \nchanje non yo, epi chanje lòd yo si sa nesesè.", + // [Auto-translated] "Toolbox" + toolbox: "Bwat zouti", + // [Auto-translated] "Categories" + categories: "Kategori", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Atik bwat zouti kache", + // [Auto-translated] "Enable grouping" + enableGrouping: "Pèmèt gwoupman", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Montre kategori", + // [Auto-translated] "Name" + categoryName: "Fe-apel", + // [Auto-translated] "Title" + categoryTitle: "Tit", + // [Auto-translated] "Tooltip" + tooltip: "Konsèy zouti", + // [Auto-translated] "Icon name" + iconName: "Non icon", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "JSON objè pou aplike lè itilizatè yo chwazi atik bwat zouti sa a", + // [Auto-translated] "Subcategories" + subcategories: "Sous-kategori", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Pèmèt subitems pou kesyon sa a...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Deplase kòm yon subitem pou...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Ajoute nan bwat zouti", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Efase atik koutim", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Trennen yon atik ki soti nan kolòn sa a nan yon sèl la gòch - li pral parèt vizib nan panèl la Toolbox. Ou kapab tou deplase atik, lè l sèvi avèk plis (+) ak mwens (-) bouton.", + // [Auto-translated] "New Category" + addCustomCategory: "Nouvo Kategori", + // [Auto-translated] "New Item" + addCustomItem: "Nouvo Atik", + // [Auto-translated] "Add a new item" + addNewItem: "Ajoute yon nouvo atik", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Ajoute yon nouvo subitem", + // [Auto-translated] "There are no items" + noRowsText: "Pa gen okenn atik", + // [Auto-translated] "New item in" + newItem: "Nouvo atik nan" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Customize kadriyaj pwopriyete a", + // [Auto-translated] "Property Grid" + navigationTitle: "Pwopriyete kadriyaj", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Chwazi yon eleman pou Customize anviwònman li yo ki disponib nan kadriyaj la Pwopriyete.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Chwazi yon eleman pou Customize anviwònman li yo ki disponib nan kadriyaj la Pwopriyete", + // [Auto-translated] "Property Grid" + propertyGrid: "Pwopriyete kadriyaj", + // [Auto-translated] "Unsorted items" + unsortedItems: "Unsorted atik", + // [Auto-translated] "Name" + categoryName: "Fe-apel", + // [Auto-translated] "Title" + categoryTitle: "Tit", + // [Auto-translated] "Icon name" + iconName: "Non icon", + // [Auto-translated] "Name" + name: "Fe-apel", + // [Auto-translated] "Title" + titleField: "Tit", + // [Auto-translated] "Helper Text" + descriptionField: "Tèks ede", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Trennen yon atik soti nan kolòn sa a nan yon sèl la gòch - li pral parèt vizib nan panèl la Onglè. Ou kapab tou deplase atik, lè l sèvi avèk plis (+) ak mwens (-) bouton.", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Add Custom Kategori" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Ajoute yon nouvo atik", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Ajoute yon nouvo subitem", + // [Auto-translated] "New item in" + newItem: "Nouvo atik nan", + // [Auto-translated] "New Category" + addCustomCategory: "Nouvo Kategori", + // [Auto-translated] "New category in" + newCategory: "Nouvo kategori nan", + // [Auto-translated] "Move to category..." + moveToCategory: "Deplase nan kategori...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Deplase nan nouvo kategori...", + // [Auto-translated] "Categories" + categoriesLabel: "Kategori", + // [Auto-translated] "Move To..." + moveTo: "Deplase Pou...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Retire soti nan {0}", + // [Auto-translated] "More" + more: "Plis", + // [Auto-translated] "Restore" + restoreToDefault: "Retabli", + // [Auto-translated] "Edit" + edit: "modifye", + // [Auto-translated] "Expand" + expand: "Elaji", + // [Auto-translated] "Collapse" + collapse: "Tonbe", + // [Auto-translated] "Remove" + remove: "Deplase", + // [Auto-translated] "Add" + add: "Ajoute", + // [Auto-translated] "Delete" + delete: "Efase" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Kreyatè Prereglaj", + // [Auto-translated] "Preset JSON:" + presetJson: "Prereglaj JSON:", + // [Auto-translated] "Copy" + copy: "Kopi", + // [Auto-translated] "Download" + download: "Rale dosye", + // [Auto-translated] "Load" + load: "Mete abo", + // [Auto-translated] "Save & Exit" + saveExit: "Sove & sòti", + // [Auto-translated] "Back" + back: "Do", + // [Auto-translated] "Reset to default" + resetToDefault: "Reyajiste nan default", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Tout anviwònman retabli nan default", + // [Auto-translated] "resored to default" + resoredToDefault: "Resored nan default", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Atik retabli nan default", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Kategori retabli nan default", + // [Auto-translated] "Edit" + edit: "modifye", + // [Auto-translated] "Save & Exit" + completeText: "Sove & sòti", + // [Auto-translated] "Back" + pagePrevText: "Do" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "Prereglaj", + // [Auto-translated] "Creator Presets" + creatorPresets: "Kreyatè Prereglaj", + // [Auto-translated] "Save & Exit" + save: "Sove & sòti", + // [Auto-translated] "File" + file: "Ranpli", + // [Auto-translated] "Import" + import: "Enpòte", + // [Auto-translated] "Export" + export: "Ekspòtasyon", + // [Auto-translated] "Edit" + edit: "modifye", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Reyajiste Lang nan default", + // [Auto-translated] "Reset all changes" + resetAll: "Reyajiste tout chanjman", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Reyajiste {0} default" } }; const locale = getLocaleStrings("ht"); diff --git a/packages/survey-creator-core/src/presets/localization/hebrew.ts b/packages/survey-creator-core/src/presets/localization/hebrew.ts index ccfc7811e4..82b88e5bfc 100644 --- a/packages/survey-creator-core/src/presets/localization/hebrew.ts +++ b/packages/survey-creator-core/src/presets/localization/hebrew.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const heStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "שפות", + // [Auto-translated] "Languages" + navigationTitle: "שפות", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "בחר את השפה של ממשק המשתמש והיעד של יוצר הסקר\nשפות עבור הסקר מוגדר.", + // [Auto-translated] "Creator UI language" + creatorUI: "שפת ממשק המשתמש של היוצר", + // [Auto-translated] "Survey languages" + surveyLanguages: "שפות סקר", + // [Auto-translated] "Type to search..." + searchPlaceholder: "הקלד כדי לחפש...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "תרגום שמות שפות הסקר לאנגלית" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "קביעת תצורה של כרטיסיות", + // [Auto-translated] "Tabs" + navigationTitle: "כרטיסיות", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "בחר את הכרטיסיות שברצונך להציג, סדר אותן מחדש, שנה את הכותרות שלהן,\nובחר את הכרטיסיה שתהיה פעילה כברירת מחדל.", + // [Auto-translated] "Visible tabs" + items: "כרטיסיות גלויות", + // [Auto-translated] "Hidden tabs" + unsortedItems: "כרטיסיות מוסתרות", + // [Auto-translated] "Default tab" + defaultTab: "כרטיסיית ברירת מחדל", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "גרור פריט מעמודה זו לעמודה השמאלית - הוא יופיע גלוי בחלונית Tabs. באפשרותך גם להזיז פריטים באמצעות לחצני הפלוס (+) והמינוס (-).", + // [Auto-translated] "Name" + name: "שם", + // [Auto-translated] "Title" + titleField: "כותר", + // [Auto-translated] "Icon name" + iconName: "שם סמל" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "הגדרת ארגז הכלים", + // [Auto-translated] "Toolbox" + navigationTitle: "ארגז כלים", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "בחר את פריטי ארגז הכלים שברצונך להציג, קבץ אותם לקטגוריות, \nשנה את שמם ושנה את הסדר שלהם במידת הצורך.", + // [Auto-translated] "Toolbox" + toolbox: "ארגז כלים", + // [Auto-translated] "Categories" + categories: "קטגוריות", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "פריטי ארגז כלים מוסתרים", + // [Auto-translated] "Enable grouping" + enableGrouping: "הפיכת קיבוץ לזמין", + // [Auto-translated] "Show category titles" + showCategoryTitles: "הצגת כותרות קטגוריות", + // [Auto-translated] "Name" + categoryName: "שם", + // [Auto-translated] "Title" + categoryTitle: "כותר", + // [Auto-translated] "Tooltip" + tooltip: "תיאור כלי", + // [Auto-translated] "Icon name" + iconName: "שם סמל", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "JSON להחלה כאשר משתמשים בוחרים בפריט ארגז כלים זה", + // [Auto-translated] "Subcategories" + subcategories: "קטגוריות משנה", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "אפשר פריטי משנה לשאלה זו...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "העבר כפריט משנה אל...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "הוספה לארגז הכלים", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "מחיקת פריט מותאם אישית", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "גרור פריט מעמודה זו לעמודה השמאלית - הוא יופיע גלוי בחלונית ארגז הכלים. באפשרותך גם להזיז פריטים באמצעות לחצני הפלוס (+) והמינוס (-).", + // [Auto-translated] "New Category" + addCustomCategory: "קטגוריה חדשה", + // [Auto-translated] "New Item" + addCustomItem: "פריט חדש", + // [Auto-translated] "Add a new item" + addNewItem: "הוספת פריט חדש", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "הוספת פריט משנה חדש", + // [Auto-translated] "There are no items" + noRowsText: "אין פריטים", + // [Auto-translated] "New item in" + newItem: "פריט חדש ב-" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "התאמה אישית של רשת המאפיינים", + // [Auto-translated] "Property Grid" + navigationTitle: "רשת מאפיינים", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "בחר רכיב כדי להתאים אישית את ההגדרות שלו הזמינות ברשת המאפיינ��ם.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "בחר רכיב כדי להתאים אישית את ההגדרות שלו הזמינות ברשת המאפיינים", + // [Auto-translated] "Property Grid" + propertyGrid: "רשת מאפיינים", + // [Auto-translated] "Unsorted items" + unsortedItems: "פריטים לא ממוינים", + // [Auto-translated] "Name" + categoryName: "שם", + // [Auto-translated] "Title" + categoryTitle: "כותר", + // [Auto-translated] "Icon name" + iconName: "שם סמל", + // [Auto-translated] "Name" + name: "שם", + // [Auto-translated] "Title" + titleField: "כותר", + // [Auto-translated] "Helper Text" + descriptionField: "טקסט מסייע", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "גרור פריט מעמודה זו לעמודה השמאלית - הוא יופיע גלוי בחלונית Tabs. באפשרותך גם להזיז פריטים באמצעות לחצני הפלוס (+) והמינוס (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "הוסף קטגוריה מותאמת אישית" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "הוספת פריט חדש", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "הוספת פריט משנה חדש", + // [Auto-translated] "New item in" + newItem: "פריט חדש ב-", + // [Auto-translated] "New Category" + addCustomCategory: "קטגוריה חדשה", + // [Auto-translated] "New category in" + newCategory: "קטגוריה חדשה ב", + // [Auto-translated] "Move to category..." + moveToCategory: "מעבר לקטגוריה...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "מעבר לקטגוריה חדשה...", + // [Auto-translated] "Categories" + categoriesLabel: "קטגוריות", + // [Auto-translated] "Move To..." + moveTo: "העבר אל...", + // [Auto-translated] "Remove from {0}" + removeFrom: "הסר מה{0}", + // [Auto-translated] "More" + more: "עוד", + // [Auto-translated] "Restore" + restoreToDefault: "לשחזר", + // [Auto-translated] "Edit" + edit: "עריכה", + // [Auto-translated] "Expand" + expand: "להרחיב", + // [Auto-translated] "Collapse" + collapse: "התמוטטות", + // [Auto-translated] "Remove" + remove: "להסיר", + // [Auto-translated] "Add" + add: "הוסף", + // [Auto-translated] "Delete" + delete: "למחוק" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "קביעות מוגדרות מראש של היוצרים", + // [Auto-translated] "Preset JSON:" + presetJson: "JSON מוגדר מראש:", + // [Auto-translated] "Copy" + copy: "עותק", + // [Auto-translated] "Download" + download: "הורדה", + // [Auto-translated] "Load" + load: "טען", + // [Auto-translated] "Save & Exit" + saveExit: "שמירה ויציאה", + // [Auto-translated] "Back" + back: "גב", + // [Auto-translated] "Reset to default" + resetToDefault: "איפוס לברירת המחדל", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "כל ההגדרות שוחזרו לברירת המחדל", + // [Auto-translated] "resored to default" + resoredToDefault: "מוחזר לברירת המחדל", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "הפריט שוחזר לברירת המחדל", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "הקטגוריה שוחזרה לברירת המחדל", + // [Auto-translated] "Edit" + edit: "עריכה", + // [Auto-translated] "Save & Exit" + completeText: "שמירה ויציאה", + // [Auto-translated] "Back" + pagePrevText: "גב" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "קבועות מראש", + // [Auto-translated] "Creator Presets" + creatorPresets: "קביעות מוגדרות מראש של היוצרים", + // [Auto-translated] "Save & Exit" + save: "שמירה ויציאה", + // [Auto-translated] "File" + file: "קובץ", + // [Auto-translated] "Import" + import: "ייבוא", + // [Auto-translated] "Export" + export: "ייצא", + // [Auto-translated] "Edit" + edit: "עריכה", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "איפוס שפות לברירת המחדל", + // [Auto-translated] "Reset all changes" + resetAll: "איפוס כל השינויים", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "איפוס {0} לברירות המחדל" } }; const locale = getLocaleStrings("he"); diff --git a/packages/survey-creator-core/src/presets/localization/hungarian.ts b/packages/survey-creator-core/src/presets/localization/hungarian.ts index c6e1811f8d..e6b92d3a4a 100644 --- a/packages/survey-creator-core/src/presets/localization/hungarian.ts +++ b/packages/survey-creator-core/src/presets/localization/hungarian.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const huStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Nyelvek", + // [Auto-translated] "Languages" + navigationTitle: "Nyelvek", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Válassza ki a felmérés készítőjének felhasználói felületének nyelvét és a célt\na konfigurált felmérés nyelvei.", + // [Auto-translated] "Creator UI language" + creatorUI: "Alkotói felhasználói felület nyelve", + // [Auto-translated] "Survey languages" + surveyLanguages: "A felmérés nyelvei", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Írja be a kereséshez...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Felmérés nyelvnevének fordítása angolra" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Lapok konfigurálása", + // [Auto-translated] "Tabs" + navigationTitle: "Lapfülek", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Válassza ki a megjeleníteni kívánt lapokat, rendezze át őket, módosítsa a címüket,\nés válassza ki azt a lapot, amely alapértelmezés szerint aktív lesz.", + // [Auto-translated] "Visible tabs" + items: "Látható lapok", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Rejtett lapok", + // [Auto-translated] "Default tab" + defaultTab: "Alapértelmezett lap", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Húzzon egy elemet ebből az oszlopból balra - az látható lesz a Lapok panelen. Az elemeket a plusz (+) és a mínusz (-) gombokkal is áthelyezheti.", + // [Auto-translated] "Name" + name: "Név", + // [Auto-translated] "Title" + titleField: "Cím", + // [Auto-translated] "Icon name" + iconName: "Ikon neve" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "Az Eszköztár beállítása", + // [Auto-translated] "Toolbox" + navigationTitle: "Szerszámosláda", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Válassza ki a megjeleníteni kívánt eszköztár elemeket, csoportosítsa őket kategóriákba, \nNevezze át őket, és szükség esetén módosítsa a sorrendjüket.", + // [Auto-translated] "Toolbox" + toolbox: "Szerszámosláda", + // [Auto-translated] "Categories" + categories: "Kategóriák", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Rejtett eszköztár elemek", + // [Auto-translated] "Enable grouping" + enableGrouping: "Csoportosítás engedélyezése", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Kategóriacímek megjelenítése", + // [Auto-translated] "Name" + categoryName: "Név", + // [Auto-translated] "Title" + categoryTitle: "Cím", + // [Auto-translated] "Tooltip" + tooltip: "Elemleírás", + // [Auto-translated] "Icon name" + iconName: "Ikon neve", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "JSON-objektum, amelyet akkor kell alkalmazni, amikor a felhasználók kiválasztják ezt az eszközkészlet-elemet", + // [Auto-translated] "Subcategories" + subcategories: "Alkategóriák", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Engedélyezze a kérdés alelemeit...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Áthelyezés alelemként a...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Hozzáadás az eszköztárhoz", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Egyéni elem törlése", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Húzzon egy elemet ebből az oszlopból balra - az látható lesz az Eszköztár panelen. Az elemeket a plusz (+) és a mínusz (-) gombokkal is áthelyezheti.", + // [Auto-translated] "New Category" + addCustomCategory: "Új kategória", + // [Auto-translated] "New Item" + addCustomItem: "Új elem", + // [Auto-translated] "Add a new item" + addNewItem: "Új elem hozzáadása", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Új alelem hozzáadása", + // [Auto-translated] "There are no items" + noRowsText: "Nincsenek elemek", + // [Auto-translated] "New item in" + newItem: "Új elem" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "A tulajdonságrács testreszabása", + // [Auto-translated] "Property Grid" + navigationTitle: "Tulajdonságrács", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Jelöljön ki egy elemet a tulajdonságrácsban elérhető beállítások testreszabásához.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Válasszon ki egy elemet a tulajdonságrácsban elérhető beállítások testreszabásához", + // [Auto-translated] "Property Grid" + propertyGrid: "Tulajdonságrács", + // [Auto-translated] "Unsorted items" + unsortedItems: "Rendezetlen elemek", + // [Auto-translated] "Name" + categoryName: "Név", + // [Auto-translated] "Title" + categoryTitle: "Cím", + // [Auto-translated] "Icon name" + iconName: "Ikon neve", + // [Auto-translated] "Name" + name: "Név", + // [Auto-translated] "Title" + titleField: "Cím", + // [Auto-translated] "Helper Text" + descriptionField: "Segítő szöveg", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Húzzon egy elemet ebből az oszlopból balra - az látható lesz a Lapok panelen. Az elemeket a plusz (+) és a mínusz (-) gombokkal is áthelyezheti.", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Egyéni kategória hozzáadása" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Új elem hozzáadása", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Új alelem hozzáadása", + // [Auto-translated] "New item in" + newItem: "Új elem", + // [Auto-translated] "New Category" + addCustomCategory: "Új kategória", + // [Auto-translated] "New category in" + newCategory: "Új kategória", + // [Auto-translated] "Move to category..." + moveToCategory: "Áthelyezés a kategóriába...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Áthelyezés új kategóriába...", + // [Auto-translated] "Categories" + categoriesLabel: "Kategóriák", + // [Auto-translated] "Move To..." + moveTo: "Áthelyezés...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Eltávolítás a {0}", + // [Auto-translated] "More" + more: "Több", + // [Auto-translated] "Restore" + restoreToDefault: "Visszaad", + // [Auto-translated] "Edit" + edit: "Szerkeszt", + // [Auto-translated] "Expand" + expand: "Kibővít", + // [Auto-translated] "Collapse" + collapse: "Összeomlás", + // [Auto-translated] "Remove" + remove: "Eltávolít", + // [Auto-translated] "Add" + add: "Hozzáad", + // [Auto-translated] "Delete" + delete: "Töröl" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Alkotói készletek", + // [Auto-translated] "Preset JSON:" + presetJson: "Előre beállított JSON:", + // [Auto-translated] "Copy" + copy: "Másolat", + // [Auto-translated] "Download" + download: "Letöltés", + // [Auto-translated] "Load" + load: "Rakomány", + // [Auto-translated] "Save & Exit" + saveExit: "Mentés és kilépés", + // [Auto-translated] "Back" + back: "Hát", + // [Auto-translated] "Reset to default" + resetToDefault: "Visszaállítás az alapértelmezettre", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Minden beállítás visszaáll az alapértelmezettre", + // [Auto-translated] "resored to default" + resoredToDefault: "alapértelmezettre cserélve", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Az elem visszaállt az alapértelmezettre", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "A kategória visszaállítva az alapértelmezettre", + // [Auto-translated] "Edit" + edit: "Szerkeszt", + // [Auto-translated] "Save & Exit" + completeText: "Mentés és kilépés", + // [Auto-translated] "Back" + pagePrevText: "Hát" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "Készletek", + // [Auto-translated] "Creator Presets" + creatorPresets: "Alkotói készletek", + // [Auto-translated] "Save & Exit" + save: "Mentés és kilépés", + // [Auto-translated] "File" + file: "Fájl", + // [Auto-translated] "Import" + import: "Importál", + // [Auto-translated] "Export" + export: "Kivitel", + // [Auto-translated] "Edit" + edit: "Szerkeszt", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Nyelvek visszaállítása alapértelmezettre", + // [Auto-translated] "Reset all changes" + resetAll: "Az összes módosítás visszaállítása", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Állítsa vissza {0} az alapértelmezett értékekre" } }; const locale = getLocaleStrings("hu"); diff --git a/packages/survey-creator-core/src/presets/localization/indonesian.ts b/packages/survey-creator-core/src/presets/localization/indonesian.ts index c83139b88b..5a78a57e88 100644 --- a/packages/survey-creator-core/src/presets/localization/indonesian.ts +++ b/packages/survey-creator-core/src/presets/localization/indonesian.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const idStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Bahasa", + // [Auto-translated] "Languages" + navigationTitle: "Bahasa", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Pilih bahasa UI dan target Pembuat Survei\nbahasa untuk survei yang sedang dikonfigurasi.", + // [Auto-translated] "Creator UI language" + creatorUI: "Bahasa UI kreator", + // [Auto-translated] "Survey languages" + surveyLanguages: "Bahasa survei", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Ketik untuk mencari...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Terjemahkan nama bahasa Survei ke bahasa Inggris" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Mengonfigurasi tab", + // [Auto-translated] "Tabs" + navigationTitle: "Tab", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Pilih tab yang ingin Anda tampilkan, urutkan ulang, ubah judulnya,\ndan pilih tab yang akan aktif secara default.", + // [Auto-translated] "Visible tabs" + items: "Tab yang terlihat", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Tab tersembunyi", + // [Auto-translated] "Default tab" + defaultTab: "Tab default", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Seret item dari kolom ini ke kiri - itu akan tampak terlihat di panel Tab. Anda juga dapat memindahkan item, menggunakan tombol plus (+) dan minus (-).", + // [Auto-translated] "Name" + name: "Nama", + // [Auto-translated] "Title" + titleField: "Titel", + // [Auto-translated] "Icon name" + iconName: "Nama ikon" }, toolbox: { - title: "Set up the Toolbox", + // [Auto-translated] "Set up the Toolbox" + title: "Menyiapkan Toolbox", + // [Auto-translated] "Toolbox" navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Pilih item kotak alat yang ingin Anda tampilkan, kelompokkan ke dalam kategori, \nganti namanya, dan ubah urutannya jika diperlukan.", + // [Auto-translated] "Toolbox" toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", + // [Auto-translated] "Categories" + categories: "Kategori", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Item kotak alat tersembunyi", + // [Auto-translated] "Enable grouping" + enableGrouping: "Aktifkan pengelompokan", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Tampilkan judul kategori", + // [Auto-translated] "Name" + categoryName: "Nama", + // [Auto-translated] "Title" + categoryTitle: "Titel", + // [Auto-translated] "Tooltip" tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Icon name" + iconName: "Nama ikon", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "JSON untuk diterapkan saat pengguna memilih item toolbox ini", + // [Auto-translated] "Subcategories" + subcategories: "Subkategori", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Aktifkan subitem untuk pertanyaan ini...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Pindah sebagai subitem ke...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Tambahkan ke Toolbox", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Hapus Item Kustom", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Seret item dari kolom ini ke kiri - itu akan muncul terlihat di panel Toolbox. Anda juga dapat memindahkan item, menggunakan tombol plus (+) dan minus (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Kategori Baru", + // [Auto-translated] "New Item" + addCustomItem: "Item Baru", + // [Auto-translated] "Add a new item" + addNewItem: "Menambahkan item baru", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Menambahkan subitem baru", + // [Auto-translated] "There are no items" + noRowsText: "Tidak ada item", + // [Auto-translated] "New item in" + newItem: "Item baru di" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Menyesuaikan Kisi Properti", + // [Auto-translated] "Property Grid" + navigationTitle: "Kisi Properti", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Pilih elemen untuk menyesuaikan pengaturannya yang tersedia di Kisi Properti.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Pilih elemen untuk menyesuaikan pengaturannya yang tersedia di Kisi Properti", + // [Auto-translated] "Property Grid" + propertyGrid: "Kisi Properti", + // [Auto-translated] "Unsorted items" + unsortedItems: "Item yang tidak diurutkan", + // [Auto-translated] "Name" + categoryName: "Nama", + // [Auto-translated] "Title" + categoryTitle: "Titel", + // [Auto-translated] "Icon name" + iconName: "Nama ikon", + // [Auto-translated] "Name" + name: "Nama", + // [Auto-translated] "Title" + titleField: "Titel", + // [Auto-translated] "Helper Text" + descriptionField: "Teks Pembantu", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Seret item dari kolom ini ke kiri - itu akan tampak terlihat di panel Tab. Anda juga dapat memindahkan item, menggunakan tombol plus (+) dan minus (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Tambahkan Kategori Kustom" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Menambahkan item baru", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Menambahkan subitem baru", + // [Auto-translated] "New item in" + newItem: "Item baru di", + // [Auto-translated] "New Category" + addCustomCategory: "Kategori Baru", + // [Auto-translated] "New category in" + newCategory: "Kategori baru di", + // [Auto-translated] "Move to category..." + moveToCategory: "Pindah ke kategori...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Pindah ke kategori baru...", + // [Auto-translated] "Categories" + categoriesLabel: "Kategori", + // [Auto-translated] "Move To..." + moveTo: "Pindah ke...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Hapus dari {0}", + // [Auto-translated] "More" + more: "Lebih", + // [Auto-translated] "Restore" + restoreToDefault: "Mengembalikan", + // [Auto-translated] "Edit" + edit: "Mengedit", + // [Auto-translated] "Expand" + expand: "Memperluas", + // [Auto-translated] "Collapse" + collapse: "Roboh", + // [Auto-translated] "Remove" + remove: "Buka", + // [Auto-translated] "Add" + add: "Tambah", + // [Auto-translated] "Delete" + delete: "Menghapus" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Preset Kreator", + // [Auto-translated] "Preset JSON:" + presetJson: "JSON Preset:", + // [Auto-translated] "Copy" + copy: "Menyalin", + // [Auto-translated] "Download" + download: "Mengunduh", + // [Auto-translated] "Load" + load: "Muat", + // [Auto-translated] "Save & Exit" + saveExit: "Simpan & Keluar", + // [Auto-translated] "Back" + back: "Belakang", + // [Auto-translated] "Reset to default" + resetToDefault: "Setel ulang ke default", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Semua pengaturan dikembalikan ke default", + // [Auto-translated] "resored to default" + resoredToDefault: "dikembalikan ke default", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Item dikembalikan ke default", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Kategori dikembalikan ke default", + // [Auto-translated] "Edit" + edit: "Mengedit", + // [Auto-translated] "Save & Exit" + completeText: "Simpan & Keluar", + // [Auto-translated] "Back" + pagePrevText: "Belakang" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "Preset", + // [Auto-translated] "Creator Presets" + creatorPresets: "Preset Kreator", + // [Auto-translated] "Save & Exit" + save: "Simpan & Keluar", + // [Auto-translated] "File" + file: "Arsip", + // [Auto-translated] "Import" + import: "Mengimpor", + // [Auto-translated] "Export" + export: "Ekspor", + // [Auto-translated] "Edit" + edit: "Mengedit", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Setel Ulang Bahasa ke default", + // [Auto-translated] "Reset all changes" + resetAll: "Atur ulang semua perubahan", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Setel ulang {0} ke default" } }; const locale = getLocaleStrings("id"); diff --git a/packages/survey-creator-core/src/presets/localization/italian.ts b/packages/survey-creator-core/src/presets/localization/italian.ts index 4d1d2565c9..55303f8489 100644 --- a/packages/survey-creator-core/src/presets/localization/italian.ts +++ b/packages/survey-creator-core/src/presets/localization/italian.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const itStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Lingue", + // [Auto-translated] "Languages" + navigationTitle: "Lingue", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Seleziona la lingua dell'interfaccia utente di Survey Creator e il target\nlingue per il sondaggio in fase di configurazione.", + // [Auto-translated] "Creator UI language" + creatorUI: "Lingua dell'interfaccia utente del creatore", + // [Auto-translated] "Survey languages" + surveyLanguages: "Lingue dell'indagine", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Digita per cercare...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Traduci i nomi delle lingue del sondaggio in inglese" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Configurare le schede", + // [Auto-translated] "Tabs" + navigationTitle: "Schede", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Seleziona le schede che desideri mostrare, riordinale, modificane i titoli,\ne scegli la scheda che sarà attiva per impostazione predefinita.", + // [Auto-translated] "Visible tabs" + items: "Schede visibili", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Schede nascoste", + // [Auto-translated] "Default tab" + defaultTab: "Scheda Predefinito", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Trascina un elemento da questa colonna a quella sinistra: apparirà visibile nel pannello Schede. È inoltre possibile spostare gli elementi utilizzando i pulsanti più (+) e meno (-).", + // [Auto-translated] "Name" + name: "Nome", + // [Auto-translated] "Title" + titleField: "Titolo", + // [Auto-translated] "Icon name" + iconName: "Nome dell'icona" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "Configurare la Casella degli strumenti", + // [Auto-translated] "Toolbox" + navigationTitle: "Cassetta degli attrezzi", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Seleziona gli elementi della casella degli strumenti che desideri mostrare, raggruppali in categorie, \nRinominali e modificane l'ordine, se necessario.", + // [Auto-translated] "Toolbox" + toolbox: "Cassetta degli attrezzi", + // [Auto-translated] "Categories" + categories: "Categorie", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Elementi nascosti della casella degli strumenti", + // [Auto-translated] "Enable grouping" + enableGrouping: "Abilita raggruppamento", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Mostra i titoli delle categorie", + // [Auto-translated] "Name" + categoryName: "Nome", + // [Auto-translated] "Title" + categoryTitle: "Titolo", + // [Auto-translated] "Tooltip" + tooltip: "Descrizione comando", + // [Auto-translated] "Icon name" + iconName: "Nome dell'icona", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "Oggetto JSON da applicare quando gli utenti selezionano questo elemento della casella degli strumenti", + // [Auto-translated] "Subcategories" + subcategories: "Sottocategorie", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Abilita gli elementi secondari per questa domanda...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Sposta come sottoelemento in...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Aggiungi alla casella degli strumenti", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Elimina articolo personalizzato", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Trascina un elemento da questa colonna a quella sinistra: apparirà visibile nel pannello Toolbox. È inoltre possibile spostare gli elementi utilizzando i pulsanti più (+) e meno (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Nuova Categoria", + // [Auto-translated] "New Item" + addCustomItem: "Nuovo articolo", + // [Auto-translated] "Add a new item" + addNewItem: "Aggiungere un nuovo elemento", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Aggiungere un nuovo elemento secondario", + // [Auto-translated] "There are no items" + noRowsText: "Non ci sono articoli", + // [Auto-translated] "New item in" + newItem: "Nuovo articolo in" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Personalizzazione della griglia delle proprietà", + // [Auto-translated] "Property Grid" + navigationTitle: "Griglia delle proprietà", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Selezionare un elemento per personalizzarne le impostazioni disponibili nella Griglia delle proprietà.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Seleziona un elemento per personalizzarne le impostazioni disponibili nella Griglia Proprietà", + // [Auto-translated] "Property Grid" + propertyGrid: "Griglia delle proprietà", + // [Auto-translated] "Unsorted items" + unsortedItems: "Articoli non ordinati", + // [Auto-translated] "Name" + categoryName: "Nome", + // [Auto-translated] "Title" + categoryTitle: "Titolo", + // [Auto-translated] "Icon name" + iconName: "Nome dell'icona", + // [Auto-translated] "Name" + name: "Nome", + // [Auto-translated] "Title" + titleField: "Titolo", + // [Auto-translated] "Helper Text" + descriptionField: "Testo di supporto", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Trascina un elemento da questa colonna a quella sinistra: apparirà visibile nel pannello Schede. È inoltre possibile spostare gli elementi utilizzando i pulsanti più (+) e meno (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Aggiungi categoria personalizzata" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Aggiungere un nuovo elemento", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Aggiungere un nuovo elemento secondario", + // [Auto-translated] "New item in" + newItem: "Nuovo articolo in", + // [Auto-translated] "New Category" + addCustomCategory: "Nuova Categoria", + // [Auto-translated] "New category in" + newCategory: "Nuova categoria in", + // [Auto-translated] "Move to category..." + moveToCategory: "Sposta nella categoria...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Passa alla nuova categoria...", + // [Auto-translated] "Categories" + categoriesLabel: "Categorie", + // [Auto-translated] "Move To..." + moveTo: "Sposta in...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Rimuovi dal {0}", + // [Auto-translated] "More" + more: "Più", + // [Auto-translated] "Restore" + restoreToDefault: "Restaurare", + // [Auto-translated] "Edit" + edit: "Redigere", + // [Auto-translated] "Expand" + expand: "Espandere", + // [Auto-translated] "Collapse" + collapse: "Collasso", + // [Auto-translated] "Remove" + remove: "Togliere", + // [Auto-translated] "Add" + add: "Aggiungere", + // [Auto-translated] "Delete" + delete: "Cancellare" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Preset Creator", + // [Auto-translated] "Preset JSON:" + presetJson: "JSON preimpostato:", + // [Auto-translated] "Copy" + copy: "Copiare", + // [Auto-translated] "Download" + download: "Scaricare", + // [Auto-translated] "Load" + load: "Carico", + // [Auto-translated] "Save & Exit" + saveExit: "Salva ed esci", + // [Auto-translated] "Back" + back: "Indietro", + // [Auto-translated] "Reset to default" + resetToDefault: "Ripristina le impostazioni predefinite", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Tutte le impostazioni sono state ripristinate ai valori predefiniti", + // [Auto-translated] "resored to default" + resoredToDefault: "risorto in default", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Elemento ripristinato ai valori predefiniti", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Categoria ripristinata ai valori predefiniti", + // [Auto-translated] "Edit" + edit: "Redigere", + // [Auto-translated] "Save & Exit" + completeText: "Salva ed esci", + // [Auto-translated] "Back" + pagePrevText: "Indietro" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", + // [Auto-translated] "Presets" + presetsTab: "Preset", + // [Auto-translated] "Creator Presets" + creatorPresets: "Preset Creator", + // [Auto-translated] "Save & Exit" + save: "Salva ed esci", + // [Auto-translated] "File" file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Import" + import: "Importazione", + // [Auto-translated] "Export" + export: "Esportazione", + // [Auto-translated] "Edit" + edit: "Redigere", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Ripristina le lingue ai valori predefiniti", + // [Auto-translated] "Reset all changes" + resetAll: "Ripristina tutte le modifiche", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Ripristina {0} ai valori predefiniti" } }; const locale = getLocaleStrings("it"); diff --git a/packages/survey-creator-core/src/presets/localization/japanese.ts b/packages/survey-creator-core/src/presets/localization/japanese.ts index f15ef3ac69..3b34f08af3 100644 --- a/packages/survey-creator-core/src/presets/localization/japanese.ts +++ b/packages/survey-creator-core/src/presets/localization/japanese.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const jaStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "言語", + // [Auto-translated] "Languages" + navigationTitle: "言語", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "アンケート作成ツールのUIとターゲットの言語を選択します\n構成中の調査の言語。", + // [Auto-translated] "Creator UI language" + creatorUI: "クリエイター UI 言語", + // [Auto-translated] "Survey languages" + surveyLanguages: "調査言語", + // [Auto-translated] "Type to search..." + searchPlaceholder: "検索するには入力します...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "調査の言語名を英語に翻訳する" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "タブの構成", + // [Auto-translated] "Tabs" + navigationTitle: "タブ", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "表示したいタブを選択し、並べ替えたり、タイトルを変更したり、\nをクリックし、デフォルトでアクティブになるタブを選択します。", + // [Auto-translated] "Visible tabs" + items: "表示タブ", + // [Auto-translated] "Hidden tabs" + unsortedItems: "非表示のタブ", + // [Auto-translated] "Default tab" + defaultTab: "[デフォルト] タブ", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "この列から左の列に項目をドラッグすると、タブパネルに表示されます。プラス (+) ボタンとマイナス (-) ボタンを使用してアイテムを移動することもできます。", + // [Auto-translated] "Name" + name: "名前", + // [Auto-translated] "Title" + titleField: "タイトル", + // [Auto-translated] "Icon name" + iconName: "アイコン名" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "ツールボックスを設定する", + // [Auto-translated] "Toolbox" + navigationTitle: "ツールボックス", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "表示するツールボックス項目を選択し、カテゴリにグループ化します。\n名前を変更し、必要に応じて順序を変更します。", + // [Auto-translated] "Toolbox" + toolbox: "ツールボックス", + // [Auto-translated] "Categories" + categories: "カテゴリ", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "非表示のツールボックス項目", + // [Auto-translated] "Enable grouping" + enableGrouping: "グループ化を有効にする", + // [Auto-translated] "Show category titles" + showCategoryTitles: "カテゴリ タイトルを表示する", + // [Auto-translated] "Name" + categoryName: "名前", + // [Auto-translated] "Title" + categoryTitle: "タイトル", + // [Auto-translated] "Tooltip" + tooltip: "ツールチップ", + // [Auto-translated] "Icon name" + iconName: "アイコン名", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "ユーザーがこのツールボックス項目を選択したときに適用する JSON オブジェクト", + // [Auto-translated] "Subcategories" + subcategories: "サブカテゴリ", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "この質問のサブ項目を有効にしてください...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "サブアイテムとして移動する...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "ツールボックスに追加", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "カスタムアイテムの削除", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "この列から左側の列に項目をドラッグすると、ツールボックスパネルに表示されます。プラス (+) ボタンとマイナス (-) ボタンを使用してアイテムを移動することもできます。", + // [Auto-translated] "New Category" + addCustomCategory: "新しいカテゴリ", + // [Auto-translated] "New Item" + addCustomItem: "新商品", + // [Auto-translated] "Add a new item" + addNewItem: "新しい項目を追加する", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "新しいサブアイテムの追加", + // [Auto-translated] "There are no items" + noRowsText: "アイテムはありません", + // [Auto-translated] "New item in" + newItem: "新しいアイテム" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "プロパティグリッドのカスタマイズ", + // [Auto-translated] "Property Grid" + navigationTitle: "プロパティグリッド", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "要素を選択して、プロパティ グリッドで使用できる設定をカスタマイズします。", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "要素を選択して、プロパティグリッドで利用可能な設定をカスタマイズします", + // [Auto-translated] "Property Grid" + propertyGrid: "プロパティグリッド", + // [Auto-translated] "Unsorted items" + unsortedItems: "未ソートのアイテム", + // [Auto-translated] "Name" + categoryName: "名前", + // [Auto-translated] "Title" + categoryTitle: "タイトル", + // [Auto-translated] "Icon name" + iconName: "アイコン名", + // [Auto-translated] "Name" + name: "名前", + // [Auto-translated] "Title" + titleField: "タイトル", + // [Auto-translated] "Helper Text" + descriptionField: "ヘルパーテキスト", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "この列から左の列に項目をドラッグすると、タブパネルに表示されます。プラス (+) ボタンとマイナス (-) ボタンを使用してアイテムを移動することもできます。", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "カスタムカテゴリの追加" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "新しい項目を追加する", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "新しいサブアイテムの追加", + // [Auto-translated] "New item in" + newItem: "新しいアイテム", + // [Auto-translated] "New Category" + addCustomCategory: "新しいカテゴリ", + // [Auto-translated] "New category in" + newCategory: "新しいカテゴリ", + // [Auto-translated] "Move to category..." + moveToCategory: "カテゴリへ移動...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "新しいカテゴリに移動...", + // [Auto-translated] "Categories" + categoriesLabel: "カテゴリ", + // [Auto-translated] "Move To..." + moveTo: "移動先...", + // [Auto-translated] "Remove from {0}" + removeFrom: "{0}から削除", + // [Auto-translated] "More" + more: "もっとその", + // [Auto-translated] "Restore" + restoreToDefault: "戻す", + // [Auto-translated] "Edit" + edit: "編集", + // [Auto-translated] "Expand" + expand: "膨らむ", + // [Auto-translated] "Collapse" + collapse: "倒れる", + // [Auto-translated] "Remove" + remove: "取り去る", + // [Auto-translated] "Add" + add: "足す", + // [Auto-translated] "Delete" + delete: "削除" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "クリエイタープリセット", + // [Auto-translated] "Preset JSON:" + presetJson: "プリセットJSON:", + // [Auto-translated] "Copy" + copy: "写し", + // [Auto-translated] "Download" + download: "ダウンロード", + // [Auto-translated] "Load" + load: "負荷", + // [Auto-translated] "Save & Exit" + saveExit: "保存して終了", + // [Auto-translated] "Back" + back: "戻る", + // [Auto-translated] "Reset to default" + resetToDefault: "デフォルトにリセット", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "すべての設定がデフォルトに復元されました", + // [Auto-translated] "resored to default" + resoredToDefault: "デフォルトにリセット", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "既定に復元されたアイテム", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "カテゴリがデフォルトに復元されました", + // [Auto-translated] "Edit" + edit: "編集", + // [Auto-translated] "Save & Exit" + completeText: "保存して終了", + // [Auto-translated] "Back" + pagePrevText: "戻る" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "プリセット", + // [Auto-translated] "Creator Presets" + creatorPresets: "クリエイタープリセット", + // [Auto-translated] "Save & Exit" + save: "保存して終了", + // [Auto-translated] "File" + file: "ファイル", + // [Auto-translated] "Import" + import: "輸入", + // [Auto-translated] "Export" + export: "輸出", + // [Auto-translated] "Edit" + edit: "編集", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "言語をデフォルトにリセットする", + // [Auto-translated] "Reset all changes" + resetAll: "すべての変更をリセットする", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "{0}をデフォルトにリセットする" } }; const locale = getLocaleStrings("ja"); diff --git a/packages/survey-creator-core/src/presets/localization/korean.ts b/packages/survey-creator-core/src/presets/localization/korean.ts index 2390c86ea0..d9673a718b 100644 --- a/packages/survey-creator-core/src/presets/localization/korean.ts +++ b/packages/survey-creator-core/src/presets/localization/korean.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const koStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "언어들", + // [Auto-translated] "Languages" + navigationTitle: "언어들", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "설문조사 작성자 UI 및 타겟의 언어를 선택합니다.\n구성 중인 설문 조사의 언어입니다.", + // [Auto-translated] "Creator UI language" + creatorUI: "크리에이터 UI 언어", + // [Auto-translated] "Survey languages" + surveyLanguages: "설문조사 언어", + // [Auto-translated] "Type to search..." + searchPlaceholder: "검색하려면 입력...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "현장조사 언어 이름을 영어로 번역" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "탭 구성", + // [Auto-translated] "Tabs" + navigationTitle: "탭", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "표시하려는 탭을 선택하고, 순서를 변경하고, 제목을 변경하고,\n을 클릭하고 기본적으로 활성화될 탭을 선택합니다.", + // [Auto-translated] "Visible tabs" + items: "표시되는 탭", + // [Auto-translated] "Hidden tabs" + unsortedItems: "숨겨진 탭", + // [Auto-translated] "Default tab" + defaultTab: "기본 탭", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "이 열에서 왼쪽 열로 항목을 드래그하면 탭 패널에 표시됩니다. 더하기(+) 및 빼기(-) 버튼을 사용하여 항목을 이동할 수도 있습니다.", + // [Auto-translated] "Name" + name: "이름", + // [Auto-translated] "Title" + titleField: "타이틀", + // [Auto-translated] "Icon name" + iconName: "아이콘 이름" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "도구 상자 설정", + // [Auto-translated] "Toolbox" + navigationTitle: "도구", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "표시하려는 도구 상자 항목을 선택하고 범주로 그룹화하고, \n이름을 바꾸고 필요한 경우 순서를 변경합니다.", + // [Auto-translated] "Toolbox" + toolbox: "도구", + // [Auto-translated] "Categories" + categories: "카테고리", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "숨겨진 도구 상자 항목", + // [Auto-translated] "Enable grouping" + enableGrouping: "그룹화 사용", + // [Auto-translated] "Show category titles" + showCategoryTitles: "카테고리 제목 표시", + // [Auto-translated] "Name" + categoryName: "이름", + // [Auto-translated] "Title" + categoryTitle: "타이틀", + // [Auto-translated] "Tooltip" + tooltip: "툴팁", + // [Auto-translated] "Icon name" + iconName: "아이콘 이름", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "사용자가 이 도구 상자 항목을 선택할 때 적용할 JSON 개체", + // [Auto-translated] "Subcategories" + subcategories: "하위 범주", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "이 질문에 대한 하위 항목 활성화...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "하위 항목으로 이동...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "도구 상자에 추가", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "사용자 지정 항목 삭제", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "이 열에서 왼쪽 열로 항목을 드래그하면 도구 상자 패널에 표시됩니다. 더하기(+) 및 빼기(-) 버튼을 사용하여 항목을 이동할 수도 있습니다.", + // [Auto-translated] "New Category" + addCustomCategory: "새 카테고리", + // [Auto-translated] "New Item" + addCustomItem: "새 항목", + // [Auto-translated] "Add a new item" + addNewItem: "새 항목 추가", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "새 하위 항목 추가", + // [Auto-translated] "There are no items" + noRowsText: "항목이 없습니다.", + // [Auto-translated] "New item in" + newItem: "새 항목" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "속성 그리드 사용자 지정", + // [Auto-translated] "Property Grid" + navigationTitle: "속성 그리드", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "요소를 선택하여 속성 그리드에서 사용할 수 있는 설정을 사용자 정의합니다.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "요소를 선택하여 속성 그리드에서 사용할 수 있는 설정을 사용자 지정합니다", + // [Auto-translated] "Property Grid" + propertyGrid: "속성 그리드", + // [Auto-translated] "Unsorted items" + unsortedItems: "정렬되지 않은 항목", + // [Auto-translated] "Name" + categoryName: "이름", + // [Auto-translated] "Title" + categoryTitle: "타이틀", + // [Auto-translated] "Icon name" + iconName: "아이콘 이름", + // [Auto-translated] "Name" + name: "이름", + // [Auto-translated] "Title" + titleField: "타이틀", + // [Auto-translated] "Helper Text" + descriptionField: "도우미 텍스트", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "이 열에서 왼쪽 열로 항목을 드래그하면 탭 패널에 표시됩니다. 더하기(+) 및 빼기(-) 버튼을 사용하여 항목을 이동할 수도 있습니다.", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "사용자 지정 범주 추가" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "새 항목 추가", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "새 하위 항목 추가", + // [Auto-translated] "New item in" + newItem: "새 항목", + // [Auto-translated] "New Category" + addCustomCategory: "새 카테고리", + // [Auto-translated] "New category in" + newCategory: "의 새 범주", + // [Auto-translated] "Move to category..." + moveToCategory: "카테고리로 이동...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "새 카테고리로 이동...", + // [Auto-translated] "Categories" + categoriesLabel: "카테고리", + // [Auto-translated] "Move To..." + moveTo: "이동...", + // [Auto-translated] "Remove from {0}" + removeFrom: "{0}에서 제거", + // [Auto-translated] "More" + more: "더", + // [Auto-translated] "Restore" + restoreToDefault: "복원", + // [Auto-translated] "Edit" + edit: "편집하다", + // [Auto-translated] "Expand" + expand: "넓히다", + // [Auto-translated] "Collapse" + collapse: "무너지다", + // [Auto-translated] "Remove" + remove: "제거하다", + // [Auto-translated] "Add" + add: "더하다", + // [Auto-translated] "Delete" + delete: "삭제하다" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "크리에이터 프리셋", + // [Auto-translated] "Preset JSON:" + presetJson: "사전 설정 JSON:", + // [Auto-translated] "Copy" + copy: "복사", + // [Auto-translated] "Download" + download: "다운로드", + // [Auto-translated] "Load" + load: "부하", + // [Auto-translated] "Save & Exit" + saveExit: "저장 및 종료", + // [Auto-translated] "Back" + back: "뒤로", + // [Auto-translated] "Reset to default" + resetToDefault: "기본값으로 재설정", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "모든 설정이 기본값으로 복원됨", + // [Auto-translated] "resored to default" + resoredToDefault: "기본값으로 변경", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "항목이 기본값으로 복원됨", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "기본값으로 복원된 범주", + // [Auto-translated] "Edit" + edit: "편집하다", + // [Auto-translated] "Save & Exit" + completeText: "저장 및 종료", + // [Auto-translated] "Back" + pagePrevText: "뒤로" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "프리셋", + // [Auto-translated] "Creator Presets" + creatorPresets: "크리에이터 프리셋", + // [Auto-translated] "Save & Exit" + save: "저장 및 종료", + // [Auto-translated] "File" + file: "파일", + // [Auto-translated] "Import" + import: "수입", + // [Auto-translated] "Export" + export: "수출", + // [Auto-translated] "Edit" + edit: "편집하다", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "언어를 기본값으로 재설정", + // [Auto-translated] "Reset all changes" + resetAll: "모든 변경 사항 재설정", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "{0} 기본값으로 재설정" } }; const locale = getLocaleStrings("ko"); diff --git a/packages/survey-creator-core/src/presets/localization/malay.ts b/packages/survey-creator-core/src/presets/localization/malay.ts index 98ccd0964d..d8e1b30dba 100644 --- a/packages/survey-creator-core/src/presets/localization/malay.ts +++ b/packages/survey-creator-core/src/presets/localization/malay.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const msStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Bahasa-bahasa", + // [Auto-translated] "Languages" + navigationTitle: "Bahasa-bahasa", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Pilih bahasa UI dan sasaran Pencipta Tinjauan\nbahasa untuk tinjauan yang sedang dikonfigurasikan.", + // [Auto-translated] "Creator UI language" + creatorUI: "Bahasa UI pencipta", + // [Auto-translated] "Survey languages" + surveyLanguages: "Bahasa tinjauan", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Taip untuk mencari...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Terjemah nama bahasa Tinjauan ke bahasa Inggeris" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Konfigurasikan tab", + // [Auto-translated] "Tabs" + navigationTitle: "Tab", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Pilih tab yang anda mahu tunjukkan, susun semula, tukar tajuk mereka,\ndan pilih tab yang akan aktif secara lalai.", + // [Auto-translated] "Visible tabs" + items: "Tab yang boleh dilihat", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Tab tersembunyi", + // [Auto-translated] "Default tab" + defaultTab: "Tab lalai", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Seret item dari lajur ini ke kiri - ia akan kelihatan dalam panel Tab. Anda juga boleh mengalihkan item, menggunakan butang tambah (+) dan tolak (-).", + // [Auto-translated] "Name" + name: "Nama", + // [Auto-translated] "Title" + titleField: "Tajuk", + // [Auto-translated] "Icon name" + iconName: "Nama ikon" }, toolbox: { - title: "Set up the Toolbox", + // [Auto-translated] "Set up the Toolbox" + title: "Sediakan Kotak Alat", + // [Auto-translated] "Toolbox" navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Pilih item kotak alat yang ingin anda tunjukkan, kumpulkannya ke dalam kategori, \nNamakan semula mereka, dan tukar pesanan mereka jika perlu.", + // [Auto-translated] "Toolbox" toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Categories" + categories: "Kategori", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Item kotak alat tersembunyi", + // [Auto-translated] "Enable grouping" + enableGrouping: "Dayakan pengumpulan", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Tunjukkan tajuk kategori", + // [Auto-translated] "Name" + categoryName: "Nama", + // [Auto-translated] "Title" + categoryTitle: "Tajuk", + // [Auto-translated] "Tooltip" + tooltip: "Petua alat", + // [Auto-translated] "Icon name" + iconName: "Nama ikon", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "Objek JSON untuk digunakan apabila pengguna memilih item kotak alat ini", + // [Auto-translated] "Subcategories" + subcategories: "Subkategori", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Dayakan subitem untuk soalan ini...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Bergerak sebagai subitem ke...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Tambah ke Kotak Alat", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Padamkan Item Tersuai", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Seret item dari lajur ini ke kiri - ia akan kelihatan kelihatan dalam panel Kotak Alat. Anda juga boleh mengalihkan item, menggunakan butang tambah (+) dan tolak (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Kategori Baru", + // [Auto-translated] "New Item" + addCustomItem: "Item Baru", + // [Auto-translated] "Add a new item" + addNewItem: "Tambah item baharu", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Tambah subitem baharu", + // [Auto-translated] "There are no items" + noRowsText: "Tiada item", + // [Auto-translated] "New item in" + newItem: "Item baru dalam" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Sesuaikan Grid Harta", + // [Auto-translated] "Property Grid" + navigationTitle: "Grid Harta", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Pilih elemen untuk menyesuaikan tetapannya yang tersedia dalam Grid Property.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Pilih elemen untuk menyesuaikan tetapannya yang tersedia dalam Grid Sifat", + // [Auto-translated] "Property Grid" + propertyGrid: "Grid Harta", + // [Auto-translated] "Unsorted items" + unsortedItems: "Item yang tidak diisih", + // [Auto-translated] "Name" + categoryName: "Nama", + // [Auto-translated] "Title" + categoryTitle: "Tajuk", + // [Auto-translated] "Icon name" + iconName: "Nama ikon", + // [Auto-translated] "Name" + name: "Nama", + // [Auto-translated] "Title" + titleField: "Tajuk", + // [Auto-translated] "Helper Text" + descriptionField: "Teks Pembantu", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Seret item dari lajur ini ke kiri - ia akan kelihatan dalam panel Tab. Anda juga boleh mengalihkan item, menggunakan butang tambah (+) dan tolak (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Tambah Kategori Tersuai" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", + // [Auto-translated] "Add a new item" + addNewItem: "Tambah item baharu", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Tambah subitem baharu", + // [Auto-translated] "New item in" + newItem: "Item baru dalam", + // [Auto-translated] "New Category" + addCustomCategory: "Kategori Baru", + // [Auto-translated] "New category in" + newCategory: "Kategori baru dalam", + // [Auto-translated] "Move to category..." + moveToCategory: "Pindah ke kategori...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Beralih ke kategori baru...", + // [Auto-translated] "Categories" + categoriesLabel: "Kategori", + // [Auto-translated] "Move To..." + moveTo: "Beralih ke...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Alih keluar dari {0}", + // [Auto-translated] "More" + more: "Lebih banyak", + // [Auto-translated] "Restore" + restoreToDefault: "Ambil semula", + // [Auto-translated] "Edit" edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Expand" + expand: "Mengembangkan", + // [Auto-translated] "Collapse" + collapse: "Runtuh", + // [Auto-translated] "Remove" + remove: "Mengalih keluar", + // [Auto-translated] "Add" + add: "Menambah", + // [Auto-translated] "Delete" + delete: "Menghapuskan" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", + // [Auto-translated] "Creator Presets" + title: "Pratetap Pencipta", + // [Auto-translated] "Preset JSON:" + presetJson: "JSON pratetap:", + // [Auto-translated] "Copy" + copy: "Menyalin", + // [Auto-translated] "Download" + download: "Muat turun", + // [Auto-translated] "Load" + load: "Memuatkan", + // [Auto-translated] "Save & Exit" + saveExit: "Simpan & Keluar", + // [Auto-translated] "Back" + back: "Kembali", + // [Auto-translated] "Reset to default" + resetToDefault: "Tetapkan semula kepada lalai", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Semua tetapan dipulihkan kepada lalai", + // [Auto-translated] "resored to default" + resoredToDefault: "dikembalikan kepada lalai", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Item dipulihkan kepada lalai", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Kategori dipulihkan kepada lalai", + // [Auto-translated] "Edit" edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Save & Exit" + completeText: "Simpan & Keluar", + // [Auto-translated] "Back" + pagePrevText: "Kembali" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", + // [Auto-translated] "Presets" + presetsTab: "Pratetap", + // [Auto-translated] "Creator Presets" + creatorPresets: "Pratetap Pencipta", + // [Auto-translated] "Save & Exit" + save: "Simpan & Keluar", + // [Auto-translated] "File" + file: "Fail", + // [Auto-translated] "Import" import: "Import", - export: "Export", + // [Auto-translated] "Export" + export: "Eksport", + // [Auto-translated] "Edit" edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Tetapkan semula Bahasa kepada lalai", + // [Auto-translated] "Reset all changes" + resetAll: "Tetapkan semula semua perubahan", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Tetapkan semula {0} kepada lalai" } }; const locale = getLocaleStrings("ms"); diff --git a/packages/survey-creator-core/src/presets/localization/mongolian.ts b/packages/survey-creator-core/src/presets/localization/mongolian.ts index 3c4d67c992..da1a69f203 100644 --- a/packages/survey-creator-core/src/presets/localization/mongolian.ts +++ b/packages/survey-creator-core/src/presets/localization/mongolian.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const mnStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Хэл", + // [Auto-translated] "Languages" + navigationTitle: "Хэл", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Survey Creator UI-ийн хэл болон зорилгоо сонго\nтохируулж буй судалгааны хэлнүүд.", + // [Auto-translated] "Creator UI language" + creatorUI: "Creator UI хэл", + // [Auto-translated] "Survey languages" + surveyLanguages: "Судалгааны хэлнүүд", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Хайх гэж бич...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Судалгааны хэлний нэрсийг англи хэл рүү орчуул" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", + // [Auto-translated] "Configure tabs" + title: "Табуудыг тохируулах", + // [Auto-translated] "Tabs" + navigationTitle: "Таб", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Үзүүлэхийг хүссэн табуудаа сонгож, дарааллыг нь өөрчилж, гарчгийг нь өөрчилж,\nстандарт байдлаар идэвхтэй байх табыг сонгоно.", + // [Auto-translated] "Visible tabs" + items: "Харагдах таб", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Нуугдмал таб", + // [Auto-translated] "Default tab" defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Энэ баганаас зүүн тал руу нэг зүйлийг чирч гарга - Tabs panel-д харагдана. Мөн плюс (+) болон минус (-) товчлууруудыг ашиглан эд зүйлсийг зөөж болно.", + // [Auto-translated] "Name" + name: "Нэр", + // [Auto-translated] "Title" + titleField: "Гарчиг", + // [Auto-translated] "Icon name" iconName: "Icon name" }, toolbox: { - title: "Set up the Toolbox", + // [Auto-translated] "Set up the Toolbox" + title: "Toolbox-ыг тохируулах", + // [Auto-translated] "Toolbox" navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Үзүүлэхийг хүссэн toolbox зүйлсээ сонгоод ангилалд хувааж \nнэрийг нь өөрчилж, шаардлагатай бол дарааллыг нь өөрчил.", + // [Auto-translated] "Toolbox" toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", + // [Auto-translated] "Categories" + categories: "Ангилал", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Нуугдмал хэрэгслийн зүйлс", + // [Auto-translated] "Enable grouping" + enableGrouping: "Бүлэглэлийг идэвхжүүлэх", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Ангилалын гарчгийг үзүүлэх", + // [Auto-translated] "Name" + categoryName: "Нэр", + // [Auto-translated] "Title" + categoryTitle: "Гарчиг", + // [Auto-translated] "Tooltip" tooltip: "Tooltip", + // [Auto-translated] "Icon name" iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "JSON объект хэрэглэгчид энэ toolbox элементийг сонгоход хэрэглэнэ", + // [Auto-translated] "Subcategories" + subcategories: "Дэд ангилал", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Энэ асуултын дэд элементүүдийг идэвхжүүл...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Дэд зүйл болгон шилжүүлнэ...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Toolbox-д оруулах", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Custom item устгах", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Энэ баганаас зүүн тал руу нэг зүйлийг чирч гарга - энэ нь Toolbox panel-д харагдах болно. Мөн плюс (+) болон минус (-) товчлууруудыг ашиглан эд зүйлсийг зөөж болно.", + // [Auto-translated] "New Category" + addCustomCategory: "Шинэ ангилал", + // [Auto-translated] "New Item" + addCustomItem: "Шинэ зүйл", + // [Auto-translated] "Add a new item" + addNewItem: "Шинэ зүйл нэмж оруул", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Шинэ дэд элемент нэм��х", + // [Auto-translated] "There are no items" + noRowsText: "Ямар ч зүйл байхгүй", + // [Auto-translated] "New item in" + newItem: "Шинэ зүйл" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", + // [Auto-translated] "Customize the Property Grid" + title: "Property grid-ийг тохируулах", + // [Auto-translated] "Property Grid" + navigationTitle: "Өмч хөрөнгийн сүлжээ", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Property Grid-д байгаа тохиргоог нь тохируулахын тулд элементийг сонго.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Property Grid-д байгаа тохиргоог нь тохируулах элементийг сонго", + // [Auto-translated] "Property Grid" + propertyGrid: "Өмч хөрөнгийн сүлжээ", + // [Auto-translated] "Unsorted items" + unsortedItems: "Ангилаагүй зүйлс", + // [Auto-translated] "Name" + categoryName: "Нэр", + // [Auto-translated] "Title" + categoryTitle: "Гарчиг", + // [Auto-translated] "Icon name" iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Name" + name: "Нэр", + // [Auto-translated] "Title" + titleField: "Гарчиг", + // [Auto-translated] "Helper Text" + descriptionField: "Туслах текст", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Энэ баганаас зүүн тал руу нэг зүйлийг чирч гарга - Tabs panel-д харагдана. Мөн плюс (+) болон минус (-) товчлууруудыг ашиглан эд зүйлсийг зөөж болно.", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Custom Category нэмэх" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Шинэ зүйл нэмж оруул", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Шинэ дэд элемент нэм��х", + // [Auto-translated] "New item in" + newItem: "Шинэ зүйл", + // [Auto-translated] "New Category" + addCustomCategory: "Шинэ ангилал", + // [Auto-translated] "New category in" + newCategory: "Шинэ ангилал", + // [Auto-translated] "Move to category..." + moveToCategory: "Ангилал руу шилжүүл...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Шинэ ангилал руу шилжүүл...", + // [Auto-translated] "Categories" + categoriesLabel: "Ангилал", + // [Auto-translated] "Move To..." + moveTo: "Нүүх ...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Хас {0}", + // [Auto-translated] "More" + more: "Илүү", + // [Auto-translated] "Restore" + restoreToDefault: "Сэргээх", + // [Auto-translated] "Edit" + edit: "Засварлах", + // [Auto-translated] "Expand" + expand: "Өргөтгөх", + // [Auto-translated] "Collapse" + collapse: "Унах", + // [Auto-translated] "Remove" + remove: "Хас", + // [Auto-translated] "Add" + add: "Нэмэх", + // [Auto-translated] "Delete" + delete: "Устгах" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Бүтээгчийн урьдчилсан сет", + // [Auto-translated] "Preset JSON:" + presetJson: "Урьдчилсан тохируулга JSON:", + // [Auto-translated] "Copy" + copy: "Хуулбарлах", + // [Auto-translated] "Download" + download: "Татаж авах", + // [Auto-translated] "Load" + load: "Ачаа", + // [Auto-translated] "Save & Exit" + saveExit: "Хадгалах & Гарах", + // [Auto-translated] "Back" + back: "Буцах", + // [Auto-translated] "Reset to default" + resetToDefault: "Default руу reset", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Бүх тохиргоог default байдалд сэргээсэн", + // [Auto-translated] "resored to default" + resoredToDefault: "Default руу дахин орсон", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Item default-д сэргээгдсэн", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Категори default байдалд сэргээгдсэн", + // [Auto-translated] "Edit" + edit: "Засварлах", + // [Auto-translated] "Save & Exit" + completeText: "Хадгалах & Гарах", + // [Auto-translated] "Back" + pagePrevText: "Буцах" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "Урьдчилсан тохируулга", + // [Auto-translated] "Creator Presets" + creatorPresets: "Бүтээгчийн урьдчилсан сет", + // [Auto-translated] "Save & Exit" + save: "Хадгалах & Гарах", + // [Auto-translated] "File" + file: "Файл", + // [Auto-translated] "Import" + import: "Импорт", + // [Auto-translated] "Export" + export: "Экспорт", + // [Auto-translated] "Edit" + edit: "Засварлах", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Хэлнүүдийг default болгож өөрчлөх", + // [Auto-translated] "Reset all changes" + resetAll: "Бүх өөрчлөлтийг сэргээ", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Стандарт {0}" } }; const locale = getLocaleStrings("mn"); diff --git a/packages/survey-creator-core/src/presets/localization/norwegian.ts b/packages/survey-creator-core/src/presets/localization/norwegian.ts index 19c703b427..11a18a373b 100644 --- a/packages/survey-creator-core/src/presets/localization/norwegian.ts +++ b/packages/survey-creator-core/src/presets/localization/norwegian.ts @@ -1,118 +1,217 @@ import { getLocaleStrings } from "survey-creator-core"; -export const noStrings = { +export const nbStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Språk", + // [Auto-translated] "Languages" + navigationTitle: "Språk", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Velg språket for brukergrensesnittet og målet for undersøkelsesoppretteren\nspråk for undersøkelsen som konfigureres.", + // [Auto-translated] "Creator UI language" + creatorUI: "Språk for skapergrensesnitt", + // [Auto-translated] "Survey languages" + surveyLanguages: "Språk for undersøkelser", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Skriv for å søke...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Oversette navn på spørreundersøkelsesspråk til engelsk" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Konfigurere faner", + // [Auto-translated] "Tabs" + navigationTitle: "Kategoriene", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Velg fanene du vil vise, endre rekkefølgen på dem, endre titlene deres,\nog velg fanen som skal være aktiv som standard.", + // [Auto-translated] "Visible tabs" + items: "Synlige faner", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Skjulte faner", + // [Auto-translated] "Default tab" + defaultTab: "Standard-fanen", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Dra et element fra denne kolonnen til venstre - det vil vises synlig i Faner-panelet. Du kan også flytte elementer ved hjelp av pluss- (+) og minusknapper (-).", + // [Auto-translated] "Name" + name: "Navn", + // [Auto-translated] "Title" + titleField: "Tittel", + // [Auto-translated] "Icon name" + iconName: "Navn på ikon" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "Sett opp verktøykassen", + // [Auto-translated] "Toolbox" + navigationTitle: "Verktøykasse", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Velg verktøykasseelementene du vil vise, grupper dem i kategorier, \ngi dem nytt navn, og endre rekkefølgen om nødvendig.", + // [Auto-translated] "Toolbox" + toolbox: "Verktøykasse", + // [Auto-translated] "Categories" + categories: "Kategorier", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Skjulte elementer i verktøykassen", + // [Auto-translated] "Enable grouping" + enableGrouping: "Aktivere gruppering", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Vis kategorititler", + // [Auto-translated] "Name" + categoryName: "Navn", + // [Auto-translated] "Title" + categoryTitle: "Tittel", + // [Auto-translated] "Tooltip" + tooltip: "Verktøytips", + // [Auto-translated] "Icon name" + iconName: "Navn på ikon", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "JSON-objekt som skal brukes når brukere velger dette verktøykasseelementet", + // [Auto-translated] "Subcategories" + subcategories: "Underkategorier", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Aktiver underelementer for dette spørsmålet...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Flytt som et underelement til...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Legg til i verktøykassen", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Slett egendefinert element", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Dra et element fra denne kolonnen til venstre - det vil vises synlig i Verktøykasse-panelet. Du kan også flytte elementer ved hjelp av pluss- (+) og minusknapper (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Ny kategori", + // [Auto-translated] "New Item" + addCustomItem: "Nytt element", + // [Auto-translated] "Add a new item" + addNewItem: "Legg til et nytt element", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Legge til et nytt underelement", + // [Auto-translated] "There are no items" + noRowsText: "Det er ingen varer", + // [Auto-translated] "New item in" + newItem: "Nytt element i" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Tilpasse egenskapsrutenettet", + // [Auto-translated] "Property Grid" + navigationTitle: "Eiendom rutenett", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Velg et element for å tilpasse innstillingene som er tilgjengelige i egenskapsrutenettet.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Velg et element for å tilpasse innstillingene som er tilgjengelige i egenskapsrutenettet", + // [Auto-translated] "Property Grid" + propertyGrid: "Eiendom rutenett", + // [Auto-translated] "Unsorted items" + unsortedItems: "Usorterte elementer", + // [Auto-translated] "Name" + categoryName: "Navn", + // [Auto-translated] "Title" + categoryTitle: "Tittel", + // [Auto-translated] "Icon name" + iconName: "Navn på ikon", + // [Auto-translated] "Name" + name: "Navn", + // [Auto-translated] "Title" + titleField: "Tittel", + // [Auto-translated] "Helper Text" + descriptionField: "Tekst til hjelper", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Dra et element fra denne kolonnen til venstre - det vil vises synlig i Faner-panelet. Du kan også flytte elementer ved hjelp av pluss- (+) og minusknapper (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Legg til egendefinert kategori" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Legg til et nytt element", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Legge til et nytt underelement", + // [Auto-translated] "New item in" + newItem: "Nytt element i", + // [Auto-translated] "New Category" + addCustomCategory: "Ny kategori", + // [Auto-translated] "New category in" + newCategory: "Ny kategori i", + // [Auto-translated] "Move to category..." + moveToCategory: "Flytt til kategori...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Flytt til ny kategori...", + // [Auto-translated] "Categories" + categoriesLabel: "Kategorier", + // [Auto-translated] "Move To..." + moveTo: "Flytt til...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Fjern fra {0}", + // [Auto-translated] "More" + more: "Mer", + // [Auto-translated] "Restore" + restoreToDefault: "Gjenopprette", + // [Auto-translated] "Edit" + edit: "Redigere", + // [Auto-translated] "Expand" + expand: "Utvide", + // [Auto-translated] "Collapse" + collapse: "Sammenbrudd", + // [Auto-translated] "Remove" + remove: "Fjerne", + // [Auto-translated] "Add" + add: "Tilføye", + // [Auto-translated] "Delete" + delete: "Slette" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Forhåndsinnstillinger for skapere", + // [Auto-translated] "Preset JSON:" + presetJson: "Forhåndsinnstilt JSON:", + // [Auto-translated] "Copy" + copy: "Kopi", + // [Auto-translated] "Download" + download: "Laste ned", + // [Auto-translated] "Load" + load: "Belastning", + // [Auto-translated] "Save & Exit" + saveExit: "Lagre og avslutt", + // [Auto-translated] "Back" + back: "Tilbake", + // [Auto-translated] "Reset to default" + resetToDefault: "Tilbakestill til standard", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Alle innstillinger gjenopprettet til standard", + // [Auto-translated] "resored to default" + resoredToDefault: "Omgjort til standard", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Element gjenopprettet til standard", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Kategori gjenopprettet til standard", + // [Auto-translated] "Edit" + edit: "Redigere", + // [Auto-translated] "Save & Exit" + completeText: "Lagre og avslutt", + // [Auto-translated] "Back" + pagePrevText: "Tilbake" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "Forhåndsinnstillinger", + // [Auto-translated] "Creator Presets" + creatorPresets: "Forhåndsinnstillinger for skapere", + // [Auto-translated] "Save & Exit" + save: "Lagre og avslutt", + // [Auto-translated] "File" + file: "Fil", + // [Auto-translated] "Import" + import: "Importere", + // [Auto-translated] "Export" + export: "Eksport", + // [Auto-translated] "Edit" + edit: "Redigere", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Tilbakestill språk til standard", + // [Auto-translated] "Reset all changes" + resetAll: "Tilbakestill alle endringer", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Tilbakestill {0} til standardinnstillinger" } }; -const locale = getLocaleStrings("no"); -locale.presets = noStrings; +const locale = getLocaleStrings("nb"); +locale.presets = nbStrings; diff --git a/packages/survey-creator-core/src/presets/localization/persian.ts b/packages/survey-creator-core/src/presets/localization/persian.ts index cd7a9120ed..309d4d920e 100644 --- a/packages/survey-creator-core/src/presets/localization/persian.ts +++ b/packages/survey-creator-core/src/presets/localization/persian.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const faStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "زبان", + // [Auto-translated] "Languages" + navigationTitle: "زبان", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "زبان رابط کاربری Survey Creator و هدف را انتخاب کنید\nزبان هایی برای نظرسنجی پیکربندی شده است.", + // [Auto-translated] "Creator UI language" + creatorUI: "زبان رابط کاربری سازنده", + // [Auto-translated] "Survey languages" + surveyLanguages: "زبان های نظرسنجی", + // [Auto-translated] "Type to search..." + searchPlaceholder: "برای جستجو تایپ کنید...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "نام زبان های نظرسنجی را به انگلیسی ترجمه کنید" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "پیکربندی تب ها", + // [Auto-translated] "Tabs" + navigationTitle: "زبانه", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "برگه هایی را که می خواهید نشان دهید انتخاب کنید، آنها را تغییر دهید، عناوین آنها را تغییر دهید،\nو برگه ای را انتخاب کنید که به طور پیش فرض فعال خواهد بود.", + // [Auto-translated] "Visible tabs" + items: "برگه های قابل مشاهده", + // [Auto-translated] "Hidden tabs" + unsortedItems: "برگه های مخفی", + // [Auto-translated] "Default tab" + defaultTab: "برگه پیش فرض", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "یک مورد را از این ستون به سمت چپ بکشید - در پنل Tabs قابل مشاهده ظاهر می شود. همچنین می توانید موارد را با استفاده از دکمه های مثبت (+) و منفی (-) جابجا کنید.", + // [Auto-translated] "Name" + name: "نام", + // [Auto-translated] "Title" + titleField: "عنوان", + // [Auto-translated] "Icon name" + iconName: "نام نماد" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", + // [Auto-translated] "Set up the Toolbox" + title: "جعبه ابزار را راه اندازی کنید", + // [Auto-translated] "Toolbox" + navigationTitle: "جعبه ابزار", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "موارد جعبه ابزاری را که می خواهید نشان دهید انتخاب کنید، آنها را در دسته ها گروه بندی کنید، \nنام آنها را تغییر دهید و در صورت لزوم ترتیب آنها را تغییر دهید.", + // [Auto-translated] "Toolbox" + toolbox: "جعبه ابزار", + // [Auto-translated] "Categories" + categories: "دسته", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "موارد جعبه ابزار مخفی", + // [Auto-translated] "Enable grouping" + enableGrouping: "گروه بندی را فعال کنید", + // [Auto-translated] "Show category titles" + showCategoryTitles: "نمایش عناوین دسته بندی", + // [Auto-translated] "Name" + categoryName: "نام", + // [Auto-translated] "Title" + categoryTitle: "عنوان", + // [Auto-translated] "Tooltip" tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Icon name" + iconName: "نام نماد", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "JSON برای اعمال زمانی که کاربران این مورد جعبه ابزار را انتخاب می کنند", + // [Auto-translated] "Subcategories" + subcategories: "زیر مجموعه ها", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "موارد فرعی را برای این سوال فعال کنید...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "به عنوان یک زیر آیتم به...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "اضافه کردن به جعبه ابزار", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "حذف آیتم سفارشی", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "یک مورد را از این ستون به سمت چپ بکشید - در پانل جعبه ابزار قابل مشاهده ظاهر می شود. همچنین می توانید موارد را با استفاده از دکمه های مثبت (+) و منفی (-) جابجا کنید.", + // [Auto-translated] "New Category" + addCustomCategory: "دسته بندی جدید", + // [Auto-translated] "New Item" + addCustomItem: "مورد جدید", + // [Auto-translated] "Add a new item" + addNewItem: "افزودن مورد جدید", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "افزودن یک مورد فرعی ��دید", + // [Auto-translated] "There are no items" + noRowsText: "هیچ موردی وجود ندارد", + // [Auto-translated] "New item in" + newItem: "مورد جدید در" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "سفارشی سازی Property Grid", + // [Auto-translated] "Property Grid" + navigationTitle: "شبکه املاک", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "یک عنصر را انتخاب کنید تا تنظیمات موجود در Property Grid را سفارشی کنید.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "یک عنصر را برای سفارشی کردن تنظیمات موجود در Property Grid انتخاب کنید", + // [Auto-translated] "Property Grid" + propertyGrid: "شبکه املاک", + // [Auto-translated] "Unsorted items" + unsortedItems: "موارد مرتب نشده", + // [Auto-translated] "Name" + categoryName: "نام", + // [Auto-translated] "Title" + categoryTitle: "عنوان", + // [Auto-translated] "Icon name" + iconName: "نام نماد", + // [Auto-translated] "Name" + name: "نام", + // [Auto-translated] "Title" + titleField: "عنوان", + // [Auto-translated] "Helper Text" + descriptionField: "متن کمکی", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "یک مورد را از این ستون به سمت چپ بکشید - در پنل Tabs قابل مشاهده ظاهر می شود. همچنین می توانید موارد را با استفاده از دکمه های مثبت (+) و منفی (-) جابجا کنید.", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "افزودن دسته بندی سفارشی" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "افزودن مورد جدید", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "افزودن یک مورد فرعی ��دید", + // [Auto-translated] "New item in" + newItem: "مورد جدید در", + // [Auto-translated] "New Category" + addCustomCategory: "دسته بندی جدید", + // [Auto-translated] "New category in" + newCategory: "دسته بندی جدید در", + // [Auto-translated] "Move to category..." + moveToCategory: "رفتن به دسته...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "رفتن به دسته بندی جدید...", + // [Auto-translated] "Categories" + categoriesLabel: "دسته", + // [Auto-translated] "Move To..." + moveTo: "حرکت به...", + // [Auto-translated] "Remove from {0}" + removeFrom: "حذف از {0}", + // [Auto-translated] "More" + more: "بیشتر", + // [Auto-translated] "Restore" + restoreToDefault: "بازیابی", + // [Auto-translated] "Edit" + edit: "ویرایش", + // [Auto-translated] "Expand" + expand: "گسترش", + // [Auto-translated] "Collapse" + collapse: "سقوط", + // [Auto-translated] "Remove" + remove: "حذف", + // [Auto-translated] "Add" + add: "اضافه کردن", + // [Auto-translated] "Delete" + delete: "حذف" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "از پیش تنظیم های سازنده", + // [Auto-translated] "Preset JSON:" + presetJson: "JSON از پیش تعیین شده:", + // [Auto-translated] "Copy" + copy: "کپی", + // [Auto-translated] "Download" + download: "دانلود", + // [Auto-translated] "Load" + load: "بار", + // [Auto-translated] "Save & Exit" + saveExit: "ذخیره و خروج", + // [Auto-translated] "Back" + back: "بازگشت", + // [Auto-translated] "Reset to default" + resetToDefault: "بازنشانی به حالت پیش فرض", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "همه تنظیمات به حالت پیش فرض بازگردانده شدند", + // [Auto-translated] "resored to default" + resoredToDefault: "به طور پیش فرض بازگردانده شده است", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "مورد به حالت پیش فرض بازگردانده شد", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "دسته بندی به حالت پیش فرض بازگردانده شد", + // [Auto-translated] "Edit" + edit: "ویرایش", + // [Auto-translated] "Save & Exit" + completeText: "ذخیره و خروج", + // [Auto-translated] "Back" + pagePrevText: "بازگشت" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "الگوها", + // [Auto-translated] "Creator Presets" + creatorPresets: "از پیش تنظیم های سازنده", + // [Auto-translated] "Save & Exit" + save: "ذخیره و خروج", + // [Auto-translated] "File" + file: "فایل", + // [Auto-translated] "Import" + import: "واردات", + // [Auto-translated] "Export" + export: "صادرات", + // [Auto-translated] "Edit" + edit: "ویرایش", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "بازنشانی زبان ها به حالت پیش فرض", + // [Auto-translated] "Reset all changes" + resetAll: "بازنشانی همه تغییرات", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "بازنشانی {0} به پیش فرض" } }; const locale = getLocaleStrings("fa"); diff --git a/packages/survey-creator-core/src/presets/localization/polish.ts b/packages/survey-creator-core/src/presets/localization/polish.ts index 8c0940d24d..aa74d8ce4b 100644 --- a/packages/survey-creator-core/src/presets/localization/polish.ts +++ b/packages/survey-creator-core/src/presets/localization/polish.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const plStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Języki", + // [Auto-translated] "Languages" + navigationTitle: "Języki", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Wybierz język interfejsu użytkownika i celu kreatora ankiety\njęzyki dla konfigurowanej ankiety.", + // [Auto-translated] "Creator UI language" + creatorUI: "Język interfejsu twórcy", + // [Auto-translated] "Survey languages" + surveyLanguages: "Języki ankiety", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Wpisz, aby wyszukać...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Tłumaczenie nazw języków ankiety na język angielski" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Konfigurowanie kart", + // [Auto-translated] "Tabs" + navigationTitle: "Karty", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Wybierz zakładki, które chcesz wyświetlić, zmień ich kolejność, zmień ich tytuły,\ni wybierz kartę, która będzie domyślnie aktywna.", + // [Auto-translated] "Visible tabs" + items: "Widoczne zakładki", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Ukryte karty", + // [Auto-translated] "Default tab" + defaultTab: "Zakładka Domyślne", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Przeciągnij element z tej kolumny do lewej - pojawi się on widoczny w panelu Karty. Możesz także przenosić elementy za pomocą przycisków plus (+) i minus (-).", + // [Auto-translated] "Name" + name: "Nazwa", + // [Auto-translated] "Title" + titleField: "Tytuł", + // [Auto-translated] "Icon name" + iconName: "Nazwa ikony" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "Konfigurowanie przybornika", + // [Auto-translated] "Toolbox" + navigationTitle: "Skrzynka z narzędziami", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Wybierz elementy przybornika, które chcesz wyświetlić, pogrupuj je w kategorie, \nZmień ich nazwy i zmień ich kolejność, jeśli jest to wymagane.", + // [Auto-translated] "Toolbox" + toolbox: "Skrzynka z narzędziami", + // [Auto-translated] "Categories" + categories: "Kategorie", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Ukryte elementy przybornika", + // [Auto-translated] "Enable grouping" + enableGrouping: "Włączanie grupowania", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Pokaż tytuły kategorii", + // [Auto-translated] "Name" + categoryName: "Nazwa", + // [Auto-translated] "Title" + categoryTitle: "Tytuł", + // [Auto-translated] "Tooltip" + tooltip: "Podpowiedź", + // [Auto-translated] "Icon name" + iconName: "Nazwa ikony", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "Obiekt JSON do zastosowania, gdy użytkownicy wybiorą ten element przybornika", + // [Auto-translated] "Subcategories" + subcategories: "Podkategorie", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Włącz elementy podrzędne dla tego pytania...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Przenieś jako element podrzędny do...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Dodaj do przybornika", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Usuń element niestandardowy", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Przeciągnij element z tej kolumny do lewej - pojawi się on w panelu Przybornik. Możesz także przenosić elementy za pomocą przycisków plus (+) i minus (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Nowa kategoria", + // [Auto-translated] "New Item" + addCustomItem: "Nowy przedmiot", + // [Auto-translated] "Add a new item" + addNewItem: "Dodawanie nowego elementu", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Dodawanie nowego elementu podrzędnego", + // [Auto-translated] "There are no items" + noRowsText: "Nie ma żadnych przedmiotów", + // [Auto-translated] "New item in" + newItem: "Nowy przedmiot w" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Dostosowywanie siatki właściwości", + // [Auto-translated] "Property Grid" + navigationTitle: "Siatka właściwości", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Wybierz element, aby dostosować jego ustawienia dostępne w siatce właściwości.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Wybierz element, aby dostosować jego ustawienia dostępne w siatce właściwości", + // [Auto-translated] "Property Grid" + propertyGrid: "Siatka właściwości", + // [Auto-translated] "Unsorted items" + unsortedItems: "Nieposortowane przedmioty", + // [Auto-translated] "Name" + categoryName: "Nazwa", + // [Auto-translated] "Title" + categoryTitle: "Tytuł", + // [Auto-translated] "Icon name" + iconName: "Nazwa ikony", + // [Auto-translated] "Name" + name: "Nazwa", + // [Auto-translated] "Title" + titleField: "Tytuł", + // [Auto-translated] "Helper Text" + descriptionField: "Tekst pomocniczy", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Przeciągnij element z tej kolumny do lewej - pojawi się on widoczny w panelu Karty. Możesz także przenosić elementy za pomocą przycisków plus (+) i minus (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Dodaj kategorię niestandardową" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Dodawanie nowego elementu", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Dodawanie nowego elementu podrzędnego", + // [Auto-translated] "New item in" + newItem: "Nowy przedmiot w", + // [Auto-translated] "New Category" + addCustomCategory: "Nowa kategoria", + // [Auto-translated] "New category in" + newCategory: "Nowa kategoria w", + // [Auto-translated] "Move to category..." + moveToCategory: "Przejdź do kategorii...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Przejdź do nowej kategorii...", + // [Auto-translated] "Categories" + categoriesLabel: "Kategorie", + // [Auto-translated] "Move To..." + moveTo: "Przenieś się do...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Usuń z {0}", + // [Auto-translated] "More" + more: "Więcej", + // [Auto-translated] "Restore" + restoreToDefault: "Przywrócić", + // [Auto-translated] "Edit" + edit: "Redagować", + // [Auto-translated] "Expand" + expand: "Rozszerzać", + // [Auto-translated] "Collapse" + collapse: "Zapaść", + // [Auto-translated] "Remove" + remove: "Usunąć", + // [Auto-translated] "Add" + add: "Dodawać", + // [Auto-translated] "Delete" + delete: "Usunąć" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Ustawienia predefiniowane twórcy", + // [Auto-translated] "Preset JSON:" + presetJson: "Wstępnie ustawiony kod JSON:", + // [Auto-translated] "Copy" + copy: "Kopiować", + // [Auto-translated] "Download" + download: "Pobierać", + // [Auto-translated] "Load" + load: "Ładunek", + // [Auto-translated] "Save & Exit" + saveExit: "Zapisz i wyjdź", + // [Auto-translated] "Back" + back: "Wstecz", + // [Auto-translated] "Reset to default" + resetToDefault: "Przywróć ustawienia domyślne", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Wszystkie ustawienia przywrócone do wartości domyślnych", + // [Auto-translated] "resored to default" + resoredToDefault: "Resetowany do domyślnego", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Element przywrócony do wartości domyślnej", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Kategoria przywrócona do wartości domyślnej", + // [Auto-translated] "Edit" + edit: "Redagować", + // [Auto-translated] "Save & Exit" + completeText: "Zapisz i wyjdź", + // [Auto-translated] "Back" + pagePrevText: "Wstecz" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", + // [Auto-translated] "Presets" + presetsTab: "Ustawień", + // [Auto-translated] "Creator Presets" + creatorPresets: "Ustawienia predefiniowane twórcy", + // [Auto-translated] "Save & Exit" + save: "Zapisz i wyjdź", + // [Auto-translated] "File" + file: "Plik", + // [Auto-translated] "Import" import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Export" + export: "Eksport", + // [Auto-translated] "Edit" + edit: "Redagować", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Zresetuj języki do domyślnych", + // [Auto-translated] "Reset all changes" + resetAll: "Zresetuj wszystkie zmiany", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Resetowanie {0} do ustawień domyślnych" } }; const locale = getLocaleStrings("pl"); diff --git a/packages/survey-creator-core/src/presets/localization/portuguese.ts b/packages/survey-creator-core/src/presets/localization/portuguese.ts index a14eb7412f..a2ca36f6b5 100644 --- a/packages/survey-creator-core/src/presets/localization/portuguese.ts +++ b/packages/survey-creator-core/src/presets/localization/portuguese.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const ptStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Idiomas", + // [Auto-translated] "Languages" + navigationTitle: "Idiomas", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Selecione o idioma da interface do usuário e do Survey Creator\nidiomas para a pesquisa que está sendo configurada.", + // [Auto-translated] "Creator UI language" + creatorUI: "Idioma da interface do usuário do criador", + // [Auto-translated] "Survey languages" + surveyLanguages: "Idiomas da pesquisa", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Digite para pesquisar...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Traduzir nomes de idiomas de pesquisa para inglês" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Configurar guias", + // [Auto-translated] "Tabs" + navigationTitle: "Guias", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Selecione as guias que deseja mostrar, reordene-as, altere seus títulos,\ne escolha a guia que estará ativa por padrão.", + // [Auto-translated] "Visible tabs" + items: "Guias visíveis", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Guias ocultas", + // [Auto-translated] "Default tab" + defaultTab: "Guia Padrão", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Arraste um item desta coluna para a esquerda - ele aparecerá visível no painel Guias. Você também pode mover itens, usando os botões de mais (+) e menos (-).", + // [Auto-translated] "Name" + name: "Nome", + // [Auto-translated] "Title" + titleField: "Título", + // [Auto-translated] "Icon name" + iconName: "Nome do ícone" }, toolbox: { - title: "Set up the Toolbox", + // [Auto-translated] "Set up the Toolbox" + title: "Configurar a caixa de ferramentas", + // [Auto-translated] "Toolbox" navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Selecione os itens da caixa de ferramentas que deseja mostrar, agrupe-os em categorias, \nRenomeie-os e altere sua ordem, se necessário.", + // [Auto-translated] "Toolbox" toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Categories" + categories: "Categorias", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Itens ocultos da caixa de ferramentas", + // [Auto-translated] "Enable grouping" + enableGrouping: "Habilitar agrupamento", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Mostrar títulos de categorias", + // [Auto-translated] "Name" + categoryName: "Nome", + // [Auto-translated] "Title" + categoryTitle: "Título", + // [Auto-translated] "Tooltip" + tooltip: "Dica de ferramenta", + // [Auto-translated] "Icon name" + iconName: "Nome do ícone", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "JSON a ser aplicado quando os usuários selecionam este item da caixa de ferramentas", + // [Auto-translated] "Subcategories" + subcategories: "Subcategorias", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Habilitar subitens para esta pergunta...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Mover como um subitem para...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Adicionar à caixa de ferramentas", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Excluir item personalizado", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Arraste um item desta coluna para a esquerda - ele aparecerá visível no painel Caixa de ferramentas. Você também pode mover itens, usando os botões de mais (+) e menos (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Nova categoria", + // [Auto-translated] "New Item" + addCustomItem: "Novo item", + // [Auto-translated] "Add a new item" + addNewItem: "Adicionar um novo item", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Adicionar um novo subitem", + // [Auto-translated] "There are no items" + noRowsText: "Não há itens", + // [Auto-translated] "New item in" + newItem: "Novo item em" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Personalizar a grade de propriedades", + // [Auto-translated] "Property Grid" + navigationTitle: "Grade de propriedades", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Selecione um elemento para personalizar suas configurações disponíveis na Grade de propriedades.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Selecione um elemento para personalizar suas configurações disponíveis na Grade de propriedades", + // [Auto-translated] "Property Grid" + propertyGrid: "Grade de propriedades", + // [Auto-translated] "Unsorted items" + unsortedItems: "Itens não classificados", + // [Auto-translated] "Name" + categoryName: "Nome", + // [Auto-translated] "Title" + categoryTitle: "Título", + // [Auto-translated] "Icon name" + iconName: "Nome do ícone", + // [Auto-translated] "Name" + name: "Nome", + // [Auto-translated] "Title" + titleField: "Título", + // [Auto-translated] "Helper Text" + descriptionField: "Texto auxiliar", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Arraste um item desta coluna para a esquerda - ele aparecerá visível no painel Guias. Você também pode mover itens, usando os botões de mais (+) e menos (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Adicionar categoria personalizada" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Adicionar um novo item", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Adicionar um novo subitem", + // [Auto-translated] "New item in" + newItem: "Novo item em", + // [Auto-translated] "New Category" + addCustomCategory: "Nova categoria", + // [Auto-translated] "New category in" + newCategory: "Nova categoria em", + // [Auto-translated] "Move to category..." + moveToCategory: "Mover para a categoria...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Mover para uma nova categoria...", + // [Auto-translated] "Categories" + categoriesLabel: "Categorias", + // [Auto-translated] "Move To..." + moveTo: "Mover para...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Remover do {0}", + // [Auto-translated] "More" + more: "Mais", + // [Auto-translated] "Restore" + restoreToDefault: "Restaurar", + // [Auto-translated] "Edit" + edit: "Editar", + // [Auto-translated] "Expand" + expand: "Expandir", + // [Auto-translated] "Collapse" + collapse: "Colapso", + // [Auto-translated] "Remove" + remove: "Retirar", + // [Auto-translated] "Add" + add: "Adicionar", + // [Auto-translated] "Delete" + delete: "Excluir" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Predefinições do criador", + // [Auto-translated] "Preset JSON:" + presetJson: "JSON predefinido:", + // [Auto-translated] "Copy" + copy: "Copiar", + // [Auto-translated] "Download" + download: "Baixar", + // [Auto-translated] "Load" + load: "Carga", + // [Auto-translated] "Save & Exit" + saveExit: "Salvar e sair", + // [Auto-translated] "Back" + back: "Voltar", + // [Auto-translated] "Reset to default" + resetToDefault: "Redefinir para o padrão", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Todas as configurações restauradas para o padrão", + // [Auto-translated] "resored to default" + resoredToDefault: "resored para padrão", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Item restaurado para o padrão", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Categoria restaurada para o padrão", + // [Auto-translated] "Edit" + edit: "Editar", + // [Auto-translated] "Save & Exit" + completeText: "Salvar e sair", + // [Auto-translated] "Back" + pagePrevText: "Voltar" }, plugin: { + // [Auto-translated] "Presets" presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Creator Presets" + creatorPresets: "Predefinições do criador", + // [Auto-translated] "Save & Exit" + save: "Salvar e sair", + // [Auto-translated] "File" + file: "Arquivo", + // [Auto-translated] "Import" + import: "Importação", + // [Auto-translated] "Export" + export: "Exportação", + // [Auto-translated] "Edit" + edit: "Editar", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Redefinir idiomas para o padrão", + // [Auto-translated] "Reset all changes" + resetAll: "Redefinir todas as alterações", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Redefinir {0} para os padrões" } }; const locale = getLocaleStrings("pt"); diff --git a/packages/survey-creator-core/src/presets/localization/romanian.ts b/packages/survey-creator-core/src/presets/localization/romanian.ts index ed4552192a..9472467c4e 100644 --- a/packages/survey-creator-core/src/presets/localization/romanian.ts +++ b/packages/survey-creator-core/src/presets/localization/romanian.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const roStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Limbi", + // [Auto-translated] "Languages" + navigationTitle: "Limbi", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Selectați limba interfeței de utilizare Survey Creator și țintă\nlimbile pentru sondajul în curs de configurare.", + // [Auto-translated] "Creator UI language" + creatorUI: "Limba interfeței de utilizare a creatorului", + // [Auto-translated] "Survey languages" + surveyLanguages: "Limbi de sondaj", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Tastați pentru a căuta...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Traduceți numele limbilor sondajului în engleză" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Configurarea filelor", + // [Auto-translated] "Tabs" + navigationTitle: "File", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Selectați filele pe care doriți să le afișați, reordonați-le, schimbați-le titlurile,\nși alegeți fila care va fi activă în mod implicit.", + // [Auto-translated] "Visible tabs" + items: "File vizibile", + // [Auto-translated] "Hidden tabs" + unsortedItems: "File ascunse", + // [Auto-translated] "Default tab" + defaultTab: "Fila implicită", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Trageți un element din această coloană în cea din stânga - acesta va apărea vizibil în panoul File. De asemenea, puteți muta elemente, folosind butoanele plus (+) și minus (-).", + // [Auto-translated] "Name" + name: "Nume", + // [Auto-translated] "Title" + titleField: "Titlu", + // [Auto-translated] "Icon name" + iconName: "Nume pictogramă" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "Configurarea casetei de scule", + // [Auto-translated] "Toolbox" + navigationTitle: "Cutie de scule", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Selectați elementele din caseta de instrumente pe care doriți să le afișați, grupați-le în categorii, \nredenumiți-le și schimbați-le ordinea dacă este necesar.", + // [Auto-translated] "Toolbox" + toolbox: "Cutie de scule", + // [Auto-translated] "Categories" + categories: "Categorii", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Elemente ascunse din cutia de instrumente", + // [Auto-translated] "Enable grouping" + enableGrouping: "Activați gruparea", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Afișați titlurile categoriilor", + // [Auto-translated] "Name" + categoryName: "Nume", + // [Auto-translated] "Title" + categoryTitle: "Titlu", + // [Auto-translated] "Tooltip" + tooltip: "Sfat", + // [Auto-translated] "Icon name" + iconName: "Nume pictogramă", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "Obiect JSON de aplicat atunci când utilizatorii selectează acest element din caseta de instrumente", + // [Auto-translated] "Subcategories" + subcategories: "Subcategorii", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Activați subelemente pentru această întrebare...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Mutați ca subelement în...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Adăugați în trusa de instrumente", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Ștergeți elementul personalizat", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Trageți un element din această coloană în cea din stânga - acesta va apărea vizibil în panoul Trusa de scule. De asemenea, puteți muta elemente, folosind butoanele plus (+) și minus (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Categorie nouă", + // [Auto-translated] "New Item" + addCustomItem: "Articol nou", + // [Auto-translated] "Add a new item" + addNewItem: "Adăugarea unui element nou", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Adăugarea unui subelement nou", + // [Auto-translated] "There are no items" + noRowsText: "Nu există articole", + // [Auto-translated] "New item in" + newItem: "Articol nou în" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Personalizarea grilei de proprietăți", + // [Auto-translated] "Property Grid" + navigationTitle: "Grilă de proprietăți", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Selectați un element pentru a-i personaliza setările disponibile în grila de proprietăți.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Selectați un element pentru a-i personaliza setările disponibile în grila de proprietăți", + // [Auto-translated] "Property Grid" + propertyGrid: "Grilă de proprietăți", + // [Auto-translated] "Unsorted items" + unsortedItems: "Articole nesortate", + // [Auto-translated] "Name" + categoryName: "Nume", + // [Auto-translated] "Title" + categoryTitle: "Titlu", + // [Auto-translated] "Icon name" + iconName: "Nume pictogramă", + // [Auto-translated] "Name" + name: "Nume", + // [Auto-translated] "Title" + titleField: "Titlu", + // [Auto-translated] "Helper Text" + descriptionField: "Text de ajutor", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Trageți un element din această coloană în cea din stânga - acesta va apărea vizibil în panoul File. De asemenea, puteți muta elemente, folosind butoanele plus (+) și minus (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Adăugați o categorie personalizată" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Adăugarea unui element nou", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Adăugarea unui subelement nou", + // [Auto-translated] "New item in" + newItem: "Articol nou în", + // [Auto-translated] "New Category" + addCustomCategory: "Categorie nouă", + // [Auto-translated] "New category in" + newCategory: "Categorie nouă în", + // [Auto-translated] "Move to category..." + moveToCategory: "Mutați la categorie...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Treceți la o categorie nouă...", + // [Auto-translated] "Categories" + categoriesLabel: "Categorii", + // [Auto-translated] "Move To..." + moveTo: "Mutați la...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Scoate din {0}", + // [Auto-translated] "More" + more: "Mai mult", + // [Auto-translated] "Restore" + restoreToDefault: "Restaura", + // [Auto-translated] "Edit" + edit: "Editare", + // [Auto-translated] "Expand" + expand: "Expanda", + // [Auto-translated] "Collapse" + collapse: "Colaps", + // [Auto-translated] "Remove" + remove: "Depărta", + // [Auto-translated] "Add" + add: "Adăuga", + // [Auto-translated] "Delete" + delete: "Șterge" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Presetări pentru creatori", + // [Auto-translated] "Preset JSON:" + presetJson: "JSON presetat:", + // [Auto-translated] "Copy" + copy: "Copie", + // [Auto-translated] "Download" + download: "Descărca", + // [Auto-translated] "Load" + load: "Încărca", + // [Auto-translated] "Save & Exit" + saveExit: "Salvare și ieșire", + // [Auto-translated] "Back" + back: "Spate", + // [Auto-translated] "Reset to default" + resetToDefault: "Resetare la valori implicite", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Toate setările au fost restaurate la valorile implicite", + // [Auto-translated] "resored to default" + resoredToDefault: "resorat în mod implicit", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Element restaurat la valori implicite", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Categorie restaurată la valori implicite", + // [Auto-translated] "Edit" + edit: "Editare", + // [Auto-translated] "Save & Exit" + completeText: "Salvare și ieșire", + // [Auto-translated] "Back" + pagePrevText: "Spate" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", + // [Auto-translated] "Presets" + presetsTab: "Presetări", + // [Auto-translated] "Creator Presets" + creatorPresets: "Presetări pentru creatori", + // [Auto-translated] "Save & Exit" + save: "Salvare și ieșire", + // [Auto-translated] "File" + file: "Fișier", + // [Auto-translated] "Import" + import: "Importa", + // [Auto-translated] "Export" export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Edit" + edit: "Editare", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Resetați limbile la valorile implicite", + // [Auto-translated] "Reset all changes" + resetAll: "Resetați toate modificările", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Resetați {0} la valorile implicite" } }; const locale = getLocaleStrings("ro"); diff --git a/packages/survey-creator-core/src/presets/localization/russian.ts b/packages/survey-creator-core/src/presets/localization/russian.ts index 29c172ed56..c782924b0e 100644 --- a/packages/survey-creator-core/src/presets/localization/russian.ts +++ b/packages/survey-creator-core/src/presets/localization/russian.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const ruStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Языки", + // [Auto-translated] "Languages" + navigationTitle: "Языки", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Выберите язык пользовательского интерфейса создателя опросов и целевую цель\nЯзыки для конфигурируемого опроса.", + // [Auto-translated] "Creator UI language" + creatorUI: "Язык пользовательского интерфейса автора", + // [Auto-translated] "Survey languages" + surveyLanguages: "Языки опроса", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Введите для поиска...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Перевод названий языков опроса на английский" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Настройка вкладок", + // [Auto-translated] "Tabs" + navigationTitle: "Вкладки", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Выберите вкладки, которые вы хотите показать, измените их порядок, измените их названия,\nи выберите вкладку, которая будет активна по умолчанию.", + // [Auto-translated] "Visible tabs" + items: "Видимые вкладки", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Скрытые вкладки", + // [Auto-translated] "Default tab" + defaultTab: "Вкладка \"По умолчанию\"", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Перетащите элемент из этой колонки в левую - он появится видимым на панели Вкладок. Вы также можете перемещать предметы, используя кнопки «плюс» (+) и «минус» (-).", + // [Auto-translated] "Name" + name: "Имя", + // [Auto-translated] "Title" + titleField: "Титул", + // [Auto-translated] "Icon name" + iconName: "Название иконки" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "Настройка Toolbox", + // [Auto-translated] "Toolbox" + navigationTitle: "Ящик для инструментов", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Выберите элементы панели инструментов, которые вы хотите показать, сгруппируйте их по категориям, \nПереименуйте их и при необходимости измените их порядок.", + // [Auto-translated] "Toolbox" + toolbox: "Ящик для инструментов", + // [Auto-translated] "Categories" + categories: "Категории", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Скрытые элементы панели инструментов", + // [Auto-translated] "Enable grouping" + enableGrouping: "Включить группировку", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Показать названия категорий", + // [Auto-translated] "Name" + categoryName: "Имя", + // [Auto-translated] "Title" + categoryTitle: "Титул", + // [Auto-translated] "Tooltip" + tooltip: "Всплывающая подсказка", + // [Auto-translated] "Icon name" + iconName: "Название иконки", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "Объект JSON, который будет применяться при выборе пользователем этого элемента панели инструментов", + // [Auto-translated] "Subcategories" + subcategories: "Подкатегории", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Включите подпункты для этого вопроса...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Переместить в качестве подэлемента в...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Добавить в Toolbox", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Удалить пользовательский элемент", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Перетащите элемент из этой колонки в левую - он появится видимым на панели Toolbox. Вы также можете перемещать предметы, используя кнопки «плюс» (+) и «минус» (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Новая категория", + // [Auto-translated] "New Item" + addCustomItem: "Новый товар", + // [Auto-translated] "Add a new item" + addNewItem: "Добавить новый товар", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Добавление нового подэлемента", + // [Auto-translated] "There are no items" + noRowsText: "Нет предметов", + // [Auto-translated] "New item in" + newItem: "Новый товар в" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Настройка сетки свойств", + // [Auto-translated] "Property Grid" + navigationTitle: "Сетка свойств", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Выберите элемент, чтобы настроить его параметры, доступные в сетке свойств.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Выберите элемент, чтобы настроить его параметры, доступные в сетке свойств", + // [Auto-translated] "Property Grid" + propertyGrid: "Сетка свойств", + // [Auto-translated] "Unsorted items" + unsortedItems: "Неотсортированные товары", + // [Auto-translated] "Name" + categoryName: "Имя", + // [Auto-translated] "Title" + categoryTitle: "Титул", + // [Auto-translated] "Icon name" + iconName: "Название иконки", + // [Auto-translated] "Name" + name: "Имя", + // [Auto-translated] "Title" + titleField: "Титул", + // [Auto-translated] "Helper Text" + descriptionField: "Вспомогательный текст", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Перетащите элемент из этой колонки в левую - он появится видимым на панели Вкладок. Вы также можете перемещать предметы, используя кнопки «плюс» (+) и «минус» (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Добавить пользовательскую категорию" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Добавить новый товар", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Добавление нового подэлемента", + // [Auto-translated] "New item in" + newItem: "Новый товар в", + // [Auto-translated] "New Category" + addCustomCategory: "Новая категория", + // [Auto-translated] "New category in" + newCategory: "Новая категория в", + // [Auto-translated] "Move to category..." + moveToCategory: "Перейти в категорию...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Перейти в новую категорию...", + // [Auto-translated] "Categories" + categoriesLabel: "Категории", + // [Auto-translated] "Move To..." + moveTo: "Переместиться в...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Удалить из {0}", + // [Auto-translated] "More" + more: "Больше", + // [Auto-translated] "Restore" + restoreToDefault: "Восстанавливать", + // [Auto-translated] "Edit" + edit: "Редактировать", + // [Auto-translated] "Expand" + expand: "Расширять", + // [Auto-translated] "Collapse" + collapse: "Коллапс", + // [Auto-translated] "Remove" + remove: "Убирать", + // [Auto-translated] "Add" + add: "Добавлять", + // [Auto-translated] "Delete" + delete: "Удалить" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Пресеты для создателей", + // [Auto-translated] "Preset JSON:" + presetJson: "Предустановленный JSON:", + // [Auto-translated] "Copy" + copy: "Копировать", + // [Auto-translated] "Download" + download: "Загружать", + // [Auto-translated] "Load" + load: "Груз", + // [Auto-translated] "Save & Exit" + saveExit: "Сохранить и выйти", + // [Auto-translated] "Back" + back: "Назад", + // [Auto-translated] "Reset to default" + resetToDefault: "Сброс до значений по умолчанию", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Все настройки восстановлены по умолчанию", + // [Auto-translated] "resored to default" + resoredToDefault: "восстановлено по умолчанию", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Элемент восстановлен по умолчанию", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Категория восстановлена по умолчанию", + // [Auto-translated] "Edit" + edit: "Редактировать", + // [Auto-translated] "Save & Exit" + completeText: "Сохранить и выйти", + // [Auto-translated] "Back" + pagePrevText: "Назад" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "Пресетов", + // [Auto-translated] "Creator Presets" + creatorPresets: "Пресеты для создателей", + // [Auto-translated] "Save & Exit" + save: "Сохранить и выйти", + // [Auto-translated] "File" + file: "Файл", + // [Auto-translated] "Import" + import: "Импорт", + // [Auto-translated] "Export" + export: "Экспорт", + // [Auto-translated] "Edit" + edit: "Редактировать", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Сбросить настройки «Языки» до значений по умолчанию", + // [Auto-translated] "Reset all changes" + resetAll: "Сбросить все изменения", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Сброс {0} значений по умолчанию" } }; const locale = getLocaleStrings("ru"); diff --git a/packages/survey-creator-core/src/presets/localization/simplified-chinese.ts b/packages/survey-creator-core/src/presets/localization/simplified-chinese.ts index 20ad8a0475..fa3ed6e7f7 100644 --- a/packages/survey-creator-core/src/presets/localization/simplified-chinese.ts +++ b/packages/survey-creator-core/src/presets/localization/simplified-chinese.ts @@ -1,118 +1,217 @@ import { getLocaleStrings } from "survey-creator-core"; -export const zhStrings = { +export const zhCnStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "语言", + // [Auto-translated] "Languages" + navigationTitle: "语言", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "选择调查创建者 UI 和目标的语言\n正在配置的调查的语言。", + // [Auto-translated] "Creator UI language" + creatorUI: "创作者 UI 语言", + // [Auto-translated] "Survey languages" + surveyLanguages: "调查语言", + // [Auto-translated] "Type to search..." + searchPlaceholder: "键入搜索...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "将调查语言名称翻译成英语" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "配置选项卡", + // [Auto-translated] "Tabs" + navigationTitle: "制表符", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "选择要显示的选项卡,重新排序它们,更改它们的标题,\n,然后选择默认处于活动状态的选项卡。", + // [Auto-translated] "Visible tabs" + items: "可见选项卡", + // [Auto-translated] "Hidden tabs" + unsortedItems: "隐藏标签页", + // [Auto-translated] "Default tab" + defaultTab: "默认选项卡", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "将项目从此列拖到左侧 - 它将在选项卡面板中显示。您还可以使用加号 (+) 和减号 (-) 按钮移动项目。", + // [Auto-translated] "Name" + name: "名字", + // [Auto-translated] "Title" + titleField: "标题", + // [Auto-translated] "Icon name" + iconName: "图标名称" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "设置工具箱", + // [Auto-translated] "Toolbox" + navigationTitle: "工具箱", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "选择要显示的工具箱项目,将它们分组为类别,\n重命名它们,并根据需要更改它们的顺序。", + // [Auto-translated] "Toolbox" + toolbox: "工具箱", + // [Auto-translated] "Categories" + categories: "类别", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "隐藏的工具箱项目", + // [Auto-translated] "Enable grouping" + enableGrouping: "启用分组", + // [Auto-translated] "Show category titles" + showCategoryTitles: "显示类别标题", + // [Auto-translated] "Name" + categoryName: "名字", + // [Auto-translated] "Title" + categoryTitle: "标题", + // [Auto-translated] "Tooltip" + tooltip: "工具提示", + // [Auto-translated] "Icon name" + iconName: "图标名称", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "当用户选择此工具箱项时要应用的 JSON 对象", + // [Auto-translated] "Subcategories" + subcategories: "子类别", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "为此问题启用子项...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "作为子项移动到...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "添加到工具箱", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "删除自定义项目", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "将项目从此列拖到左侧 - 它将在“工具箱”面板中显示。您还可以使用加号 (+) 和减号 (-) 按钮移动项目。", + // [Auto-translated] "New Category" + addCustomCategory: "新类别", + // [Auto-translated] "New Item" + addCustomItem: "新商品", + // [Auto-translated] "Add a new item" + addNewItem: "添加新项目", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "添加新子项", + // [Auto-translated] "There are no items" + noRowsText: "没有项目", + // [Auto-translated] "New item in" + newItem: "新项目" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "自定义属性网格", + // [Auto-translated] "Property Grid" + navigationTitle: "属性网格", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "选择一个元素以自定义其在属性网格中可用的设置。", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "选择一个元素以自定义其在属性网格中可用的设置", + // [Auto-translated] "Property Grid" + propertyGrid: "属性网格", + // [Auto-translated] "Unsorted items" + unsortedItems: "未排序的项目", + // [Auto-translated] "Name" + categoryName: "名字", + // [Auto-translated] "Title" + categoryTitle: "标题", + // [Auto-translated] "Icon name" + iconName: "图标名称", + // [Auto-translated] "Name" + name: "名字", + // [Auto-translated] "Title" + titleField: "标题", + // [Auto-translated] "Helper Text" + descriptionField: "辅助文本", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "将项目从此列拖到左侧 - 它将在选项卡面板中显示。您还可以使用加号 (+) 和减号 (-) 按钮移动项目。", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "添加自定义类别" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "添加新项目", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "添加新子项", + // [Auto-translated] "New item in" + newItem: "新项目", + // [Auto-translated] "New Category" + addCustomCategory: "新类别", + // [Auto-translated] "New category in" + newCategory: "新类别", + // [Auto-translated] "Move to category..." + moveToCategory: "移至分类...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "移至新类别...", + // [Auto-translated] "Categories" + categoriesLabel: "类别", + // [Auto-translated] "Move To..." + moveTo: "移动到...", + // [Auto-translated] "Remove from {0}" + removeFrom: "从{0}中删除", + // [Auto-translated] "More" + more: "更多", + // [Auto-translated] "Restore" + restoreToDefault: "恢复", + // [Auto-translated] "Edit" + edit: "编辑", + // [Auto-translated] "Expand" + expand: "扩大", + // [Auto-translated] "Collapse" + collapse: "崩溃", + // [Auto-translated] "Remove" + remove: "删除", + // [Auto-translated] "Add" + add: "加", + // [Auto-translated] "Delete" + delete: "删除" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "创作者预设", + // [Auto-translated] "Preset JSON:" + presetJson: "预设 JSON:", + // [Auto-translated] "Copy" + copy: "复制", + // [Auto-translated] "Download" + download: "下载", + // [Auto-translated] "Load" + load: "负荷", + // [Auto-translated] "Save & Exit" + saveExit: "保存并退出", + // [Auto-translated] "Back" + back: "返回", + // [Auto-translated] "Reset to default" + resetToDefault: "重置为默认值", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "所有设置恢复为默认值", + // [Auto-translated] "resored to default" + resoredToDefault: "重置为默认值", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "项目恢复为默认值", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "类别恢复为默认值", + // [Auto-translated] "Edit" + edit: "编辑", + // [Auto-translated] "Save & Exit" + completeText: "保存并退出", + // [Auto-translated] "Back" + pagePrevText: "返回" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "预设", + // [Auto-translated] "Creator Presets" + creatorPresets: "创作者预设", + // [Auto-translated] "Save & Exit" + save: "保存并退出", + // [Auto-translated] "File" + file: "文件", + // [Auto-translated] "Import" + import: "进口", + // [Auto-translated] "Export" + export: "出口", + // [Auto-translated] "Edit" + edit: "编辑", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "将语言重置为默认值", + // [Auto-translated] "Reset all changes" + resetAll: "重置所有更改", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "将{0}重置为默认值" } }; -const locale = getLocaleStrings("zh"); -locale.presets = zhStrings; +const locale = getLocaleStrings("zh-cn"); +locale.presets = zhCnStrings; diff --git a/packages/survey-creator-core/src/presets/localization/slovak.ts b/packages/survey-creator-core/src/presets/localization/slovak.ts index 2d500b6bd5..9daddf4b70 100644 --- a/packages/survey-creator-core/src/presets/localization/slovak.ts +++ b/packages/survey-creator-core/src/presets/localization/slovak.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const skStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Jazyky", + // [Auto-translated] "Languages" + navigationTitle: "Jazyky", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Vyberte jazyk používateľského rozhrania a cieľa tvorcu prieskumu\njazyky pre konfigurovaný prieskum.", + // [Auto-translated] "Creator UI language" + creatorUI: "Jazyk používateľského rozhrania tvorcu", + // [Auto-translated] "Survey languages" + surveyLanguages: "Jazyky prieskumu", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Zadajte na vyhľadávanie...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Preložiť názvy jazykov prieskumu do angličtiny" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Konfigurácia kariet", + // [Auto-translated] "Tabs" + navigationTitle: "Karty", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Vyberte karty, ktoré chcete zobraziť, zmeňte ich poradie, zmeňte ich názvy,\na vyberte kartu, ktorá bude predvolene aktívna.", + // [Auto-translated] "Visible tabs" + items: "Viditeľné karty", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Skryté karty", + // [Auto-translated] "Default tab" + defaultTab: "Predvolená karta", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Presuňte položku z tohto stĺpca doľava - zobrazí sa viditeľne na paneli Karty. Položky môžete presúvať aj pomocou tlačidiel plus (+) a mínus (-).", + // [Auto-translated] "Name" + name: "Meno", + // [Auto-translated] "Title" + titleField: "Titul", + // [Auto-translated] "Icon name" + iconName: "Názov ikony" }, toolbox: { - title: "Set up the Toolbox", + // [Auto-translated] "Set up the Toolbox" + title: "Nastavenie aplikácie Toolbox", + // [Auto-translated] "Toolbox" navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Vyberte položky panela nástrojov, ktoré chcete zobraziť, zoskupte ich do kategórií, \nPremenujte ich a v prípade potreby zmeňte ich poradie.", + // [Auto-translated] "Toolbox" toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Categories" + categories: "Kategórie", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Skryté položky panela s nástrojmi", + // [Auto-translated] "Enable grouping" + enableGrouping: "Povoliť zoskupovanie", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Zobraziť názvy kategórií", + // [Auto-translated] "Name" + categoryName: "Meno", + // [Auto-translated] "Title" + categoryTitle: "Titul", + // [Auto-translated] "Tooltip" + tooltip: "Popis", + // [Auto-translated] "Icon name" + iconName: "Názov ikony", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "Objekt JSON, ktorý sa použije, keď používatelia vyberú túto položku panela nástrojov", + // [Auto-translated] "Subcategories" + subcategories: "Podkategórie", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Povoliť podpoložky pre túto otázku...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Presunúť ako podpoložku do...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Pridať do Toolboxu", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Odstrániť vlastnú položku", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Presuňte položku z tohto stĺpca doľava - zobrazí sa viditeľná na paneli Toolbox. Položky môžete presúvať aj pomocou tlačidiel plus (+) a mínus (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Nová kategória", + // [Auto-translated] "New Item" + addCustomItem: "Nová položka", + // [Auto-translated] "Add a new item" + addNewItem: "Pridanie novej položky", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Pridanie novej podpoložky", + // [Auto-translated] "There are no items" + noRowsText: "Nie sú žiadne položky", + // [Auto-translated] "New item in" + newItem: "Nová položka v" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Prispôsobenie mriežky vlastností", + // [Auto-translated] "Property Grid" + navigationTitle: "Mriežka vlastností", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Vyberte prvok, ktorý chcete prispôsobiť jeho nastavenia, ktoré sú k dispozícii v mriežke vlastností.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Výberom prvku prispôsobte jeho nastavenia dostupné v mriežke vlastností", + // [Auto-translated] "Property Grid" + propertyGrid: "Mriežka vlastností", + // [Auto-translated] "Unsorted items" + unsortedItems: "Nezoradené položky", + // [Auto-translated] "Name" + categoryName: "Meno", + // [Auto-translated] "Title" + categoryTitle: "Titul", + // [Auto-translated] "Icon name" + iconName: "Názov ikony", + // [Auto-translated] "Name" + name: "Meno", + // [Auto-translated] "Title" + titleField: "Titul", + // [Auto-translated] "Helper Text" + descriptionField: "Pomocný text", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Presuňte položku z tohto stĺpca doľava - zobrazí sa viditeľne na paneli Karty. Položky môžete presúvať aj pomocou tlačidiel plus (+) a mínus (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Pridať vlastnú kategóriu" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Pridanie novej položky", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Pridanie novej podpoložky", + // [Auto-translated] "New item in" + newItem: "Nová položka v", + // [Auto-translated] "New Category" + addCustomCategory: "Nová kategória", + // [Auto-translated] "New category in" + newCategory: "Nová kategória v", + // [Auto-translated] "Move to category..." + moveToCategory: "Presunúť do kategórie...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Presunúť do novej kategórie...", + // [Auto-translated] "Categories" + categoriesLabel: "Kategórie", + // [Auto-translated] "Move To..." + moveTo: "Presunúť do...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Odstrániť z {0}", + // [Auto-translated] "More" + more: "Viacej", + // [Auto-translated] "Restore" + restoreToDefault: "Obnoviť", + // [Auto-translated] "Edit" + edit: "Editovať", + // [Auto-translated] "Expand" + expand: "Rozšíriť", + // [Auto-translated] "Collapse" + collapse: "Kolaps", + // [Auto-translated] "Remove" + remove: "Odstrániť", + // [Auto-translated] "Add" + add: "Sčítať", + // [Auto-translated] "Delete" + delete: "Odstrániť" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Predvoľby tvorcu", + // [Auto-translated] "Preset JSON:" + presetJson: "Predvoľba JSON:", + // [Auto-translated] "Copy" + copy: "Kopírovať", + // [Auto-translated] "Download" + download: "Stiahnuť", + // [Auto-translated] "Load" + load: "Naložiť", + // [Auto-translated] "Save & Exit" + saveExit: "Uložiť a ukončiť", + // [Auto-translated] "Back" + back: "Chrbát", + // [Auto-translated] "Reset to default" + resetToDefault: "Obnoviť predvolené nastavenia", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Všetky nastavenia obnovené na predvolené", + // [Auto-translated] "resored to default" + resoredToDefault: "vrátené na predvolené", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Položka obnovená na predvolené hodnoty", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Kategória obnovená na predvolené", + // [Auto-translated] "Edit" + edit: "Editovať", + // [Auto-translated] "Save & Exit" + completeText: "Uložiť a ukončiť", + // [Auto-translated] "Back" + pagePrevText: "Chrbát" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", + // [Auto-translated] "Presets" + presetsTab: "Predvoľby", + // [Auto-translated] "Creator Presets" + creatorPresets: "Predvoľby tvorcu", + // [Auto-translated] "Save & Exit" + save: "Uložiť a ukončiť", + // [Auto-translated] "File" + file: "Súbor", + // [Auto-translated] "Import" import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Export" + export: "Vývoz", + // [Auto-translated] "Edit" + edit: "Editovať", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Obnoviť predvolené jazyky", + // [Auto-translated] "Reset all changes" + resetAll: "Obnoviť všetky zmeny", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Obnoviť {0} na predvolené hodnoty" } }; const locale = getLocaleStrings("sk"); diff --git a/packages/survey-creator-core/src/presets/localization/slovenian.ts b/packages/survey-creator-core/src/presets/localization/slovenian.ts index c89b4d93dd..91ddb519b5 100644 --- a/packages/survey-creator-core/src/presets/localization/slovenian.ts +++ b/packages/survey-creator-core/src/presets/localization/slovenian.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const slStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Jezikih", + // [Auto-translated] "Languages" + navigationTitle: "Jezikih", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Izberite jezik uporabniškega vmesnika in cilja ustvarjalca ankete\njezikov za anketo, ki se konfigurira.", + // [Auto-translated] "Creator UI language" + creatorUI: "Jezik uporabniškega vmesnika ustvarjalca", + // [Auto-translated] "Survey languages" + surveyLanguages: "Anketni jeziki", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Vnesite za iskanje ...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Prevajanje imen jezikov ankete v angleščino" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Konfiguracija zavihkov", + // [Auto-translated] "Tabs" + navigationTitle: "Jezički", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Izberite zavihke, ki jih želite prikazati, spremenite njihov vrstni red, spremenite njihove naslove,\nin izberite zavihek, ki bo privzeto aktiven.", + // [Auto-translated] "Visible tabs" + items: "Vidni zavihki", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Skriti zavihki", + // [Auto-translated] "Default tab" + defaultTab: "Privzeti zavihek", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Povlecite element iz tega stolpca v levo - prikaže se na plošči Zavihki. Predmete lahko premikate tudi z gumboma plus (+) in minus (-).", + // [Auto-translated] "Name" + name: "Ime", + // [Auto-translated] "Title" + titleField: "Naslov", + // [Auto-translated] "Icon name" + iconName: "Ime ikone" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "Nastavitev orodja Toolbox", + // [Auto-translated] "Toolbox" + navigationTitle: "Orodjarni", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Izberite elemente orodja, ki jih želite prikazati, jih združite v kategorije, \npreimenujte jih in po potrebi spremenite njihov vrstni red.", + // [Auto-translated] "Toolbox" + toolbox: "Orodjarni", + // [Auto-translated] "Categories" + categories: "Kategorije", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Skriti elementi zbirke orodij", + // [Auto-translated] "Enable grouping" + enableGrouping: "Omogočanje združevanja v skupine", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Pokaži naslove kategorij", + // [Auto-translated] "Name" + categoryName: "Ime", + // [Auto-translated] "Title" + categoryTitle: "Naslov", + // [Auto-translated] "Tooltip" + tooltip: "Opis orodja", + // [Auto-translated] "Icon name" + iconName: "Ime ikone", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "Predmet JSON, ki se uporabi, ko uporabniki izberejo ta element zbirke orodij", + // [Auto-translated] "Subcategories" + subcategories: "Podkategorije", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Omogočite podelemente za to vprašanje ...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Premakni kot podelement v...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Dodaj v zbirko orodij", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Izbriši element po meri", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Povlecite element iz tega stolpca v levo - prikazan bo na plošči Toolbox. Predmete lahko premikate tudi z gumboma plus (+) in minus (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Nova kategorija", + // [Auto-translated] "New Item" + addCustomItem: "Nova postavka", + // [Auto-translated] "Add a new item" + addNewItem: "Dodajanje novega elementa", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Dodajanje novega podelementa", + // [Auto-translated] "There are no items" + noRowsText: "Ni elementov", + // [Auto-translated] "New item in" + newItem: "Nov izdelek v" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Prilagajanje mreže lastnosti", + // [Auto-translated] "Property Grid" + navigationTitle: "Mreža lastnosti", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Izberite element, da prilagodite njegove nastavitve, ki so na voljo v mreži lastnosti.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Izberite element, da prilagodite njegove nastavitve, ki so na voljo v mreži lastnosti", + // [Auto-translated] "Property Grid" + propertyGrid: "Mreža lastnosti", + // [Auto-translated] "Unsorted items" + unsortedItems: "Nerazvrščeni elementi", + // [Auto-translated] "Name" + categoryName: "Ime", + // [Auto-translated] "Title" + categoryTitle: "Naslov", + // [Auto-translated] "Icon name" + iconName: "Ime ikone", + // [Auto-translated] "Name" + name: "Ime", + // [Auto-translated] "Title" + titleField: "Naslov", + // [Auto-translated] "Helper Text" + descriptionField: "Pomožno besedilo", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Povlecite element iz tega stolpca v levo - prikaže se na plošči Zavihki. Predmete lahko premikate tudi z gumboma plus (+) in minus (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Dodaj kategorijo po meri" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Dodajanje novega elementa", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Dodajanje novega podelementa", + // [Auto-translated] "New item in" + newItem: "Nov izdelek v", + // [Auto-translated] "New Category" + addCustomCategory: "Nova kategorija", + // [Auto-translated] "New category in" + newCategory: "Nova kategorija v", + // [Auto-translated] "Move to category..." + moveToCategory: "Premakni se v kategorijo ...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Premakni se v novo kategorijo ...", + // [Auto-translated] "Categories" + categoriesLabel: "Kategorije", + // [Auto-translated] "Move To..." + moveTo: "Premakni se v...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Odstrani iz {0}", + // [Auto-translated] "More" + more: "Več", + // [Auto-translated] "Restore" + restoreToDefault: "Obnoviti", + // [Auto-translated] "Edit" + edit: "Urediti", + // [Auto-translated] "Expand" + expand: "Razširiti", + // [Auto-translated] "Collapse" + collapse: "Propad", + // [Auto-translated] "Remove" + remove: "Odstrani", + // [Auto-translated] "Add" + add: "Dodati", + // [Auto-translated] "Delete" + delete: "Izbrisati" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Prednastavitve ustvarjalca", + // [Auto-translated] "Preset JSON:" + presetJson: "Prednastavljeni JSON:", + // [Auto-translated] "Copy" + copy: "Kopirati", + // [Auto-translated] "Download" + download: "Prenesti", + // [Auto-translated] "Load" + load: "Tovor", + // [Auto-translated] "Save & Exit" + saveExit: "Shranjevanje in zahod", + // [Auto-translated] "Back" + back: "Hrbet", + // [Auto-translated] "Reset to default" + resetToDefault: "Ponastavi na privzete nastavitve", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Vse nastavitve so bile obnovljene na privzete", + // [Auto-translated] "resored to default" + resoredToDefault: "prevrnjeno na privzeto", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Element je bil obnovljen na privzete nastavitve", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Kategorija je bila obnovljena na privzeto", + // [Auto-translated] "Edit" + edit: "Urediti", + // [Auto-translated] "Save & Exit" + completeText: "Shranjevanje in zahod", + // [Auto-translated] "Back" + pagePrevText: "Hrbet" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "Prednastavitve", + // [Auto-translated] "Creator Presets" + creatorPresets: "Prednastavitve ustvarjalca", + // [Auto-translated] "Save & Exit" + save: "Shranjevanje in zahod", + // [Auto-translated] "File" + file: "Datoteka", + // [Auto-translated] "Import" + import: "Uvoz", + // [Auto-translated] "Export" + export: "Izvoz", + // [Auto-translated] "Edit" + edit: "Urediti", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Ponastavitev jezikov na privzete", + // [Auto-translated] "Reset all changes" + resetAll: "Ponastavitev vseh sprememb", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Ponastavitev {0} na privzete nastavitve" } }; const locale = getLocaleStrings("sl"); diff --git a/packages/survey-creator-core/src/presets/localization/spanish.ts b/packages/survey-creator-core/src/presets/localization/spanish.ts index 4597091aff..259d1482d5 100644 --- a/packages/survey-creator-core/src/presets/localization/spanish.ts +++ b/packages/survey-creator-core/src/presets/localization/spanish.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const esStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Idiomas", + // [Auto-translated] "Languages" + navigationTitle: "Idiomas", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Seleccione el idioma de la interfaz de usuario y el destino del creador de encuestas\nidiomas para la encuesta que se está configurando.", + // [Auto-translated] "Creator UI language" + creatorUI: "Lenguaje de la interfaz de usuario del creador", + // [Auto-translated] "Survey languages" + surveyLanguages: "Idiomas de la encuesta", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Escriba para buscar...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Traducir nombres de idiomas de encuestas al inglés" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Configurar pestañas", + // [Auto-translated] "Tabs" + navigationTitle: "Pestañas", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Seleccione las pestañas que desea mostrar, reordenarlas, cambiar sus títulos,\ny elija la pestaña que estará activa de forma predeterminada.", + // [Auto-translated] "Visible tabs" + items: "Pestañas visibles", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Pestañas ocultas", + // [Auto-translated] "Default tab" + defaultTab: "Pestaña predeterminada", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Arrastre un elemento de esta columna a la izquierda: aparecerá visible en el panel Pestañas. También puede mover elementos, usando los botones más (+) y menos (-).", + // [Auto-translated] "Name" + name: "Nombre", + // [Auto-translated] "Title" + titleField: "Título", + // [Auto-translated] "Icon name" + iconName: "Nombre del icono" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "Configurar la caja de herramientas", + // [Auto-translated] "Toolbox" + navigationTitle: "Caja de herramientas", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Seleccione los elementos de la caja de herramientas que desea mostrar, agrúpelos en categorías, \ncámbieles el nombre y cambie su orden si es necesario.", + // [Auto-translated] "Toolbox" + toolbox: "Caja de herramientas", + // [Auto-translated] "Categories" + categories: "Categorías", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Elementos ocultos de la caja de herramientas", + // [Auto-translated] "Enable grouping" + enableGrouping: "Habilitar agrupación", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Mostrar títulos de categorías", + // [Auto-translated] "Name" + categoryName: "Nombre", + // [Auto-translated] "Title" + categoryTitle: "Título", + // [Auto-translated] "Tooltip" + tooltip: "Información sobre herramientas", + // [Auto-translated] "Icon name" + iconName: "Nombre del icono", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "Objeto JSON que se aplicará cuando los usuarios seleccionen este elemento de la caja de herramientas", + // [Auto-translated] "Subcategories" + subcategories: "Subcategorías", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Habilite los subelementos para esta pregunta...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Mover como subelemento a...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Agregar a la caja de herramientas", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Eliminar elemento personalizado", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Arrastre un elemento de esta columna a la izquierda: aparecerá visible en el panel Caja de herramientas. También puede mover elementos, usando los botones más (+) y menos (-).", + // [Auto-translated] "New Category" + addCustomCategory: "Nueva categoría", + // [Auto-translated] "New Item" + addCustomItem: "Nuevo artículo", + // [Auto-translated] "Add a new item" + addNewItem: "Agregar un nuevo elemento", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Agregar un nuevo subelemento", + // [Auto-translated] "There are no items" + noRowsText: "No hay artículos", + // [Auto-translated] "New item in" + newItem: "Nuevo artículo en" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Personalizar la cuadrícula de propiedades", + // [Auto-translated] "Property Grid" + navigationTitle: "Cuadrícula de propiedades", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Seleccione un elemento para personalizar su configuración disponible en la cuadrícula de propiedades.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Seleccione un elemento para personalizar su configuración disponible en la cuadrícula de propiedades", + // [Auto-translated] "Property Grid" + propertyGrid: "Cuadrícula de propiedades", + // [Auto-translated] "Unsorted items" + unsortedItems: "Artículos sin clasificar", + // [Auto-translated] "Name" + categoryName: "Nombre", + // [Auto-translated] "Title" + categoryTitle: "Título", + // [Auto-translated] "Icon name" + iconName: "Nombre del icono", + // [Auto-translated] "Name" + name: "Nombre", + // [Auto-translated] "Title" + titleField: "Título", + // [Auto-translated] "Helper Text" + descriptionField: "Texto auxiliar", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Arrastre un elemento de esta columna a la izquierda: aparecerá visible en el panel Pestañas. También puede mover elementos, usando los botones más (+) y menos (-).", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Agregar categoría personalizada" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Agregar un nuevo elemento", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Agregar un nuevo subelemento", + // [Auto-translated] "New item in" + newItem: "Nuevo artículo en", + // [Auto-translated] "New Category" + addCustomCategory: "Nueva categoría", + // [Auto-translated] "New category in" + newCategory: "Nueva categoría en", + // [Auto-translated] "Move to category..." + moveToCategory: "Mover a la categoría...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Pasar a una nueva categoría...", + // [Auto-translated] "Categories" + categoriesLabel: "Categorías", + // [Auto-translated] "Move To..." + moveTo: "Muévete a...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Retirar de {0}", + // [Auto-translated] "More" + more: "Más", + // [Auto-translated] "Restore" + restoreToDefault: "Restaurar", + // [Auto-translated] "Edit" + edit: "Editar", + // [Auto-translated] "Expand" + expand: "Expandir", + // [Auto-translated] "Collapse" + collapse: "Colapso", + // [Auto-translated] "Remove" + remove: "Eliminar", + // [Auto-translated] "Add" + add: "Agregar", + // [Auto-translated] "Delete" + delete: "Borrar" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Ajustes preestablecidos de creador", + // [Auto-translated] "Preset JSON:" + presetJson: "JSON preestablecido:", + // [Auto-translated] "Copy" + copy: "Copiar", + // [Auto-translated] "Download" + download: "Descargar", + // [Auto-translated] "Load" + load: "Carga", + // [Auto-translated] "Save & Exit" + saveExit: "Guardar y salir", + // [Auto-translated] "Back" + back: "Atrás", + // [Auto-translated] "Reset to default" + resetToDefault: "Restablecer a los valores predeterminados", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Todas las configuraciones restauradas a los valores predeterminados", + // [Auto-translated] "resored to default" + resoredToDefault: "resoed a default", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Elemento restaurado a los valores predeterminados", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Categoría restaurada a los valores predeterminados", + // [Auto-translated] "Edit" + edit: "Editar", + // [Auto-translated] "Save & Exit" + completeText: "Guardar y salir", + // [Auto-translated] "Back" + pagePrevText: "Atrás" }, plugin: { + // [Auto-translated] "Presets" presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Creator Presets" + creatorPresets: "Ajustes preestablecidos de creador", + // [Auto-translated] "Save & Exit" + save: "Guardar y salir", + // [Auto-translated] "File" + file: "Archivo", + // [Auto-translated] "Import" + import: "Importación", + // [Auto-translated] "Export" + export: "Exportar", + // [Auto-translated] "Edit" + edit: "Editar", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Restablecer idiomas a los valores predeterminados", + // [Auto-translated] "Reset all changes" + resetAll: "Restablecer todos los cambios", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Restablecer {0} a los valores predeterminados" } }; const locale = getLocaleStrings("es"); diff --git a/packages/survey-creator-core/src/presets/localization/swedish.ts b/packages/survey-creator-core/src/presets/localization/swedish.ts index c4090091ce..b59197bba5 100644 --- a/packages/survey-creator-core/src/presets/localization/swedish.ts +++ b/packages/survey-creator-core/src/presets/localization/swedish.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const svStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Språk", + // [Auto-translated] "Languages" + navigationTitle: "Språk", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Välj språk för användargränssnittet för undersökningsskapare och mål\nspråk för undersökningen som konfigureras.", + // [Auto-translated] "Creator UI language" + creatorUI: "Språk för användargränssnittet för skapare", + // [Auto-translated] "Survey languages" + surveyLanguages: "Språk i undersökningen", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Skriv för att söka...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Översätt språknamn för undersökningar till engelska" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Konfigurera flikar", + // [Auto-translated] "Tabs" + navigationTitle: "Flikar", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Välj de flikar du vill visa, ändra ordning på dem, ändra deras titlar,\noch välj den flik som ska vara aktiv som standard.", + // [Auto-translated] "Visible tabs" + items: "Synliga flikar", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Dolda flikar", + // [Auto-translated] "Default tab" + defaultTab: "Fliken Standard", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Dra ett objekt från den här kolumnen till den vänstra - det kommer att visas synligt i flikpanelen. Du kan också flytta objekt med hjälp av plus- (+) och minus- (-)-knapparna.", + // [Auto-translated] "Name" + name: "Namn", + // [Auto-translated] "Title" + titleField: "Titel", + // [Auto-translated] "Icon name" + iconName: "Ikonens namn" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "Ställ in verktygslådan", + // [Auto-translated] "Toolbox" + navigationTitle: "Verktygslåda", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Välj de verktygslådeobjekt du vill visa, gruppera dem i kategorier, \nByt namn på dem och ändra deras ordning om det behövs.", + // [Auto-translated] "Toolbox" + toolbox: "Verktygslåda", + // [Auto-translated] "Categories" + categories: "Kategorier", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Dolda objekt i verktygslådan", + // [Auto-translated] "Enable grouping" + enableGrouping: "Aktivera gruppering", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Visa kategorititlar", + // [Auto-translated] "Name" + categoryName: "Namn", + // [Auto-translated] "Title" + categoryTitle: "Titel", + // [Auto-translated] "Tooltip" + tooltip: "Verktygstips", + // [Auto-translated] "Icon name" + iconName: "Ikonens namn", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "JSON-objekt som ska användas när användare väljer det här verktygslådeobjektet", + // [Auto-translated] "Subcategories" + subcategories: "Underkategorier", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Aktivera underobjekt för den här frågan...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Flytta som ett underobjekt till...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Lägg till i Toolbox", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Ta bort anpassat objekt", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Dra ett objekt från den här kolumnen till den vänstra - det kommer att visas synligt i verktygslådepanelen. Du kan också flytta objekt med hjälp av plus- (+) och minus- (-)-knapparna.", + // [Auto-translated] "New Category" + addCustomCategory: "Ny kategori", + // [Auto-translated] "New Item" + addCustomItem: "Nytt objekt", + // [Auto-translated] "Add a new item" + addNewItem: "Lägg till ett nytt objekt", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Lägga till ett nytt underobjekt", + // [Auto-translated] "There are no items" + noRowsText: "Det finns inga produkter", + // [Auto-translated] "New item in" + newItem: "Nytt objekt i" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Anpassa egenskapsrutnätet", + // [Auto-translated] "Property Grid" + navigationTitle: "Rutnät för fastigheter", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Välj ett element för att anpassa dess inställningar som är tillgängliga i egenskapsrutnätet.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Välj ett element för att anpassa dess inställningar som är tillgängliga i egenskapsrutnätet", + // [Auto-translated] "Property Grid" + propertyGrid: "Rutnät för fastigheter", + // [Auto-translated] "Unsorted items" + unsortedItems: "Osorterade objekt", + // [Auto-translated] "Name" + categoryName: "Namn", + // [Auto-translated] "Title" + categoryTitle: "Titel", + // [Auto-translated] "Icon name" + iconName: "Ikonens namn", + // [Auto-translated] "Name" + name: "Namn", + // [Auto-translated] "Title" + titleField: "Titel", + // [Auto-translated] "Helper Text" + descriptionField: "Text för hjälpare", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Dra ett objekt från den här kolumnen till den vänstra - det kommer att visas synligt i flikpanelen. Du kan också flytta objekt med hjälp av plus- (+) och minus- (-)-knapparna.", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Lägg till anpassad kategori" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Lägg till ett nytt objekt", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Lägga till ett nytt underobjekt", + // [Auto-translated] "New item in" + newItem: "Nytt objekt i", + // [Auto-translated] "New Category" + addCustomCategory: "Ny kategori", + // [Auto-translated] "New category in" + newCategory: "Ny kategori i", + // [Auto-translated] "Move to category..." + moveToCategory: "Flytta till kategori...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Flytta till ny kategori...", + // [Auto-translated] "Categories" + categoriesLabel: "Kategorier", + // [Auto-translated] "Move To..." + moveTo: "Flytta till...", + // [Auto-translated] "Remove from {0}" + removeFrom: "Ta bort från {0}", + // [Auto-translated] "More" + more: "Mer", + // [Auto-translated] "Restore" + restoreToDefault: "Återställa", + // [Auto-translated] "Edit" + edit: "Redigera", + // [Auto-translated] "Expand" + expand: "Expandera", + // [Auto-translated] "Collapse" + collapse: "Kollaps", + // [Auto-translated] "Remove" + remove: "Avlägsna", + // [Auto-translated] "Add" + add: "Addera", + // [Auto-translated] "Delete" + delete: "Ta bort" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "Förinställningar för skapare", + // [Auto-translated] "Preset JSON:" + presetJson: "Förinställd JSON:", + // [Auto-translated] "Copy" + copy: "Kopia", + // [Auto-translated] "Download" + download: "Ladda ned", + // [Auto-translated] "Load" + load: "Last", + // [Auto-translated] "Save & Exit" + saveExit: "Spara och avsluta", + // [Auto-translated] "Back" + back: "Tillbaka", + // [Auto-translated] "Reset to default" + resetToDefault: "Återställ till standard", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Alla inställningar återställda till standard", + // [Auto-translated] "resored to default" + resoredToDefault: "resored till standard", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Objektet återställt till standard", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Kategori återställd till standard", + // [Auto-translated] "Edit" + edit: "Redigera", + // [Auto-translated] "Save & Exit" + completeText: "Spara och avsluta", + // [Auto-translated] "Back" + pagePrevText: "Tillbaka" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", + // [Auto-translated] "Presets" + presetsTab: "Förinställningar", + // [Auto-translated] "Creator Presets" + creatorPresets: "Förinställningar för skapare", + // [Auto-translated] "Save & Exit" + save: "Spara och avsluta", + // [Auto-translated] "File" + file: "Fil", + // [Auto-translated] "Import" import: "Import", + // [Auto-translated] "Export" export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Edit" + edit: "Redigera", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Återställ språk till standard", + // [Auto-translated] "Reset all changes" + resetAll: "Återställ alla ändringar", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "Återställa {0} till standardinställningarna" } }; const locale = getLocaleStrings("sv"); diff --git a/packages/survey-creator-core/src/presets/localization/tajik.ts b/packages/survey-creator-core/src/presets/localization/tajik.ts index 94c1337e69..18257f9ca5 100644 --- a/packages/survey-creator-core/src/presets/localization/tajik.ts +++ b/packages/survey-creator-core/src/presets/localization/tajik.ts @@ -1,118 +1,5 @@ import { getLocaleStrings } from "survey-creator-core"; export const tgStrings = { - languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" - }, - tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" - }, - toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", - }, - propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" - }, - items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" - }, - editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" - }, - plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" - } }; const locale = getLocaleStrings("tg"); locale.presets = tgStrings; diff --git a/packages/survey-creator-core/src/presets/localization/thai.ts b/packages/survey-creator-core/src/presets/localization/thai.ts index 70a09ab494..8d6380043f 100644 --- a/packages/survey-creator-core/src/presets/localization/thai.ts +++ b/packages/survey-creator-core/src/presets/localization/thai.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const thStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "ภาษา", + // [Auto-translated] "Languages" + navigationTitle: "ภาษา", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "เลือกภาษาของ UI และเป้าหมายของผู้สร้างแบบสํารวจ\nภาษาสําหรับแบบสํารวจที่กําลังกําหนดค่า", + // [Auto-translated] "Creator UI language" + creatorUI: "ภาษา UI ของครีเอเตอร์", + // [Auto-translated] "Survey languages" + surveyLanguages: "ภาษาของแบบสํารวจ", + // [Auto-translated] "Type to search..." + searchPlaceholder: "พิมพ์เพื่อค้นหา...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "แปลชื่อภาษาของแบบสํารวจเป็นภาษาอังกฤษ" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "กําหนดค่าแท็บ", + // [Auto-translated] "Tabs" + navigationTitle: "แท็บ", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "เลือกแท็บที่คุณต้องการแสดง จัดลําดับใหม่ เปลี่ยนชื่อ\nแล้วเลือกแท็บที่จะเปิดใช้งานตามค่าเริ่มต้น", + // [Auto-translated] "Visible tabs" + items: "แท็บที่มองเห็นได้", + // [Auto-translated] "Hidden tabs" + unsortedItems: "แท็บที่ซ่อนอยู่", + // [Auto-translated] "Default tab" + defaultTab: "แท็บเริ่มต้น", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "ลากรายการจากคอลัมน์นี้ไปทางซ้าย - รายการนั้นจะปรากฏในแผงแท็บ คุณยังสามารถย้ายรายการได้โดยใช้ปุ่มบวก (+) และลบ (-)", + // [Auto-translated] "Name" + name: "ชื่อ", + // [Auto-translated] "Title" + titleField: "ชื่อเรื่อง", + // [Auto-translated] "Icon name" + iconName: "ชื่อไอคอน" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "ตั้งค่ากล่องเครื่องมือ", + // [Auto-translated] "Toolbox" + navigationTitle: "เครื่อง มือ", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "เลือกรายการกล่องเครื่องมือที่คุณต้องการแสดงจัดกลุ่มเป็นหมวดหมู่ \nเปลี่ยนชื่อและเปลี่ยนลําดับหากจําเป็น", + // [Auto-translated] "Toolbox" + toolbox: "เครื่อง มือ", + // [Auto-translated] "Categories" + categories: "ประเภท", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "รายการกล่องเครื่องมือที่ซ่อนอยู่", + // [Auto-translated] "Enable grouping" + enableGrouping: "เปิดใช้งานการจัดกลุ่ม", + // [Auto-translated] "Show category titles" + showCategoryTitles: "แสดงชื่อประเภท", + // [Auto-translated] "Name" + categoryName: "ชื่อ", + // [Auto-translated] "Title" + categoryTitle: "ชื่อเรื่อง", + // [Auto-translated] "Tooltip" + tooltip: "คําแนะนําเครื่องมือ", + // [Auto-translated] "Icon name" + iconName: "ชื่อไอคอน", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "ออบเจ็กต์ JSON ที่จะนําไปใช้เมื่อผู้ใช้เลือกรายการกล่องเครื่องมือนี้", + // [Auto-translated] "Subcategories" + subcategories: "หมวดหมู่ย่อย", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "เปิดใช้งานรายการย่อยสําหรับคําถามนี้...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "ย้ายเป็นรายการย่อยไปยัง...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "เพิ่มไปยังกล่องเครื่องมือ", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "ลบรายการที่กําหนดเอง", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "ลากรายการจากคอลัมน์นี้ไปทางซ้าย - รายการนั้นจะปรากฏในแผงกล่องเครื่องมือ คุณยังสามารถย้ายรายการได้โดยใช้ปุ่มบวก (+) และลบ (-)", + // [Auto-translated] "New Category" + addCustomCategory: "หมวดหมู่ใหม่", + // [Auto-translated] "New Item" + addCustomItem: "รายการใหม่", + // [Auto-translated] "Add a new item" + addNewItem: "เพิ่มรายการใหม่", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "เพิ่มรายการย่อยใหม่", + // [Auto-translated] "There are no items" + noRowsText: "ไม่มีรายการ", + // [Auto-translated] "New item in" + newItem: "รายการใหม่ใน" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "กําหนดตารางคุณสมบัติเอง", + // [Auto-translated] "Property Grid" + navigationTitle: "ตารางทรัพย์สิน", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "เลือกองค์ประกอบเพื่อปรับแต่งการตั้งค่าที่มีอยู่ในกริดคุณสมบัติ", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "เลือกองค์ประกอบเพื่อปรับแต่งการตั้งค่าที่มีอยู่ในกริดคุณสมบัติ", + // [Auto-translated] "Property Grid" + propertyGrid: "ตารางทรัพย์สิน", + // [Auto-translated] "Unsorted items" + unsortedItems: "รายการที่ไม่ได้เรียงลําดับ", + // [Auto-translated] "Name" + categoryName: "ชื่อ", + // [Auto-translated] "Title" + categoryTitle: "ชื่อเรื่อง", + // [Auto-translated] "Icon name" + iconName: "ชื่อไอคอน", + // [Auto-translated] "Name" + name: "ชื่อ", + // [Auto-translated] "Title" + titleField: "ชื่อเรื่อง", + // [Auto-translated] "Helper Text" + descriptionField: "ข้อความตัวช่วย", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "ลากรายการจากคอลัมน์นี้ไปทางซ้าย - รายการนั้นจะปรากฏในแผงแท็บ คุณยังสามารถย้ายรายการได้โดยใช้ปุ่มบวก (+) และลบ (-)", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "เพิ่มหมวดหมู่ที่กําหนดเอง" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "เพิ่มรายการใหม่", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "เพิ่มรายการย่อยใหม่", + // [Auto-translated] "New item in" + newItem: "รายการใหม่ใน", + // [Auto-translated] "New Category" + addCustomCategory: "หมวดหมู่ใหม่", + // [Auto-translated] "New category in" + newCategory: "หมวดหมู่ใหม่ใน", + // [Auto-translated] "Move to category..." + moveToCategory: "ย้ายไปที่หมวดหมู่...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "ย้ายไปยังหมวดหมู่ใหม่...", + // [Auto-translated] "Categories" + categoriesLabel: "ประเภท", + // [Auto-translated] "Move To..." + moveTo: "ย้ายไปที่...", + // [Auto-translated] "Remove from {0}" + removeFrom: "ลบออกจาก{0}", + // [Auto-translated] "More" + more: "อีก", + // [Auto-translated] "Restore" + restoreToDefault: "ซ่อมแซม", + // [Auto-translated] "Edit" + edit: "แก้ไข", + // [Auto-translated] "Expand" + expand: "ขยาย", + // [Auto-translated] "Collapse" + collapse: "ทรุด", + // [Auto-translated] "Remove" + remove: "ถอด", + // [Auto-translated] "Add" + add: "เพิ่ม", + // [Auto-translated] "Delete" + delete: "ลบ" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "ครีเอเตอร์ที่ตั้งไว้ล่วงหน้า", + // [Auto-translated] "Preset JSON:" + presetJson: "JSON ที่ตั้งไว้ล่วงหน้า:", + // [Auto-translated] "Copy" + copy: "ลอก", + // [Auto-translated] "Download" + download: "ดาวน์โหลด", + // [Auto-translated] "Load" + load: "ภาระ", + // [Auto-translated] "Save & Exit" + saveExit: "บันทึกและออก", + // [Auto-translated] "Back" + back: "ย้อนกลับ", + // [Auto-translated] "Reset to default" + resetToDefault: "รีเซ็ตเป็นค่าเริ่มต้น", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "การตั้งค่าทั้งหมดกลับคืนสู่ค่าเริ่มต้น", + // [Auto-translated] "resored to default" + resoredToDefault: "เปลี่ยนเป็นค่าเริ่มต้น", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "รายการคืนค่าเป็นค่าเริ่มต้น", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "ประเภทถูกคืนค่าเป็นค่าเริ่มต้น", + // [Auto-translated] "Edit" + edit: "แก้ไข", + // [Auto-translated] "Save & Exit" + completeText: "บันทึกและออก", + // [Auto-translated] "Back" + pagePrevText: "ย้อนกลับ" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "ที่ตั้งไว้ล่วงหน้า", + // [Auto-translated] "Creator Presets" + creatorPresets: "ครีเอเตอร์ที่ตั้งไว้ล่วงหน้า", + // [Auto-translated] "Save & Exit" + save: "บันทึกและออก", + // [Auto-translated] "File" + file: "แฟ้ม", + // [Auto-translated] "Import" + import: "นําเข้า", + // [Auto-translated] "Export" + export: "ส่งออก", + // [Auto-translated] "Edit" + edit: "แก้ไข", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "รีเซ็ตภาษาเป็นค่าเริ่มต้น", + // [Auto-translated] "Reset all changes" + resetAll: "รีเซ็ตการเปลี่ยนแปลงทั้งหมด", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "รีเซ็ต{0}เป็นค่าเริ่มต้น" } }; const locale = getLocaleStrings("th"); diff --git a/packages/survey-creator-core/src/presets/localization/traditional-chinese.ts b/packages/survey-creator-core/src/presets/localization/traditional-chinese.ts index 8a3dfbf47e..cd3dd42720 100644 --- a/packages/survey-creator-core/src/presets/localization/traditional-chinese.ts +++ b/packages/survey-creator-core/src/presets/localization/traditional-chinese.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const zhTwStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "語言", + // [Auto-translated] "Languages" + navigationTitle: "語言", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "選取調查問卷建立者 UI 和目標的語言\n正在配置的調查問卷的語言。", + // [Auto-translated] "Creator UI language" + creatorUI: "創作者 UI 語言", + // [Auto-translated] "Survey languages" + surveyLanguages: "調查語言", + // [Auto-translated] "Type to search..." + searchPlaceholder: "輸入以搜尋...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "將調查問卷語言名稱翻譯成英文" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "設定索引標籤", + // [Auto-translated] "Tabs" + navigationTitle: "標籤", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "選擇要顯示的選項卡,重新排序它們,更改它們的標題,\n,然後選擇預設會處於作用中的索引標籤。", + // [Auto-translated] "Visible tabs" + items: "可見標籤", + // [Auto-translated] "Hidden tabs" + unsortedItems: "隱藏標籤", + // [Auto-translated] "Default tab" + defaultTab: "預設索引標籤", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "將項目從此欄拖曳到左側 - 它將顯示在「標籤」面板中。您還可以使用加號 (+) 和減號 (-) 按鈕移動項目。", + // [Auto-translated] "Name" + name: "名字", + // [Auto-translated] "Title" + titleField: "名", + // [Auto-translated] "Icon name" + iconName: "圖示名稱" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "設定工具箱", + // [Auto-translated] "Toolbox" + navigationTitle: "工具箱", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "選擇要顯示的工具箱項目,將它們分組為類別,\n重新命名它們,並視需要變更其順序。", + // [Auto-translated] "Toolbox" + toolbox: "工具箱", + // [Auto-translated] "Categories" + categories: "類別", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "隱藏的工具箱項目", + // [Auto-translated] "Enable grouping" + enableGrouping: "啟用分組", + // [Auto-translated] "Show category titles" + showCategoryTitles: "顯示類別標題", + // [Auto-translated] "Name" + categoryName: "名字", + // [Auto-translated] "Title" + categoryTitle: "名", + // [Auto-translated] "Tooltip" + tooltip: "工具提示", + // [Auto-translated] "Icon name" + iconName: "圖示名稱", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "當使用者選取此工具箱項目時要套用的 JSON 物件", + // [Auto-translated] "Subcategories" + subcategories: "子類別", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "啟用此問題的子項目...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "作為子項目移動到...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "新增至工具箱", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "刪除自訂項目", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "將項目從此欄拖到左側 - 它將顯示在“工具箱”面板中。您還可以使用加號 (+) 和減號 (-) 按鈕移動項目。", + // [Auto-translated] "New Category" + addCustomCategory: "新類別", + // [Auto-translated] "New Item" + addCustomItem: "新項目", + // [Auto-translated] "Add a new item" + addNewItem: "新增項目", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "新增子項目", + // [Auto-translated] "There are no items" + noRowsText: "沒有項目", + // [Auto-translated] "New item in" + newItem: "新項目" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "自訂屬性格線", + // [Auto-translated] "Property Grid" + navigationTitle: "屬性格線", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "選取元素以自訂其在「性質格線」中可用的設定。", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "選取元素以自訂其在「性質格線」中可用的設定", + // [Auto-translated] "Property Grid" + propertyGrid: "屬性格線", + // [Auto-translated] "Unsorted items" + unsortedItems: "未排序的項目", + // [Auto-translated] "Name" + categoryName: "名字", + // [Auto-translated] "Title" + categoryTitle: "名", + // [Auto-translated] "Icon name" + iconName: "圖示名稱", + // [Auto-translated] "Name" + name: "名字", + // [Auto-translated] "Title" + titleField: "名", + // [Auto-translated] "Helper Text" + descriptionField: "輔助文字", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "將項目從此欄拖曳到左側 - 它將顯示在「標籤」面板中。您還可以使用加號 (+) 和減號 (-) 按鈕移動項目。", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "新增自訂類別" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "新增項目", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "新增子項目", + // [Auto-translated] "New item in" + newItem: "新項目", + // [Auto-translated] "New Category" + addCustomCategory: "新類別", + // [Auto-translated] "New category in" + newCategory: "中的新類別", + // [Auto-translated] "Move to category..." + moveToCategory: "移至分類...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "移至新類別...", + // [Auto-translated] "Categories" + categoriesLabel: "類別", + // [Auto-translated] "Move To..." + moveTo: "移至...", + // [Auto-translated] "Remove from {0}" + removeFrom: "從{0}中刪除", + // [Auto-translated] "More" + more: "更", + // [Auto-translated] "Restore" + restoreToDefault: "匡", + // [Auto-translated] "Edit" + edit: "編輯", + // [Auto-translated] "Expand" + expand: "脹", + // [Auto-translated] "Collapse" + collapse: "塌", + // [Auto-translated] "Remove" + remove: "除", + // [Auto-translated] "Add" + add: "加", + // [Auto-translated] "Delete" + delete: "刪除" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "創作者預設集", + // [Auto-translated] "Preset JSON:" + presetJson: "預設 JSON:", + // [Auto-translated] "Copy" + copy: "抄", + // [Auto-translated] "Download" + download: "下載", + // [Auto-translated] "Load" + load: "裝", + // [Auto-translated] "Save & Exit" + saveExit: "儲存並退出", + // [Auto-translated] "Back" + back: "後面", + // [Auto-translated] "Reset to default" + resetToDefault: "重設為預設值", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "所有設定都還原為預設值", + // [Auto-translated] "resored to default" + resoredToDefault: "重置為預設值", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "項目還原為預設值", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "類別還原為預設值", + // [Auto-translated] "Edit" + edit: "編輯", + // [Auto-translated] "Save & Exit" + completeText: "儲存並退出", + // [Auto-translated] "Back" + pagePrevText: "後面" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "預設集", + // [Auto-translated] "Creator Presets" + creatorPresets: "創作者預設集", + // [Auto-translated] "Save & Exit" + save: "儲存並退出", + // [Auto-translated] "File" + file: "檔案", + // [Auto-translated] "Import" + import: "進口", + // [Auto-translated] "Export" + export: "出口", + // [Auto-translated] "Edit" + edit: "編輯", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "將語言重設為預設值", + // [Auto-translated] "Reset all changes" + resetAll: "重設所有變更", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "將{0}重設為預設值" } }; const locale = getLocaleStrings("zh-tw"); diff --git a/packages/survey-creator-core/src/presets/localization/turkish.ts b/packages/survey-creator-core/src/presets/localization/turkish.ts index a9a18cac08..eeca8a9455 100644 --- a/packages/survey-creator-core/src/presets/localization/turkish.ts +++ b/packages/survey-creator-core/src/presets/localization/turkish.ts @@ -1,117 +1,216 @@ import { getLocaleStrings } from "survey-creator-core"; export const trStrings = { languages: { - title: "Languages", - navigationTitle: "Languages", - description: "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured.", - creatorUI: "Creator UI language", - surveyLanguages: "Survey languages", - searchPlaceholder: "Type to search...", - translateToEnglish: "Translate Survey language names to English" + // [Auto-translated] "Languages" + title: "Diller", + // [Auto-translated] "Languages" + navigationTitle: "Diller", + // [Auto-translated] "Select the language of the Survey Creator UI and target\nlanguages for the survey being configured." + description: "Anket Oluşturucu Kullanıcı Arabiriminin dilini seçin ve hedefleyin\nyapılandırılmakta olan anket için diller.", + // [Auto-translated] "Creator UI language" + creatorUI: "Oluşturucu kullanıcı arayüzü dili", + // [Auto-translated] "Survey languages" + surveyLanguages: "Anket dilleri", + // [Auto-translated] "Type to search..." + searchPlaceholder: "Aramak için yazın...", + // [Auto-translated] "Translate Survey language names to English" + translateToEnglish: "Anket dili adlarını İngilizce'ye çevirme" }, tabs: { - title: "Configure tabs", - navigationTitle: "Tabs", - description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", - items: "Visible tabs", - unsortedItems: "Hidden tabs", - defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - name: "Name", - titleField: "Title", - iconName: "Icon name" + // [Auto-translated] "Configure tabs" + title: "Sekmeleri yapılandırma", + // [Auto-translated] "Tabs" + navigationTitle: "Sekmeler", + // [Auto-translated] "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default." + description: "Göstermek istediğiniz sekmeleri seçin, yeniden sıralayın, başlıklarını değiştirin,\nve varsayılan olarak etkin olacak sekmeyi seçin.", + // [Auto-translated] "Visible tabs" + items: "Görünür sekmeler", + // [Auto-translated] "Hidden tabs" + unsortedItems: "Gizli sekmeler", + // [Auto-translated] "Default tab" + defaultTab: "Varsayılan sekme", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Bir öğeyi bu sütundan sola sürükleyin - Sekmeler panelinde görünür görünecektir. Artı (+) ve eksi (-) düğmelerini kullanarak öğeleri de taşıyabilirsiniz.", + // [Auto-translated] "Name" + name: "Ad", + // [Auto-translated] "Title" + titleField: "Başlık", + // [Auto-translated] "Icon name" + iconName: "Simge adı" }, toolbox: { - title: "Set up the Toolbox", - navigationTitle: "Toolbox", - description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", - toolbox: "Toolbox", - categories: "Categories", - unsortedItems: "Hidden toolbox items", - enableGrouping: "Enable grouping", - showCategoryTitles: "Show category titles", - categoryName: "Name", - categoryTitle: "Title", - tooltip: "Tooltip", - iconName: "Icon name", - jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", - moveAsSubitem: "Move as a subitem to...", - addToToolbox: "Add to Toolbox", - deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "New Category", - addCustomItem: "New Item", - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - noRowsText: "There are no items", - newItem: "New item in", + // [Auto-translated] "Set up the Toolbox" + title: "Araç Kutusu'nu ayarlama", + // [Auto-translated] "Toolbox" + navigationTitle: "Araç", + // [Auto-translated] "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required." + description: "Göstermek istediğiniz araç kutusu öğelerini seçin, kategoriler halinde gruplandırın, \nBunları yeniden adlandırın ve gerekirse sıralarını değiştirin.", + // [Auto-translated] "Toolbox" + toolbox: "Araç", + // [Auto-translated] "Categories" + categories: "Kategori", + // [Auto-translated] "Hidden toolbox items" + unsortedItems: "Gizli araç kutusu öğeleri", + // [Auto-translated] "Enable grouping" + enableGrouping: "Gruplandırmayı etkinleştir", + // [Auto-translated] "Show category titles" + showCategoryTitles: "Kategori başlıklarını göster", + // [Auto-translated] "Name" + categoryName: "Ad", + // [Auto-translated] "Title" + categoryTitle: "Başlık", + // [Auto-translated] "Tooltip" + tooltip: "Araç ipucu", + // [Auto-translated] "Icon name" + iconName: "Simge adı", + // [Auto-translated] "JSON object to apply when users select this toolbox item" + jsonObject: "Kullanıcılar bu araç kutusu öğesini seçtiğinde uygulanacak JSON nesnesi", + // [Auto-translated] "Subcategories" + subcategories: "Alt kategori", + // [Auto-translated] "Enable subitems for this question..." + convertToSubcategory: "Bu soru için alt öğeleri etkinleştirin...", + // [Auto-translated] "Move as a subitem to..." + moveAsSubitem: "Bir alt öğe olarak şuraya taşı...", + // [Auto-translated] "Add to Toolbox" + addToToolbox: "Araç Kutusu'na ekle", + // [Auto-translated] "Delete Custom Item" + deleteCustomItem: "Özel Öğeyi Sil", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Bir öğeyi bu sütundan sola sürükleyin - Araç Kutusu panelinde görünür görünecektir. Artı (+) ve eksi (-) düğmelerini kullanarak öğeleri de taşıyabilirsiniz.", + // [Auto-translated] "New Category" + addCustomCategory: "Yeni Kategori", + // [Auto-translated] "New Item" + addCustomItem: "Yeni Eşya", + // [Auto-translated] "Add a new item" + addNewItem: "Yeni bir öğe ekle", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Yeni bir alt öğe ekle", + // [Auto-translated] "There are no items" + noRowsText: "Öğe yok", + // [Auto-translated] "New item in" + newItem: "Yeni ürün" }, propertyGrid: { - title: "Customize the Property Grid", - navigationTitle: "Property Grid", - description: "Select an element to customize its settings available in the Property Grid.", - selectElement: "Select an element to customize its settings available in the Property Grid", - propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", - categoryName: "Name", - categoryTitle: "Title", - iconName: "Icon name", - name: "Name", - titleField: "Title", - descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", - addCustomCategory: "Add Custom Category" + // [Auto-translated] "Customize the Property Grid" + title: "Özellik Izgarasını Özelleştirme", + // [Auto-translated] "Property Grid" + navigationTitle: "Özellik Izgarası", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid." + description: "Özellik Kılavuzu'nda bulunan ayarlarını özelleştirmek için bir öğe seçin.", + // [Auto-translated] "Select an element to customize its settings available in the Property Grid" + selectElement: "Özellik Izgarası'nda bulunan ayarlarını özelleştirmek için bir öğe seçin", + // [Auto-translated] "Property Grid" + propertyGrid: "Özellik Izgarası", + // [Auto-translated] "Unsorted items" + unsortedItems: "Sıralanmamış öğeler", + // [Auto-translated] "Name" + categoryName: "Ad", + // [Auto-translated] "Title" + categoryTitle: "Başlık", + // [Auto-translated] "Icon name" + iconName: "Simge adı", + // [Auto-translated] "Name" + name: "Ad", + // [Auto-translated] "Title" + titleField: "Başlık", + // [Auto-translated] "Helper Text" + descriptionField: "Yardımcı Metin", + // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." + unsortedDescription: "Bir öğeyi bu sütundan sola sürükleyin - Sekmeler panelinde görünür görünecektir. Artı (+) ve eksi (-) düğmelerini kullanarak öğeleri de taşıyabilirsiniz.", + // [Auto-translated] "Add Custom Category" + addCustomCategory: "Özel Kategori Ekle" }, items: { - addNewItem: "Add a new item", - addNewSubitem: "Add a new subitem", - newItem: "New item in", - addCustomCategory: "New Category", - newCategory: "New category in", - moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", - categoriesLabel: "Categories", - moveTo: "Move To...", - removeFrom: "Remove from {0}", - more: "More", - restoreToDefault: "Restore", - edit: "Edit", - expand: "Expand", - collapse: "Collapse", - remove: "Remove", - add: "Add", - delete: "Delete" + // [Auto-translated] "Add a new item" + addNewItem: "Yeni bir öğe ekle", + // [Auto-translated] "Add a new subitem" + addNewSubitem: "Yeni bir alt öğe ekle", + // [Auto-translated] "New item in" + newItem: "Yeni ürün", + // [Auto-translated] "New Category" + addCustomCategory: "Yeni Kategori", + // [Auto-translated] "New category in" + newCategory: "Yeni kategori", + // [Auto-translated] "Move to category..." + moveToCategory: "Kategoriye taşı...", + // [Auto-translated] "Move to new category..." + moveToNewCategory: "Yeni kategoriye taşı...", + // [Auto-translated] "Categories" + categoriesLabel: "Kategori", + // [Auto-translated] "Move To..." + moveTo: "Şuraya Taşı...", + // [Auto-translated] "Remove from {0}" + removeFrom: "{0}'den kaldır", + // [Auto-translated] "More" + more: "Daha", + // [Auto-translated] "Restore" + restoreToDefault: "Geri yüklemek", + // [Auto-translated] "Edit" + edit: "Düzenlemek", + // [Auto-translated] "Expand" + expand: "Genişletmek", + // [Auto-translated] "Collapse" + collapse: "Çökmek", + // [Auto-translated] "Remove" + remove: "Kaldırmak", + // [Auto-translated] "Add" + add: "Eklemek", + // [Auto-translated] "Delete" + delete: "Silmek" }, editor: { - title: "Creator Presets", - presetJson: "Preset JSON:", - copy: "Copy", - download: "Download", - load: "Load", - saveExit: "Save & Exit", - back: "Back", - resetToDefault: "Reset to default", - resetToDefaults: "All settings restored to default", - resoredToDefault: "resored to default", - itemRestoredToDefault: "Item restored to default", - categoryRestoredToDefault: "Category restored to default", - edit: "Edit", - completeText: "Save & Exit", - pagePrevText: "Back" + // [Auto-translated] "Creator Presets" + title: "İçerik Oluşturucu Ön Ayarları", + // [Auto-translated] "Preset JSON:" + presetJson: "Önceden ayarlanmış JSON:", + // [Auto-translated] "Copy" + copy: "Kopya etmek", + // [Auto-translated] "Download" + download: "İndirmek", + // [Auto-translated] "Load" + load: "Yük", + // [Auto-translated] "Save & Exit" + saveExit: "Kaydet & Çık", + // [Auto-translated] "Back" + back: "Geri", + // [Auto-translated] "Reset to default" + resetToDefault: "Varsayılana sıfırla", + // [Auto-translated] "All settings restored to default" + resetToDefaults: "Tüm ayarlar varsayılana geri yüklendi", + // [Auto-translated] "resored to default" + resoredToDefault: "varsayılana geri döndü", + // [Auto-translated] "Item restored to default" + itemRestoredToDefault: "Öğe varsayılana geri yüklendi", + // [Auto-translated] "Category restored to default" + categoryRestoredToDefault: "Kategori varsayılana geri yüklendi", + // [Auto-translated] "Edit" + edit: "Düzenlemek", + // [Auto-translated] "Save & Exit" + completeText: "Kaydet & Çık", + // [Auto-translated] "Back" + pagePrevText: "Geri" }, plugin: { - presetsTab: "Presets", - creatorPresets: "Creator Presets", - save: "Save & Exit", - file: "File", - import: "Import", - export: "Export", - edit: "Edit", - resetLanguages: "Reset Languages to default", - resetAll: "Reset all changes", - resetToDefaults: "Reset {0} to defaults" + // [Auto-translated] "Presets" + presetsTab: "Önayarları", + // [Auto-translated] "Creator Presets" + creatorPresets: "İçerik Oluşturucu Ön Ayarları", + // [Auto-translated] "Save & Exit" + save: "Kaydet & Çık", + // [Auto-translated] "File" + file: "Dosya", + // [Auto-translated] "Import" + import: "Ithalat", + // [Auto-translated] "Export" + export: "Ihracat", + // [Auto-translated] "Edit" + edit: "Düzenlemek", + // [Auto-translated] "Reset Languages to default" + resetLanguages: "Dilleri varsayılana sıfırla", + // [Auto-translated] "Reset all changes" + resetAll: "Tüm değişiklikleri sıfırla", + // [Auto-translated] "Reset {0} to defaults" + resetToDefaults: "{0} varsayılanlara sıfırla" } }; const locale = getLocaleStrings("tr"); From b71f0176034821441b2945ddd01c936b8fde795e Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 16 Oct 2025 17:58:48 +0300 Subject: [PATCH 199/240] #7004 - fixed localization --- .../src/presets/localization/arabic.ts | 28 +++++++++++++------ .../src/presets/localization/bulgarian.ts | 28 +++++++++++++------ .../src/presets/localization/burmese.ts | 12 ++------ .../src/presets/localization/croatian.ts | 28 +++++++++++++------ .../src/presets/localization/czech.ts | 28 +++++++++++++------ .../src/presets/localization/danish.ts | 28 +++++++++++++------ .../src/presets/localization/dutch.ts | 28 +++++++++++++------ .../src/presets/localization/english.ts | 17 +++++++---- .../src/presets/localization/finnish.ts | 28 +++++++++++++------ .../src/presets/localization/french.ts | 28 +++++++++++++------ .../src/presets/localization/german.ts | 28 +++++++++++++------ .../src/presets/localization/greek.ts | 28 +++++++++++++------ .../presets/localization/haitian-creole.ts | 28 +++++++++++++------ .../src/presets/localization/hebrew.ts | 28 +++++++++++++------ .../src/presets/localization/hungarian.ts | 28 +++++++++++++------ .../src/presets/localization/indonesian.ts | 28 +++++++++++++------ .../src/presets/localization/italian.ts | 28 +++++++++++++------ .../src/presets/localization/japanese.ts | 28 +++++++++++++------ .../src/presets/localization/korean.ts | 28 +++++++++++++------ .../src/presets/localization/malay.ts | 28 +++++++++++++------ .../src/presets/localization/mongolian.ts | 28 +++++++++++++------ .../src/presets/localization/norwegian.ts | 28 +++++++++++++------ .../src/presets/localization/persian.ts | 28 +++++++++++++------ .../src/presets/localization/polish.ts | 28 +++++++++++++------ .../src/presets/localization/portuguese.ts | 28 +++++++++++++------ .../src/presets/localization/romanian.ts | 28 +++++++++++++------ .../src/presets/localization/russian.ts | 28 +++++++++++++------ .../localization/simplified-chinese.ts | 28 +++++++++++++------ .../src/presets/localization/slovak.ts | 28 +++++++++++++------ .../src/presets/localization/slovenian.ts | 28 +++++++++++++------ .../src/presets/localization/spanish.ts | 28 +++++++++++++------ .../src/presets/localization/swedish.ts | 28 +++++++++++++------ .../src/presets/localization/thai.ts | 28 +++++++++++++------ .../localization/traditional-chinese.ts | 28 +++++++++++++------ .../src/presets/localization/turkish.ts | 28 +++++++++++++------ .../presets/presets-editable-properties.ts | 6 ++-- .../src/presets/presets-editable-tabs.ts | 5 ++-- .../src/presets/presets-editable-toolbox.ts | 9 +++--- 38 files changed, 653 insertions(+), 320 deletions(-) diff --git a/packages/survey-creator-core/src/presets/localization/arabic.ts b/packages/survey-creator-core/src/presets/localization/arabic.ts index dd144e1f9f..7093b6342e 100644 --- a/packages/survey-creator-core/src/presets/localization/arabic.ts +++ b/packages/survey-creator-core/src/presets/localization/arabic.ts @@ -26,11 +26,13 @@ export const arStrings = { // [Auto-translated] "Visible tabs" items: "علامات التبويب المرئية", // [Auto-translated] "Hidden tabs" - unsortedItems: "علامات التبويب المخفية", + hiddenItems: "علامات التبويب المخفية", // [Auto-translated] "Default tab" defaultTab: "علامة التبويب الافتراضية", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "اسحب عنصرا من هذا العمود إلى العمود الأيسر - سيظهر مرئيا في لوحة علامات التبويب. يمكنك أيضا نقل العناصر باستخدام زري الجمع (+) والطرح (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "اسحب علامات التبويب هنا لإظهارها", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "اسحب علامات التبويب هنا لإخفائها", // [Auto-translated] "Name" name: "اسم", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const arStrings = { toolbox: "ادوات", // [Auto-translated] "Categories" categories: "فئات", + // [Auto-translated] "No categories" + noCategoriesText: "لا توجد فئات", + // [Auto-translated] "Drag items here to show them" + noItemsText: "اسحب العناصر هنا لإظهارها", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "اسحب العناصر هنا لإخفائها", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "عناصر صندوق الأدوات المخفية", + hiddenItems: "عناصر صندوق الأدوات المخفية", // [Auto-translated] "Enable grouping" enableGrouping: "تمكين التجميع", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const arStrings = { addToToolbox: "أضف إلى Toolbox", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "حذف عنصر مخصص", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "اسحب عنصرا من هذا العمود إلى العمود الأيسر - سيظهر مرئيا في لوحة Toolbox. يمكنك أيضا نقل العناصر باستخدام زري الجمع (+) والطرح (-).", // [Auto-translated] "New Category" addCustomCategory: "فئة جديدة", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const arStrings = { selectElement: "حدد عنصرا لتخصيص إعداداته المتوفرة في شبكة الخصائص", // [Auto-translated] "Property Grid" propertyGrid: "شبكة العقارات", + // [Auto-translated] "No categories" + noCategoriesText: "لا توجد فئات", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "اسحب الخصائص هنا لإظهارها", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "اسحب الخصائص هنا لإخفائها", // [Auto-translated] "Unsorted items" - unsortedItems: "العناصر غير المصنفة", + hiddenItems: "العناصر غير المصنفة", // [Auto-translated] "Name" categoryName: "اسم", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const arStrings = { titleField: "عنوان", // [Auto-translated] "Helper Text" descriptionField: "نص مساعد", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "اسحب عنصرا من هذا العمود إلى العمود الأيسر - سيظهر مرئيا في لوحة علامات التبويب. يمكنك أيضا نقل العناصر باستخدام زري الجمع (+) والطرح (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "إضافة فئة مخصصة" }, diff --git a/packages/survey-creator-core/src/presets/localization/bulgarian.ts b/packages/survey-creator-core/src/presets/localization/bulgarian.ts index c931f293d1..495ae76095 100644 --- a/packages/survey-creator-core/src/presets/localization/bulgarian.ts +++ b/packages/survey-creator-core/src/presets/localization/bulgarian.ts @@ -26,11 +26,13 @@ export const bgStrings = { // [Auto-translated] "Visible tabs" items: "Видими раздели", // [Auto-translated] "Hidden tabs" - unsortedItems: "Скрити раздели", + hiddenItems: "Скрити раздели", // [Auto-translated] "Default tab" defaultTab: "Раздел по подразбиране", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Плъзнете елемент от тази колона в лявата - той ще се появи видим в панела Раздели. Можете също така да премествате елементи с помощта на бутоните плюс (+) и минус (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Плъзнете разделите тук, за да ги покажете", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Плъзнете разделите тук, за да ги скриете", // [Auto-translated] "Name" name: "Име", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const bgStrings = { toolbox: "Инструменти", // [Auto-translated] "Categories" categories: "Категории", + // [Auto-translated] "No categories" + noCategoriesText: "Няма категории", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Плъзнете елементите тук, за да ги покажете", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Плъзнете елементите тук, за да ги скриете", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Скрити елементи от кутия с инструменти", + hiddenItems: "Скрити елементи от кутия с инструменти", // [Auto-translated] "Enable grouping" enableGrouping: "Активиране на групиране", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const bgStrings = { addToToolbox: "Добави в кутията с инструменти", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Изтриване на персонализиран елемент", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Плъзнете елемент от тази колона в лявата - той ще се появи видим �� панела Toolbox. Можете също така да премествате елементи с помощта на бутоните плюс (+) и минус (-).", // [Auto-translated] "New Category" addCustomCategory: "Нова категория", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const bgStrings = { selectElement: "Изберете елемент, за да персонализирате настройките му, налични в мрежата със свойства", // [Auto-translated] "Property Grid" propertyGrid: "Мрежа от имоти", + // [Auto-translated] "No categories" + noCategoriesText: "Няма категории", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Плъзнете свойствата тук, за да ги покажете", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Плъзнете свойствата тук, за да ги скриете", // [Auto-translated] "Unsorted items" - unsortedItems: "Несортирани елементи", + hiddenItems: "Несортирани елементи", // [Auto-translated] "Name" categoryName: "Име", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const bgStrings = { titleField: "Заглавие", // [Auto-translated] "Helper Text" descriptionField: "Помощен текст", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Плъзнете елемент от тази колона в лявата - той ще се появи видим в панела Раздели. Можете също така да премествате елементи с помощта на бутоните плюс (+) и минус (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Добавяне на персонализирана категория" }, diff --git a/packages/survey-creator-core/src/presets/localization/burmese.ts b/packages/survey-creator-core/src/presets/localization/burmese.ts index 0dd6378df9..4c5237fe61 100644 --- a/packages/survey-creator-core/src/presets/localization/burmese.ts +++ b/packages/survey-creator-core/src/presets/localization/burmese.ts @@ -26,11 +26,9 @@ export const mmStrings = { // [Auto-translated] "Visible tabs" items: "မြင်နိုင်သော စာမျက်နှာခွဲများ", // [Auto-translated] "Hidden tabs" - unsortedItems: "ဖုံးကွယ်ထားသော စာမျက်နှာများ", + hiddenItems: "ဖုံးကွယ်ထားသော စာမျက်နှာများ", // [Auto-translated] "Default tab" defaultTab: "စံထားချက် စာမျက်နှာခွဲ", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "ဒီကော်လံကနေ ဘယ်ဘက်ကို အရာတစ်ခုကို ဆွဲလိုက်ပါ၊ Tabs ဘောင်ကွက်ထဲမှာ မြင်ရလိမ့်မယ်။ သင်သည် အပေါင်း(+)နှင့် အနုတ် (-) ခလုတ်များကိုသုံး၍ ပစ္စည်းများကို ရွှေ့ပြောင်းနိုင်ပါသည်။", // [Auto-translated] "Name" name: "အမည်", // [Auto-translated] "Title" @@ -50,7 +48,7 @@ export const mmStrings = { // [Auto-translated] "Categories" categories: "အမျိုးအစား", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "ဝှက်ထားတဲ့ ကိရိယာအိတ် အချက်အလက်များ", + hiddenItems: "ဝှက်ထားတဲ့ ကိရိယာအိတ် အချက်အလက်များ", // [Auto-translated] "Enable grouping" enableGrouping: "အုပ်စုလိုက်ခွင့်ပြုပါ", // [Auto-translated] "Show category titles" @@ -75,8 +73,6 @@ export const mmStrings = { addToToolbox: "ကိရိယာအိတ်ထဲသို့ ပေါင်းထည့်ပါ", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "စိတ်ကြိုက် အချက်အလက်ကို ပယ်ဖျက်ပါ", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "ဒီကော်လံကနေ ဘယ်ဘက်ကို အရာတစ်ခုကို ဆွဲလိုက်ပါ၊ ကိရိယာအိတ် ဘောင်ကွက်ထဲမှာ မြင်နိုင်ပါလိမ့်မယ်။ သင်သည် အပေါင်း(+)နှင့် အနုတ် (-) ခလုတ်များကိုသုံး၍ ပစ္စည်းများကို ရွှေ့ပြောင်းနိုင်ပါသည်။", // [Auto-translated] "New Category" addCustomCategory: "အမျိုးအစား အသစ်", // [Auto-translated] "New Item" @@ -102,7 +98,7 @@ export const mmStrings = { // [Auto-translated] "Property Grid" propertyGrid: "ပိုင်ဆိုင်ရာဂရစ်ကွက်", // [Auto-translated] "Unsorted items" - unsortedItems: "မစီထားတဲ့ အရာဝတ္ထု", + hiddenItems: "မစီထားတဲ့ အရာဝတ္ထု", // [Auto-translated] "Name" categoryName: "အမည်", // [Auto-translated] "Title" @@ -115,8 +111,6 @@ export const mmStrings = { titleField: "ခေါင်းစဉ်", // [Auto-translated] "Helper Text" descriptionField: "ကူညီသူ စာသား", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "ဒီကော်လံကနေ ဘယ်ဘက်ကို အရာတစ်ခုကို ဆွဲလိုက်ပါ၊ Tabs ဘောင်ကွက်ထဲမှာ မြင်ရလိမ့်မယ်။ သင်သည် အပေါင်း(+)နှင့် အနုတ် (-) ခလုတ်များကိုသုံး၍ ပစ္စည်းများကို ရွှေ့ပြောင်းနိုင်ပါသည်။", // [Auto-translated] "Add Custom Category" addCustomCategory: "စိတ်ကြိုက် အမျိုးအစား ပေါင်းထည့်ပါ" }, diff --git a/packages/survey-creator-core/src/presets/localization/croatian.ts b/packages/survey-creator-core/src/presets/localization/croatian.ts index 61734caf49..04df9028ea 100644 --- a/packages/survey-creator-core/src/presets/localization/croatian.ts +++ b/packages/survey-creator-core/src/presets/localization/croatian.ts @@ -26,11 +26,13 @@ export const hrStrings = { // [Auto-translated] "Visible tabs" items: "Vidljive kartice", // [Auto-translated] "Hidden tabs" - unsortedItems: "Skrivene kartice", + hiddenItems: "Skrivene kartice", // [Auto-translated] "Default tab" defaultTab: "Zadana kartica", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Povucite stavku iz ovog stupca ulijevo - pojavit će se vidljiva na ploči Kartice. Također možete premještati stavke pomoću tipki plus (+) i minus (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Povucite kartice ovdje da biste ih prikazali", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Povucite kartice ovdje da biste ih sakrili", // [Auto-translated] "Name" name: "Ime", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const hrStrings = { toolbox: "Alatni okvir", // [Auto-translated] "Categories" categories: "Kategorije", + // [Auto-translated] "No categories" + noCategoriesText: "Nema kategorija", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Povucite stavke ovdje da biste ih prikazali", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Povucite stavke ovdje da biste ih sakrili", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Skrivene stavke kutije s alatima", + hiddenItems: "Skrivene stavke kutije s alatima", // [Auto-translated] "Enable grouping" enableGrouping: "Omogućivanje grupiranja", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const hrStrings = { addToToolbox: "Dodaj u okvir s alatima", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Izbriši prilagođenu stavku", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Povucite stavku iz ovog stupca ulijevo - pojavit će se vidljiva na ploči Toolbox. Također možete premještati stavke pomoću tipki plus (+) i minus (-).", // [Auto-translated] "New Category" addCustomCategory: "Nova kategorija", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const hrStrings = { selectElement: "Odaberite element da biste prilagodili njegove postavke dostupne u rešetki svojstava", // [Auto-translated] "Property Grid" propertyGrid: "Mreža nekretnina", + // [Auto-translated] "No categories" + noCategoriesText: "Nema kategorija", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Povucite svojstva ovdje da biste ih prikazali", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Povucite svojstva ovdje da biste ih sakrili", // [Auto-translated] "Unsorted items" - unsortedItems: "Nerazvrstane stavke", + hiddenItems: "Nerazvrstane stavke", // [Auto-translated] "Name" categoryName: "Ime", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const hrStrings = { titleField: "Naslov", // [Auto-translated] "Helper Text" descriptionField: "Pomoćni tekst", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Povucite stavku iz ovog stupca ulijevo - pojavit će se vidljiva na ploči Kartice. Također možete premještati stavke pomoću tipki plus (+) i minus (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Dodaj prilagođenu kategoriju" }, diff --git a/packages/survey-creator-core/src/presets/localization/czech.ts b/packages/survey-creator-core/src/presets/localization/czech.ts index 548f3d5541..2b148530d8 100644 --- a/packages/survey-creator-core/src/presets/localization/czech.ts +++ b/packages/survey-creator-core/src/presets/localization/czech.ts @@ -26,11 +26,13 @@ export const csStrings = { // [Auto-translated] "Visible tabs" items: "Viditelné karty", // [Auto-translated] "Hidden tabs" - unsortedItems: "Skryté karty", + hiddenItems: "Skryté karty", // [Auto-translated] "Default tab" defaultTab: "Výchozí karta", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Přetáhněte položku z tohoto sloupce do levého sloupce - zobrazí se viditelná v panelu Karty. Položky můžete také přesouvat pomocí tlačítek plus (+) a mínus (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Přetažením karet sem je zobrazíte", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Přetažením karet sem je skryjete", // [Auto-translated] "Name" name: "Jméno", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const csStrings = { toolbox: "Souprava nářadí", // [Auto-translated] "Categories" categories: "Kategorie", + // [Auto-translated] "No categories" + noCategoriesText: "Žádné kategorie", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Přetažením položek sem je zobrazíte", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Přetažením položek sem je skryjete", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Skryté položky panelu nástrojů", + hiddenItems: "Skryté položky panelu nástrojů", // [Auto-translated] "Enable grouping" enableGrouping: "Povolit seskupení", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const csStrings = { addToToolbox: "Přidat do panelu nástrojů", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Odstranit vlastní položku", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Přetáhněte položku z tohoto sloupce do levého - zobrazí se viditelná v panelu Toolbox. Položky můžete také přesouvat pomocí tlačítek plus (+) a mínus (-).", // [Auto-translated] "New Category" addCustomCategory: "Nová kategorie", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const csStrings = { selectElement: "Vyberte prvek, jehož nastavení je k dispozici v mřížce vlastností", // [Auto-translated] "Property Grid" propertyGrid: "Mřížka vlastností", + // [Auto-translated] "No categories" + noCategoriesText: "Žádné kategorie", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Přetažením vlastností sem je zobrazíte", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Přetažením vlastností je sem skryjete", // [Auto-translated] "Unsorted items" - unsortedItems: "Neseřazené položky", + hiddenItems: "Neseřazené položky", // [Auto-translated] "Name" categoryName: "Jméno", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const csStrings = { titleField: "Titul", // [Auto-translated] "Helper Text" descriptionField: "Pomocný text", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Přetáhněte položku z tohoto sloupce do levého sloupce - zobrazí se viditelná v panelu Karty. Položky můžete také přesouvat pomocí tlačítek plus (+) a mínus (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Přidat vlastní kategorii" }, diff --git a/packages/survey-creator-core/src/presets/localization/danish.ts b/packages/survey-creator-core/src/presets/localization/danish.ts index adf41bbcb4..419fe32237 100644 --- a/packages/survey-creator-core/src/presets/localization/danish.ts +++ b/packages/survey-creator-core/src/presets/localization/danish.ts @@ -26,11 +26,13 @@ export const daStrings = { // [Auto-translated] "Visible tabs" items: "Synlige faner", // [Auto-translated] "Hidden tabs" - unsortedItems: "Skjulte faner", + hiddenItems: "Skjulte faner", // [Auto-translated] "Default tab" defaultTab: "Fanen Standard", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Træk et element fra denne kolonne til venstre - det vises synligt i panelet Faner. Du kan også flytte elementer ved hjælp af plus- (+) og minusknapperne (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Træk faner hertil for at vise dem", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Træk faner hertil for at skjule dem", // [Auto-translated] "Name" name: "Navn", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const daStrings = { toolbox: "Værktøjskasse", // [Auto-translated] "Categories" categories: "Kategorier", + // [Auto-translated] "No categories" + noCategoriesText: "Ingen kategorier", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Træk emner hertil for at vise dem", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Træk elementer hertil for at skjule dem", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Skjulte elementer i værktøjskassen", + hiddenItems: "Skjulte elementer i værktøjskassen", // [Auto-translated] "Enable grouping" enableGrouping: "Aktivere gruppering", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const daStrings = { addToToolbox: "Føj til værktøjskasse", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Slet brugerdefineret element", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Træk et element fra denne kolonne til venstre - det vises synligt i værktøjskassepanelet. Du kan også flytte elementer ved hjælp af plus- (+) og minusknapperne (-).", // [Auto-translated] "New Category" addCustomCategory: "Ny kategori", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const daStrings = { selectElement: "Vælg et element for at tilpasse de indstillinger, der er tilgængelige i egenskabsgitteret", // [Auto-translated] "Property Grid" propertyGrid: "Ejendom Grid", + // [Auto-translated] "No categories" + noCategoriesText: "Ingen kategorier", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Træk egenskaber hertil for at få dem vist", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Træk egenskaber hertil for at skjule dem", // [Auto-translated] "Unsorted items" - unsortedItems: "Usorterede elementer", + hiddenItems: "Usorterede elementer", // [Auto-translated] "Name" categoryName: "Navn", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const daStrings = { titleField: "Titel", // [Auto-translated] "Helper Text" descriptionField: "Hjælper tekst", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Træk et element fra denne kolonne til venstre - det vises synligt i panelet Faner. Du kan også flytte elementer ved hjælp af plus- (+) og minusknapperne (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Tilføj brugerdefineret kategori" }, diff --git a/packages/survey-creator-core/src/presets/localization/dutch.ts b/packages/survey-creator-core/src/presets/localization/dutch.ts index 1aa22728cf..0307339747 100644 --- a/packages/survey-creator-core/src/presets/localization/dutch.ts +++ b/packages/survey-creator-core/src/presets/localization/dutch.ts @@ -26,11 +26,13 @@ export const nlStrings = { // [Auto-translated] "Visible tabs" items: "Zichtbare tabbladen", // [Auto-translated] "Hidden tabs" - unsortedItems: "Verborgen tabbladen", + hiddenItems: "Verborgen tabbladen", // [Auto-translated] "Default tab" defaultTab: "Tabblad Standaard", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Sleep een item van deze kolom naar de linkerkolom - het wordt zichtbaar weergegeven in het deelvenster Tabbladen. U kunt ook items verplaatsen met behulp van de plus- (+) en minknop (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Sleep tabbladen hierheen om ze weer te geven", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Sleep tabbladen hierheen om ze te verbergen", // [Auto-translated] "Name" name: "Naam", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const nlStrings = { toolbox: "Gereedschapskist", // [Auto-translated] "Categories" categories: "Categorieën", + // [Auto-translated] "No categories" + noCategoriesText: "Geen categorieën", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Sleep items hierheen om ze weer te geven", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Sleep items hierheen om ze te verbergen", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Verborgen gereedschapskistitems", + hiddenItems: "Verborgen gereedschapskistitems", // [Auto-translated] "Enable grouping" enableGrouping: "Groeperen inschakelen", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const nlStrings = { addToToolbox: "Toevoegen aan Toolbox", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Aangepast item verwijderen", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Sleep een item van deze kolom naar de linkerkolom - het wordt zichtbaar weergegeven in het deelvenster Gereedschapsset. U kunt ook items verplaatsen met behulp van de plus- (+) en minknop (-).", // [Auto-translated] "New Category" addCustomCategory: "Nieuwe categorie", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const nlStrings = { selectElement: "Selecteer een element om de instellingen aan te passen die beschikbaar zijn in het eigenschappenraster", // [Auto-translated] "Property Grid" propertyGrid: "Eigendom raster", + // [Auto-translated] "No categories" + noCategoriesText: "Geen categorieën", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Sleep eigenschappen hierheen om ze weer te geven", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Sleep eigenschappen hierheen om ze te verbergen", // [Auto-translated] "Unsorted items" - unsortedItems: "Ongesorteerde artikelen", + hiddenItems: "Ongesorteerde artikelen", // [Auto-translated] "Name" categoryName: "Naam", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const nlStrings = { titleField: "Titel", // [Auto-translated] "Helper Text" descriptionField: "Helper Tekst", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Sleep een item van deze kolom naar de linkerkolom - het wordt zichtbaar weergegeven in het deelvenster Tabbladen. U kunt ook items verplaatsen met behulp van de plus- (+) en minknop (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Aangepaste categorie toevoegen" }, diff --git a/packages/survey-creator-core/src/presets/localization/english.ts b/packages/survey-creator-core/src/presets/localization/english.ts index 4d530cac27..bb66a95a7a 100644 --- a/packages/survey-creator-core/src/presets/localization/english.ts +++ b/packages/survey-creator-core/src/presets/localization/english.ts @@ -14,9 +14,10 @@ export const enStrings = { navigationTitle: "Tabs", description: "Select the tabs you want to show, reorder them, change their titles,\nand choose the tab that will be active by default.", items: "Visible tabs", - unsortedItems: "Hidden tabs", + hiddenItems: "Hidden tabs", defaultTab: "Default tab", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", + noItemsText: "Drag tabs here to show them", + noHiddenItemsText: "Drag tabs here to hide them", name: "Name", titleField: "Title", iconName: "Icon name" @@ -27,7 +28,10 @@ export const enStrings = { description: "Select the toolbox items you want to show, group them into categories, \nrename them, and change their order if required.", toolbox: "Toolbox", categories: "Categories", - unsortedItems: "Hidden toolbox items", + noCategoriesText: "No categories", + noItemsText: "Drag items here to show them", + noHiddenItemsText: "Drag items here to hide them", + hiddenItems: "Hidden toolbox items", enableGrouping: "Enable grouping", showCategoryTitles: "Show category titles", categoryName: "Name", @@ -40,7 +44,6 @@ export const enStrings = { moveAsSubitem: "Move as a subitem to...", addToToolbox: "Add to Toolbox", deleteCustomItem: "Delete Custom Item", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons.", addCustomCategory: "New Category", addCustomItem: "New Item", addNewItem: "Add a new item", @@ -54,14 +57,16 @@ export const enStrings = { description: "Select an element to customize its settings available in the Property Grid.", selectElement: "Select an element to customize its settings available in the Property Grid", propertyGrid: "Property Grid", - unsortedItems: "Unsorted items", + noCategoriesText: "No categories", + noItemsText: "Drag properties here to show them", + noHiddenItemsText: "Drag properties here to hide them", + hiddenItems: "Unsorted items", categoryName: "Name", categoryTitle: "Title", iconName: "Icon name", name: "Name", titleField: "Title", descriptionField: "Helper Text", - unsortedDescription: "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons.", addCustomCategory: "Add Custom Category" }, items: { diff --git a/packages/survey-creator-core/src/presets/localization/finnish.ts b/packages/survey-creator-core/src/presets/localization/finnish.ts index f2700ad9eb..8d579cbe7f 100644 --- a/packages/survey-creator-core/src/presets/localization/finnish.ts +++ b/packages/survey-creator-core/src/presets/localization/finnish.ts @@ -26,11 +26,13 @@ export const fiStrings = { // [Auto-translated] "Visible tabs" items: "Näkyvät välilehdet", // [Auto-translated] "Hidden tabs" - unsortedItems: "Piilotetut välilehdet", + hiddenItems: "Piilotetut välilehdet", // [Auto-translated] "Default tab" defaultTab: "Oletus-välilehti", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Vedä kohde tästä sarakkeesta vasemmalle - se näkyy Välilehdet-paneelissa. Voit myös siirtää kohteita plus- (+) ja miinuspainikkeilla (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Näytä välilehdet vetämällä ne tänne", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Piilota välilehdet vetämällä ne tänne", // [Auto-translated] "Name" name: "Nimi", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const fiStrings = { toolbox: "Työkalupakki", // [Auto-translated] "Categories" categories: "Luokat", + // [Auto-translated] "No categories" + noCategoriesText: "Ei luokkia", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Näytä kohteet vetämällä ne tänne", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Piilota kohteet vetämällä ne tänne", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Piilotetut työkalupakin kohteet", + hiddenItems: "Piilotetut työkalupakin kohteet", // [Auto-translated] "Enable grouping" enableGrouping: "Ota ryhmittely käyttöön", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const fiStrings = { addToToolbox: "Lisää työkalupakkiin", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Poista mukautettu kohde", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Vedä kohde tästä sarakkeesta vasemmalle - se näkyy Työkalupakki-paneelissa. Voit myös siirtää kohteita plus- (+) ja miinuspainikkeilla (-).", // [Auto-translated] "New Category" addCustomCategory: "Uusi luokka", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const fiStrings = { selectElement: "Valitse elementti, jos haluat mukauttaa sen asetuksia, jotka ovat käytettävissä ominaisuusruudukossa", // [Auto-translated] "Property Grid" propertyGrid: "Ominaisuuden ruudukko", + // [Auto-translated] "No categories" + noCategoriesText: "Ei luokkia", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Näytä ominaisuudet vetämällä ne tähän", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Piilota ominaisuudet vetämällä ne tähän", // [Auto-translated] "Unsorted items" - unsortedItems: "Lajittelemattomat kohteet", + hiddenItems: "Lajittelemattomat kohteet", // [Auto-translated] "Name" categoryName: "Nimi", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const fiStrings = { titleField: "Nimike", // [Auto-translated] "Helper Text" descriptionField: "Aputeksti", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Vedä kohde tästä sarakkeesta vasemmalle - se näkyy Välilehdet-paneelissa. Voit myös siirtää kohteita plus- (+) ja miinuspainikkeilla (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Lisää mukautettu luokka" }, diff --git a/packages/survey-creator-core/src/presets/localization/french.ts b/packages/survey-creator-core/src/presets/localization/french.ts index cd25929c36..161d484de1 100644 --- a/packages/survey-creator-core/src/presets/localization/french.ts +++ b/packages/survey-creator-core/src/presets/localization/french.ts @@ -26,11 +26,13 @@ export const frStrings = { // [Auto-translated] "Visible tabs" items: "Onglets visibles", // [Auto-translated] "Hidden tabs" - unsortedItems: "Onglets cachés", + hiddenItems: "Onglets cachés", // [Auto-translated] "Default tab" defaultTab: "Onglet par défaut", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Faites glisser un élément de cette colonne vers la gauche - il apparaîtra visible dans le panneau Onglets. Vous pouvez également déplacer des éléments à l’aide des boutons plus (+) et moins (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Faites glisser les onglets ici pour les afficher", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Faites glisser les onglets ici pour les masquer", // [Auto-translated] "Name" name: "Nom", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const frStrings = { toolbox: "Toolbox", // [Auto-translated] "Categories" categories: "Catégories", + // [Auto-translated] "No categories" + noCategoriesText: "Aucune catégorie", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Faites glisser les éléments ici pour les afficher", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Faites glisser des éléments ici pour les masquer", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Éléments de boîte à outils cachés", + hiddenItems: "Éléments de boîte à outils cachés", // [Auto-translated] "Enable grouping" enableGrouping: "Activer le regroupement", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const frStrings = { addToToolbox: "Ajouter à la boîte à outils", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Supprimer un élément personnalisé", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Faites glisser un élément de cette colonne vers la gauche - il apparaîtra visible dans le panneau Boîte à outils. Vous pouvez également déplacer des éléments à l’aide des boutons plus (+) et moins (-).", // [Auto-translated] "New Category" addCustomCategory: "Nouvelle catégorie", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const frStrings = { selectElement: "Sélectionnez un élément pour personnaliser ses paramètres disponibles dans la grille de propriétés", // [Auto-translated] "Property Grid" propertyGrid: "Grille des propriétés", + // [Auto-translated] "No categories" + noCategoriesText: "Aucune catégorie", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Faites glisser les propriétés ici pour les afficher", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Faites glisser les propriétés ici pour les masquer", // [Auto-translated] "Unsorted items" - unsortedItems: "Articles non triés", + hiddenItems: "Articles non triés", // [Auto-translated] "Name" categoryName: "Nom", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const frStrings = { titleField: "Titre", // [Auto-translated] "Helper Text" descriptionField: "Texte d’aide", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Faites glisser un élément de cette colonne vers la gauche - il apparaîtra visible dans le panneau Onglets. Vous pouvez également déplacer des éléments à l’aide des boutons plus (+) et moins (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Ajouter une catégorie personnalisée" }, diff --git a/packages/survey-creator-core/src/presets/localization/german.ts b/packages/survey-creator-core/src/presets/localization/german.ts index 8f591fd326..8d3b6d7ba4 100644 --- a/packages/survey-creator-core/src/presets/localization/german.ts +++ b/packages/survey-creator-core/src/presets/localization/german.ts @@ -26,11 +26,13 @@ export const deStrings = { // [Auto-translated] "Visible tabs" items: "Sichtbare Registerkarten", // [Auto-translated] "Hidden tabs" - unsortedItems: "Versteckte Registerkarten", + hiddenItems: "Versteckte Registerkarten", // [Auto-translated] "Default tab" defaultTab: "Registerkarte \"Standard\"", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Ziehen Sie ein Element aus dieser Spalte in die linke Spalte – es wird im Tabs-Bedienfeld angezeigt. Sie können Elemente auch verschieben, indem Sie die Plus- (+) und Minus-Tasten (-) verwenden.", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Ziehen Sie Registerkarten hierher, um sie anzuzeigen", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Ziehen Sie Registerkarten hierher, um sie auszublenden", // [Auto-translated] "Name" name: "Name", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const deStrings = { toolbox: "Werkzeugkasten", // [Auto-translated] "Categories" categories: "Kategorien", + // [Auto-translated] "No categories" + noCategoriesText: "Keine Kategorien", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Ziehen Sie Elemente hierher, um sie anzuzeigen", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Ziehen Sie Elemente hierher, um sie auszublenden", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Versteckte Elemente der Toolbox", + hiddenItems: "Versteckte Elemente der Toolbox", // [Auto-translated] "Enable grouping" enableGrouping: "Gruppierung aktivieren", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const deStrings = { addToToolbox: "Zur Toolbox hinzufügen", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Benutzerdefiniertes Element löschen", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Ziehen Sie ein Element aus dieser Spalte in die linke Spalte - es wird im Toolbox-Panel sichtbar angezeigt. Sie können Elemente auch verschieben, indem Sie die Plus- (+) und Minus-Tasten (-) verwenden.", // [Auto-translated] "New Category" addCustomCategory: "Neue Kategorie", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const deStrings = { selectElement: "Wählen Sie ein Element aus, um seine Einstellungen anzupassen, die im Eigenschaftenraster verfügbar sind", // [Auto-translated] "Property Grid" propertyGrid: "Eigenschafts-Raster", + // [Auto-translated] "No categories" + noCategoriesText: "Keine Kategorien", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Ziehen Sie Eigenschaften hierher, um sie anzuzeigen", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Ziehen Sie Eigenschaften hierher, um sie auszublenden", // [Auto-translated] "Unsorted items" - unsortedItems: "Unsortierte Artikel", + hiddenItems: "Unsortierte Artikel", // [Auto-translated] "Name" categoryName: "Name", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const deStrings = { titleField: "Titel", // [Auto-translated] "Helper Text" descriptionField: "Hilfstext", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Ziehen Sie ein Element aus dieser Spalte in die linke Spalte – es wird im Tabs-Bedienfeld angezeigt. Sie können Elemente auch verschieben, indem Sie die Plus- (+) und Minus-Tasten (-) verwenden.", // [Auto-translated] "Add Custom Category" addCustomCategory: "Benutzerdefinierte Kategorie hinzufügen" }, diff --git a/packages/survey-creator-core/src/presets/localization/greek.ts b/packages/survey-creator-core/src/presets/localization/greek.ts index ea1589e483..9b17a8a3d3 100644 --- a/packages/survey-creator-core/src/presets/localization/greek.ts +++ b/packages/survey-creator-core/src/presets/localization/greek.ts @@ -26,11 +26,13 @@ export const elStrings = { // [Auto-translated] "Visible tabs" items: "Ορατές καρτέλες", // [Auto-translated] "Hidden tabs" - unsortedItems: "Κρυφές καρτέλες", + hiddenItems: "Κρυφές καρτέλες", // [Auto-translated] "Default tab" defaultTab: "Προεπιλεγμένη καρτέλα", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Σύρετε ένα στοιχείο από αυτήν τη στήλη προς τα αριστερά - θα εμφανιστεί ορατό στον πίνακα καρτελών. Μπορείτε επίσης να μετακινήσετε στοιχεία, χρησιμοποιώντας τα κουμπιά συν (+) και πλην (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Σύρετε τις καρτέλες εδώ για να τις εμφανίσετε", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Σύρετε τις καρτέλες εδώ για να τις αποκρύψετε", // [Auto-translated] "Name" name: "Όνομα", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const elStrings = { toolbox: "Εργαλειοθήκη", // [Auto-translated] "Categories" categories: "Κατηγορίες", + // [Auto-translated] "No categories" + noCategoriesText: "Χωρίς κατηγορίες", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Σύρετε στοιχεία εδώ για να τα εμφανίσετε", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Σύρετε στοιχεία εδώ για να τα αποκρύψετε", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Κρυφά στοιχεία εργαλειοθήκης", + hiddenItems: "Κρυφά στοιχεία εργαλειοθήκης", // [Auto-translated] "Enable grouping" enableGrouping: "Ενεργοποίηση ομαδοποίησης", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const elStrings = { addToToolbox: "Προσθήκη στην εργαλειοθήκη", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Διαγραφή προσαρμοσμένου στοιχείου", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Σύρετε ένα στοιχείο από αυτήν τη στήλη προς τα αριστερά - θα ��μφανιστεί ορατό στον πίνακα Εργαλειοθήκη. Μπορείτε επίσης να μετακινήσετε στοιχεία, χρησιμοποιώντας τα κουμπιά συν (+) και πλην (-).", // [Auto-translated] "New Category" addCustomCategory: "Νέα Κατηγορία", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const elStrings = { selectElement: "Επιλέξτε ένα στοιχείο για να προσαρμόσετε τις ρυθμίσεις του που είναι διαθέσιμες στο Πλέγμα Ιδιότητας", // [Auto-translated] "Property Grid" propertyGrid: "Πλέγμα ιδιοκτησίας", + // [Auto-translated] "No categories" + noCategoriesText: "Χωρίς κατηγορίες", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Σύρετε τις ιδιότητες εδώ για να τις εμφανίσετε", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Σύρετε τις ιδιότητες εδώ για να τις αποκρύψετε", // [Auto-translated] "Unsorted items" - unsortedItems: "Αταξινόμητα αντικείμενα", + hiddenItems: "Αταξινόμητα αντικείμενα", // [Auto-translated] "Name" categoryName: "Όνομα", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const elStrings = { titleField: "Τίτλος", // [Auto-translated] "Helper Text" descriptionField: "Βοηθητικό κείμενο", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Σύρετε ένα στοιχείο από αυτήν τη στήλη προς τα αριστερά - θα εμφανιστεί ορατό στον πίνακα καρτελών. Μπορείτε επίσης να μετακινήσετε στοιχεία, χρησιμοποιώντας τα κουμπιά συν (+) και πλην (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Προσθήκη προσαρμοσμένης κατηγορίας" }, diff --git a/packages/survey-creator-core/src/presets/localization/haitian-creole.ts b/packages/survey-creator-core/src/presets/localization/haitian-creole.ts index 2acbef33f8..62112d98da 100644 --- a/packages/survey-creator-core/src/presets/localization/haitian-creole.ts +++ b/packages/survey-creator-core/src/presets/localization/haitian-creole.ts @@ -26,11 +26,13 @@ export const htStrings = { // [Auto-translated] "Visible tabs" items: "Onglè vizib", // [Auto-translated] "Hidden tabs" - unsortedItems: "Onglè kache", + hiddenItems: "Onglè kache", // [Auto-translated] "Default tab" defaultTab: "Default tab", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Trennen yon atik soti nan kolòn sa a nan yon sèl la gòch - li pral parèt vizib nan panèl la Onglè. Ou kapab tou deplase atik, lè l sèvi avèk plis (+) ak mwens (-) bouton.", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Trennen onglets isit la pou montre yo", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Trennen onglè isit la pou kache yo", // [Auto-translated] "Name" name: "Fe-apel", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const htStrings = { toolbox: "Bwat zouti", // [Auto-translated] "Categories" categories: "Kategori", + // [Auto-translated] "No categories" + noCategoriesText: "Pa gen kategori", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Trennen atik isit la pou montre yo", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Trennen atik isit la pou kache yo", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Atik bwat zouti kache", + hiddenItems: "Atik bwat zouti kache", // [Auto-translated] "Enable grouping" enableGrouping: "Pèmèt gwoupman", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const htStrings = { addToToolbox: "Ajoute nan bwat zouti", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Efase atik koutim", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Trennen yon atik ki soti nan kolòn sa a nan yon sèl la gòch - li pral parèt vizib nan panèl la Toolbox. Ou kapab tou deplase atik, lè l sèvi avèk plis (+) ak mwens (-) bouton.", // [Auto-translated] "New Category" addCustomCategory: "Nouvo Kategori", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const htStrings = { selectElement: "Chwazi yon eleman pou Customize anviwònman li yo ki disponib nan kadriyaj la Pwopriyete", // [Auto-translated] "Property Grid" propertyGrid: "Pwopriyete kadriyaj", + // [Auto-translated] "No categories" + noCategoriesText: "Pa gen kategori", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Trennen pwopriyete isit la pou montre yo", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Trennen pwopriyete isit la kache yo", // [Auto-translated] "Unsorted items" - unsortedItems: "Unsorted atik", + hiddenItems: "Unsorted atik", // [Auto-translated] "Name" categoryName: "Fe-apel", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const htStrings = { titleField: "Tit", // [Auto-translated] "Helper Text" descriptionField: "Tèks ede", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Trennen yon atik soti nan kolòn sa a nan yon sèl la gòch - li pral parèt vizib nan panèl la Onglè. Ou kapab tou deplase atik, lè l sèvi avèk plis (+) ak mwens (-) bouton.", // [Auto-translated] "Add Custom Category" addCustomCategory: "Add Custom Kategori" }, diff --git a/packages/survey-creator-core/src/presets/localization/hebrew.ts b/packages/survey-creator-core/src/presets/localization/hebrew.ts index 82b88e5bfc..810a8d9fe5 100644 --- a/packages/survey-creator-core/src/presets/localization/hebrew.ts +++ b/packages/survey-creator-core/src/presets/localization/hebrew.ts @@ -26,11 +26,13 @@ export const heStrings = { // [Auto-translated] "Visible tabs" items: "כרטיסיות גלויות", // [Auto-translated] "Hidden tabs" - unsortedItems: "כרטיסיות מוסתרות", + hiddenItems: "כרטיסיות מוסתרות", // [Auto-translated] "Default tab" defaultTab: "כרטיסיית ברירת מחדל", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "גרור פריט מעמודה זו לעמודה השמאלית - הוא יופיע גלוי בחלונית Tabs. באפשרותך גם להזיז פריטים באמצעות לחצני הפלוס (+) והמינוס (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "גרור כרטיסיות לכאן כדי להציג אותן", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "גרור כרטיסיות לכאן כדי להסתיר אותן", // [Auto-translated] "Name" name: "שם", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const heStrings = { toolbox: "ארגז כלים", // [Auto-translated] "Categories" categories: "קטגוריות", + // [Auto-translated] "No categories" + noCategoriesText: "אין קטגוריות", + // [Auto-translated] "Drag items here to show them" + noItemsText: "גרור פריטים לכאן כדי להציג אותם", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "גרור פריטים לכאן כדי להסתיר אותם", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "פריטי ארגז כלים מוסתרים", + hiddenItems: "פריטי ארגז כלים מוסתרים", // [Auto-translated] "Enable grouping" enableGrouping: "הפיכת קיבוץ לזמין", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const heStrings = { addToToolbox: "הוספה לארגז הכלים", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "מחיקת פריט מותאם אישית", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "גרור פריט מעמודה זו לעמודה השמאלית - הוא יופיע גלוי בחלונית ארגז הכלים. באפשרותך גם להזיז פריטים באמצעות לחצני הפלוס (+) והמינוס (-).", // [Auto-translated] "New Category" addCustomCategory: "קטגוריה חדשה", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const heStrings = { selectElement: "בחר רכיב כדי להתאים אישית את ההגדרות שלו הזמינות ברשת המאפיינים", // [Auto-translated] "Property Grid" propertyGrid: "רשת מאפיינים", + // [Auto-translated] "No categories" + noCategoriesText: "אין קטגוריות", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "גרור מאפיינים לכאן כדי להציג אותם", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "גרור מאפיינים לכאן כדי להסתיר אותם", // [Auto-translated] "Unsorted items" - unsortedItems: "פריטים לא ממוינים", + hiddenItems: "פריטים לא ממוינים", // [Auto-translated] "Name" categoryName: "שם", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const heStrings = { titleField: "כותר", // [Auto-translated] "Helper Text" descriptionField: "טקסט מסייע", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "גרור פריט מעמודה זו לעמודה השמאלית - הוא יופיע גלוי בחלונית Tabs. באפשרותך גם להזיז פריטים באמצעות לחצני הפלוס (+) והמינוס (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "הוסף קטגוריה מותאמת אישית" }, diff --git a/packages/survey-creator-core/src/presets/localization/hungarian.ts b/packages/survey-creator-core/src/presets/localization/hungarian.ts index e6b92d3a4a..ad906401b7 100644 --- a/packages/survey-creator-core/src/presets/localization/hungarian.ts +++ b/packages/survey-creator-core/src/presets/localization/hungarian.ts @@ -26,11 +26,13 @@ export const huStrings = { // [Auto-translated] "Visible tabs" items: "Látható lapok", // [Auto-translated] "Hidden tabs" - unsortedItems: "Rejtett lapok", + hiddenItems: "Rejtett lapok", // [Auto-translated] "Default tab" defaultTab: "Alapértelmezett lap", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Húzzon egy elemet ebből az oszlopból balra - az látható lesz a Lapok panelen. Az elemeket a plusz (+) és a mínusz (-) gombokkal is áthelyezheti.", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Húzza ide a lapokat a megjelenítésükhöz", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Húzza ide a lapokat az elrejtéshez", // [Auto-translated] "Name" name: "Név", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const huStrings = { toolbox: "Szerszámosláda", // [Auto-translated] "Categories" categories: "Kategóriák", + // [Auto-translated] "No categories" + noCategoriesText: "Nincs kategória", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Húzza ide az elemeket a megjelenítésükhöz", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Húzza ide az elemeket az elrejtéshez", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Rejtett eszköztár elemek", + hiddenItems: "Rejtett eszköztár elemek", // [Auto-translated] "Enable grouping" enableGrouping: "Csoportosítás engedélyezése", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const huStrings = { addToToolbox: "Hozzáadás az eszköztárhoz", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Egyéni elem törlése", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Húzzon egy elemet ebből az oszlopból balra - az látható lesz az Eszköztár panelen. Az elemeket a plusz (+) és a mínusz (-) gombokkal is áthelyezheti.", // [Auto-translated] "New Category" addCustomCategory: "Új kategória", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const huStrings = { selectElement: "Válasszon ki egy elemet a tulajdonságrácsban elérhető beállítások testreszabásához", // [Auto-translated] "Property Grid" propertyGrid: "Tulajdonságrács", + // [Auto-translated] "No categories" + noCategoriesText: "Nincs kategória", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Húzza ide a tulajdonságokat a megjelenítésükhöz", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Húzza ide a tulajdonságokat az elrejtéshez", // [Auto-translated] "Unsorted items" - unsortedItems: "Rendezetlen elemek", + hiddenItems: "Rendezetlen elemek", // [Auto-translated] "Name" categoryName: "Név", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const huStrings = { titleField: "Cím", // [Auto-translated] "Helper Text" descriptionField: "Segítő szöveg", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Húzzon egy elemet ebből az oszlopból balra - az látható lesz a Lapok panelen. Az elemeket a plusz (+) és a mínusz (-) gombokkal is áthelyezheti.", // [Auto-translated] "Add Custom Category" addCustomCategory: "Egyéni kategória hozzáadása" }, diff --git a/packages/survey-creator-core/src/presets/localization/indonesian.ts b/packages/survey-creator-core/src/presets/localization/indonesian.ts index 5a78a57e88..45954b0641 100644 --- a/packages/survey-creator-core/src/presets/localization/indonesian.ts +++ b/packages/survey-creator-core/src/presets/localization/indonesian.ts @@ -26,11 +26,13 @@ export const idStrings = { // [Auto-translated] "Visible tabs" items: "Tab yang terlihat", // [Auto-translated] "Hidden tabs" - unsortedItems: "Tab tersembunyi", + hiddenItems: "Tab tersembunyi", // [Auto-translated] "Default tab" defaultTab: "Tab default", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Seret item dari kolom ini ke kiri - itu akan tampak terlihat di panel Tab. Anda juga dapat memindahkan item, menggunakan tombol plus (+) dan minus (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Seret tab ke sini untuk menampilkannya", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Seret tab ke sini untuk menyembunyikannya", // [Auto-translated] "Name" name: "Nama", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const idStrings = { toolbox: "Toolbox", // [Auto-translated] "Categories" categories: "Kategori", + // [Auto-translated] "No categories" + noCategoriesText: "Tidak ada kategori", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Seret item ke sini untuk menampilkannya", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Seret item ke sini untuk menyembunyikannya", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Item kotak alat tersembunyi", + hiddenItems: "Item kotak alat tersembunyi", // [Auto-translated] "Enable grouping" enableGrouping: "Aktifkan pengelompokan", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const idStrings = { addToToolbox: "Tambahkan ke Toolbox", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Hapus Item Kustom", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Seret item dari kolom ini ke kiri - itu akan muncul terlihat di panel Toolbox. Anda juga dapat memindahkan item, menggunakan tombol plus (+) dan minus (-).", // [Auto-translated] "New Category" addCustomCategory: "Kategori Baru", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const idStrings = { selectElement: "Pilih elemen untuk menyesuaikan pengaturannya yang tersedia di Kisi Properti", // [Auto-translated] "Property Grid" propertyGrid: "Kisi Properti", + // [Auto-translated] "No categories" + noCategoriesText: "Tidak ada kategori", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Seret properti ke sini untuk menampilkannya", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Seret properti ke sini untuk menyembunyikannya", // [Auto-translated] "Unsorted items" - unsortedItems: "Item yang tidak diurutkan", + hiddenItems: "Item yang tidak diurutkan", // [Auto-translated] "Name" categoryName: "Nama", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const idStrings = { titleField: "Titel", // [Auto-translated] "Helper Text" descriptionField: "Teks Pembantu", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Seret item dari kolom ini ke kiri - itu akan tampak terlihat di panel Tab. Anda juga dapat memindahkan item, menggunakan tombol plus (+) dan minus (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Tambahkan Kategori Kustom" }, diff --git a/packages/survey-creator-core/src/presets/localization/italian.ts b/packages/survey-creator-core/src/presets/localization/italian.ts index 55303f8489..ced131bd64 100644 --- a/packages/survey-creator-core/src/presets/localization/italian.ts +++ b/packages/survey-creator-core/src/presets/localization/italian.ts @@ -26,11 +26,13 @@ export const itStrings = { // [Auto-translated] "Visible tabs" items: "Schede visibili", // [Auto-translated] "Hidden tabs" - unsortedItems: "Schede nascoste", + hiddenItems: "Schede nascoste", // [Auto-translated] "Default tab" defaultTab: "Scheda Predefinito", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Trascina un elemento da questa colonna a quella sinistra: apparirà visibile nel pannello Schede. È inoltre possibile spostare gli elementi utilizzando i pulsanti più (+) e meno (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Trascina le schede qui per mostrarle", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Trascina qui le schede per nasconderle", // [Auto-translated] "Name" name: "Nome", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const itStrings = { toolbox: "Cassetta degli attrezzi", // [Auto-translated] "Categories" categories: "Categorie", + // [Auto-translated] "No categories" + noCategoriesText: "Nessuna categoria", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Trascina qui gli elementi per visualizzarli", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Trascina qui gli elementi per nasconderli", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Elementi nascosti della casella degli strumenti", + hiddenItems: "Elementi nascosti della casella degli strumenti", // [Auto-translated] "Enable grouping" enableGrouping: "Abilita raggruppamento", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const itStrings = { addToToolbox: "Aggiungi alla casella degli strumenti", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Elimina articolo personalizzato", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Trascina un elemento da questa colonna a quella sinistra: apparirà visibile nel pannello Toolbox. È inoltre possibile spostare gli elementi utilizzando i pulsanti più (+) e meno (-).", // [Auto-translated] "New Category" addCustomCategory: "Nuova Categoria", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const itStrings = { selectElement: "Seleziona un elemento per personalizzarne le impostazioni disponibili nella Griglia Proprietà", // [Auto-translated] "Property Grid" propertyGrid: "Griglia delle proprietà", + // [Auto-translated] "No categories" + noCategoriesText: "Nessuna categoria", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Trascina qui le proprietà per visualizzarle", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Trascina qui le proprietà per nasconderle", // [Auto-translated] "Unsorted items" - unsortedItems: "Articoli non ordinati", + hiddenItems: "Articoli non ordinati", // [Auto-translated] "Name" categoryName: "Nome", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const itStrings = { titleField: "Titolo", // [Auto-translated] "Helper Text" descriptionField: "Testo di supporto", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Trascina un elemento da questa colonna a quella sinistra: apparirà visibile nel pannello Schede. È inoltre possibile spostare gli elementi utilizzando i pulsanti più (+) e meno (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Aggiungi categoria personalizzata" }, diff --git a/packages/survey-creator-core/src/presets/localization/japanese.ts b/packages/survey-creator-core/src/presets/localization/japanese.ts index 3b34f08af3..1920164479 100644 --- a/packages/survey-creator-core/src/presets/localization/japanese.ts +++ b/packages/survey-creator-core/src/presets/localization/japanese.ts @@ -26,11 +26,13 @@ export const jaStrings = { // [Auto-translated] "Visible tabs" items: "表示タブ", // [Auto-translated] "Hidden tabs" - unsortedItems: "非表示のタブ", + hiddenItems: "非表示のタブ", // [Auto-translated] "Default tab" defaultTab: "[デフォルト] タブ", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "この列から左の列に項目をドラッグすると、タブパネルに表示されます。プラス (+) ボタンとマイナス (-) ボタンを使用してアイテムを移動することもできます。", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "タブをここにドラッグして表示します", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "タブをここにドラッグして非表示にします", // [Auto-translated] "Name" name: "名前", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const jaStrings = { toolbox: "ツールボックス", // [Auto-translated] "Categories" categories: "カテゴリ", + // [Auto-translated] "No categories" + noCategoriesText: "カテゴリなし", + // [Auto-translated] "Drag items here to show them" + noItemsText: "項目をここにドラッグして表示します", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "アイテムをここにドラッグして非表示にします", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "非表示のツールボックス項目", + hiddenItems: "非表示のツールボックス項目", // [Auto-translated] "Enable grouping" enableGrouping: "グループ化を有効にする", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const jaStrings = { addToToolbox: "ツールボックスに追加", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "カスタムアイテムの削除", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "この列から左側の列に項目をドラッグすると、ツールボックスパネルに表示されます。プラス (+) ボタンとマイナス (-) ボタンを使用してアイテムを移動することもできます。", // [Auto-translated] "New Category" addCustomCategory: "新しいカテゴリ", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const jaStrings = { selectElement: "要素を選択して、プロパティグリッドで利用可能な設定をカスタマイズします", // [Auto-translated] "Property Grid" propertyGrid: "プロパティグリッド", + // [Auto-translated] "No categories" + noCategoriesText: "カテゴリなし", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "プロパティをここにドラッグして表示します", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "ここにプロパティをドラッグして非表示にします", // [Auto-translated] "Unsorted items" - unsortedItems: "未ソートのアイテム", + hiddenItems: "未ソートのアイテム", // [Auto-translated] "Name" categoryName: "名前", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const jaStrings = { titleField: "タイトル", // [Auto-translated] "Helper Text" descriptionField: "ヘルパーテキスト", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "この列から左の列に項目をドラッグすると、タブパネルに表示されます。プラス (+) ボタンとマイナス (-) ボタンを使用してアイテムを移動することもできます。", // [Auto-translated] "Add Custom Category" addCustomCategory: "カスタムカテゴリの追加" }, diff --git a/packages/survey-creator-core/src/presets/localization/korean.ts b/packages/survey-creator-core/src/presets/localization/korean.ts index d9673a718b..585ae43874 100644 --- a/packages/survey-creator-core/src/presets/localization/korean.ts +++ b/packages/survey-creator-core/src/presets/localization/korean.ts @@ -26,11 +26,13 @@ export const koStrings = { // [Auto-translated] "Visible tabs" items: "표시되는 탭", // [Auto-translated] "Hidden tabs" - unsortedItems: "숨겨진 탭", + hiddenItems: "숨겨진 탭", // [Auto-translated] "Default tab" defaultTab: "기본 탭", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "이 열에서 왼쪽 열로 항목을 드래그하면 탭 패널에 표시됩니다. 더하기(+) 및 빼기(-) 버튼을 사용하여 항목을 이동할 수도 있습니다.", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "탭을 여기로 드래그하여 표시합니다.", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "탭을 여기로 드래그하여 숨깁니다.", // [Auto-translated] "Name" name: "이름", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const koStrings = { toolbox: "도구", // [Auto-translated] "Categories" categories: "카테고리", + // [Auto-translated] "No categories" + noCategoriesText: "카테고리 없음", + // [Auto-translated] "Drag items here to show them" + noItemsText: "항목을 여기로 드래그하여 표시합니다.", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "항목을 여기로 드래그하여 숨깁니다.", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "숨겨진 도구 상자 항목", + hiddenItems: "숨겨진 도구 상자 항목", // [Auto-translated] "Enable grouping" enableGrouping: "그룹화 사용", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const koStrings = { addToToolbox: "도구 상자에 추가", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "사용자 지정 항목 삭제", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "이 열에서 왼쪽 열로 항목을 드래그하면 도구 상자 패널에 표시됩니다. 더하기(+) 및 빼기(-) 버튼을 사용하여 항목을 이동할 수도 있습니다.", // [Auto-translated] "New Category" addCustomCategory: "새 카테고리", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const koStrings = { selectElement: "요소를 선택하여 속성 그리드에서 사용할 수 있는 설정을 사용자 지정합니다", // [Auto-translated] "Property Grid" propertyGrid: "속성 그리드", + // [Auto-translated] "No categories" + noCategoriesText: "카테고리 없음", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "속성을 여기로 드래그하여 표시합니다.", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "속성을 여기로 드래그하여 숨깁니다.", // [Auto-translated] "Unsorted items" - unsortedItems: "정렬되지 않은 항목", + hiddenItems: "정렬되지 않은 항목", // [Auto-translated] "Name" categoryName: "이름", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const koStrings = { titleField: "타이틀", // [Auto-translated] "Helper Text" descriptionField: "도우미 텍스트", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "이 열에서 왼쪽 열로 항목을 드래그하면 탭 패널에 표시됩니다. 더하기(+) 및 빼기(-) 버튼을 사용하여 항목을 이동할 수도 있습니다.", // [Auto-translated] "Add Custom Category" addCustomCategory: "사용자 지정 범주 추가" }, diff --git a/packages/survey-creator-core/src/presets/localization/malay.ts b/packages/survey-creator-core/src/presets/localization/malay.ts index d8e1b30dba..b6166b2e2b 100644 --- a/packages/survey-creator-core/src/presets/localization/malay.ts +++ b/packages/survey-creator-core/src/presets/localization/malay.ts @@ -26,11 +26,13 @@ export const msStrings = { // [Auto-translated] "Visible tabs" items: "Tab yang boleh dilihat", // [Auto-translated] "Hidden tabs" - unsortedItems: "Tab tersembunyi", + hiddenItems: "Tab tersembunyi", // [Auto-translated] "Default tab" defaultTab: "Tab lalai", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Seret item dari lajur ini ke kiri - ia akan kelihatan dalam panel Tab. Anda juga boleh mengalihkan item, menggunakan butang tambah (+) dan tolak (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Seret tab di sini untuk menunjukkannya", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Seret tab di sini untuk menyembunyikannya", // [Auto-translated] "Name" name: "Nama", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const msStrings = { toolbox: "Toolbox", // [Auto-translated] "Categories" categories: "Kategori", + // [Auto-translated] "No categories" + noCategoriesText: "Tiada kategori", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Seret item di sini untuk menunjukkannya", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Seret item ke sini untuk menyembunyikannya", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Item kotak alat tersembunyi", + hiddenItems: "Item kotak alat tersembunyi", // [Auto-translated] "Enable grouping" enableGrouping: "Dayakan pengumpulan", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const msStrings = { addToToolbox: "Tambah ke Kotak Alat", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Padamkan Item Tersuai", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Seret item dari lajur ini ke kiri - ia akan kelihatan kelihatan dalam panel Kotak Alat. Anda juga boleh mengalihkan item, menggunakan butang tambah (+) dan tolak (-).", // [Auto-translated] "New Category" addCustomCategory: "Kategori Baru", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const msStrings = { selectElement: "Pilih elemen untuk menyesuaikan tetapannya yang tersedia dalam Grid Sifat", // [Auto-translated] "Property Grid" propertyGrid: "Grid Harta", + // [Auto-translated] "No categories" + noCategoriesText: "Tiada kategori", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Seret sifat di sini untuk menunjukkannya", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Seret sifat di sini untuk menyembunyikannya", // [Auto-translated] "Unsorted items" - unsortedItems: "Item yang tidak diisih", + hiddenItems: "Item yang tidak diisih", // [Auto-translated] "Name" categoryName: "Nama", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const msStrings = { titleField: "Tajuk", // [Auto-translated] "Helper Text" descriptionField: "Teks Pembantu", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Seret item dari lajur ini ke kiri - ia akan kelihatan dalam panel Tab. Anda juga boleh mengalihkan item, menggunakan butang tambah (+) dan tolak (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Tambah Kategori Tersuai" }, diff --git a/packages/survey-creator-core/src/presets/localization/mongolian.ts b/packages/survey-creator-core/src/presets/localization/mongolian.ts index da1a69f203..f07a9b649c 100644 --- a/packages/survey-creator-core/src/presets/localization/mongolian.ts +++ b/packages/survey-creator-core/src/presets/localization/mongolian.ts @@ -26,11 +26,13 @@ export const mnStrings = { // [Auto-translated] "Visible tabs" items: "Харагдах таб", // [Auto-translated] "Hidden tabs" - unsortedItems: "Нуугдмал таб", + hiddenItems: "Нуугдмал таб", // [Auto-translated] "Default tab" defaultTab: "Default tab", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Энэ баганаас зүүн тал руу нэг зүйлийг чирч гарга - Tabs panel-д харагдана. Мөн плюс (+) болон минус (-) товчлууруудыг ашиглан эд зүйлсийг зөөж болно.", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Үзүүлэхийн тулд tab-уудыг энд чирч оруулна уу", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Тэдгээрийг нуухын тулд табуудыг энд чирч оруул", // [Auto-translated] "Name" name: "Нэр", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const mnStrings = { toolbox: "Toolbox", // [Auto-translated] "Categories" categories: "Ангилал", + // [Auto-translated] "No categories" + noCategoriesText: "Ангилал байхгүй", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Үзүүлэхийн тулд энд чирч оруул", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Нуухын тулд энд чирч оруул", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Нуугдмал хэрэгслийн зүйлс", + hiddenItems: "Нуугдмал хэрэгслийн зүйлс", // [Auto-translated] "Enable grouping" enableGrouping: "Бүлэглэлийг идэвхжүүлэх", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const mnStrings = { addToToolbox: "Toolbox-д оруулах", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Custom item устгах", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Энэ баганаас зүүн тал руу нэг зүйлийг чирч гарга - энэ нь Toolbox panel-д харагдах болно. Мөн плюс (+) болон минус (-) товчлууруудыг ашиглан эд зүйлсийг зөөж болно.", // [Auto-translated] "New Category" addCustomCategory: "Шинэ ангилал", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const mnStrings = { selectElement: "Property Grid-д байгаа тохиргоог нь тохируулах элементийг сонго", // [Auto-translated] "Property Grid" propertyGrid: "Өмч хөрөнгийн сүлжээ", + // [Auto-translated] "No categories" + noCategoriesText: "Ангилал байхгүй", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Үзүүлэхийн тулд энд чирэгдүүл", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Шинж чанаруудыг нуухын тулд энд чирч оруул", // [Auto-translated] "Unsorted items" - unsortedItems: "Ангилаагүй зүйлс", + hiddenItems: "Ангилаагүй зүйлс", // [Auto-translated] "Name" categoryName: "Нэр", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const mnStrings = { titleField: "Гарчиг", // [Auto-translated] "Helper Text" descriptionField: "Туслах текст", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Энэ баганаас зүүн тал руу нэг зүйлийг чирч гарга - Tabs panel-д харагдана. Мөн плюс (+) болон минус (-) товчлууруудыг ашиглан эд зүйлсийг зөөж болно.", // [Auto-translated] "Add Custom Category" addCustomCategory: "Custom Category нэмэх" }, diff --git a/packages/survey-creator-core/src/presets/localization/norwegian.ts b/packages/survey-creator-core/src/presets/localization/norwegian.ts index 11a18a373b..e44e0adde9 100644 --- a/packages/survey-creator-core/src/presets/localization/norwegian.ts +++ b/packages/survey-creator-core/src/presets/localization/norwegian.ts @@ -26,11 +26,13 @@ export const nbStrings = { // [Auto-translated] "Visible tabs" items: "Synlige faner", // [Auto-translated] "Hidden tabs" - unsortedItems: "Skjulte faner", + hiddenItems: "Skjulte faner", // [Auto-translated] "Default tab" defaultTab: "Standard-fanen", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Dra et element fra denne kolonnen til venstre - det vil vises synlig i Faner-panelet. Du kan også flytte elementer ved hjelp av pluss- (+) og minusknapper (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Dra faner hit for å vise dem", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Dra faner hit for å skjule dem", // [Auto-translated] "Name" name: "Navn", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const nbStrings = { toolbox: "Verktøykasse", // [Auto-translated] "Categories" categories: "Kategorier", + // [Auto-translated] "No categories" + noCategoriesText: "Ingen kategorier", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Dra objekter hit for å vise dem", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Dra objekter hit for å skjule dem", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Skjulte elementer i verktøykassen", + hiddenItems: "Skjulte elementer i verktøykassen", // [Auto-translated] "Enable grouping" enableGrouping: "Aktivere gruppering", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const nbStrings = { addToToolbox: "Legg til i verktøykassen", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Slett egendefinert element", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Dra et element fra denne kolonnen til venstre - det vil vises synlig i Verktøykasse-panelet. Du kan også flytte elementer ved hjelp av pluss- (+) og minusknapper (-).", // [Auto-translated] "New Category" addCustomCategory: "Ny kategori", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const nbStrings = { selectElement: "Velg et element for å tilpasse innstillingene som er tilgjengelige i egenskapsrutenettet", // [Auto-translated] "Property Grid" propertyGrid: "Eiendom rutenett", + // [Auto-translated] "No categories" + noCategoriesText: "Ingen kategorier", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Dra egenskaper hit for å vise dem", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Dra egenskaper hit for å skjule dem", // [Auto-translated] "Unsorted items" - unsortedItems: "Usorterte elementer", + hiddenItems: "Usorterte elementer", // [Auto-translated] "Name" categoryName: "Navn", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const nbStrings = { titleField: "Tittel", // [Auto-translated] "Helper Text" descriptionField: "Tekst til hjelper", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Dra et element fra denne kolonnen til venstre - det vil vises synlig i Faner-panelet. Du kan også flytte elementer ved hjelp av pluss- (+) og minusknapper (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Legg til egendefinert kategori" }, diff --git a/packages/survey-creator-core/src/presets/localization/persian.ts b/packages/survey-creator-core/src/presets/localization/persian.ts index 309d4d920e..9c59189fd4 100644 --- a/packages/survey-creator-core/src/presets/localization/persian.ts +++ b/packages/survey-creator-core/src/presets/localization/persian.ts @@ -26,11 +26,13 @@ export const faStrings = { // [Auto-translated] "Visible tabs" items: "برگه های قابل مشاهده", // [Auto-translated] "Hidden tabs" - unsortedItems: "برگه های مخفی", + hiddenItems: "برگه های مخفی", // [Auto-translated] "Default tab" defaultTab: "برگه پیش فرض", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "یک مورد را از این ستون به سمت چپ بکشید - در پنل Tabs قابل مشاهده ظاهر می شود. همچنین می توانید موارد را با استفاده از دکمه های مثبت (+) و منفی (-) جابجا کنید.", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "برگه ها را به اینجا بکشید تا نشان داده شود", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "برگه ها را به اینجا بکشید تا پنهان شوند", // [Auto-translated] "Name" name: "نام", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const faStrings = { toolbox: "جعبه ابزار", // [Auto-translated] "Categories" categories: "دسته", + // [Auto-translated] "No categories" + noCategoriesText: "بدون دسته بندی", + // [Auto-translated] "Drag items here to show them" + noItemsText: "موارد را به اینجا بکشید تا نشان داده شود", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "موارد را به اینجا بکشید تا پنهان شوند", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "موارد جعبه ابزار مخفی", + hiddenItems: "موارد جعبه ابزار مخفی", // [Auto-translated] "Enable grouping" enableGrouping: "گروه بندی را فعال کنید", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const faStrings = { addToToolbox: "اضافه کردن به جعبه ابزار", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "حذف آیتم سفارشی", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "یک مورد را از این ستون به سمت چپ بکشید - در پانل جعبه ابزار قابل مشاهده ظاهر می شود. همچنین می توانید موارد را با استفاده از دکمه های مثبت (+) و منفی (-) جابجا کنید.", // [Auto-translated] "New Category" addCustomCategory: "دسته بندی جدید", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const faStrings = { selectElement: "یک عنصر را برای سفارشی کردن تنظیمات موجود در Property Grid انتخاب کنید", // [Auto-translated] "Property Grid" propertyGrid: "شبکه املاک", + // [Auto-translated] "No categories" + noCategoriesText: "بدون دسته بندی", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "ویژگی ها را به اینجا بکشید تا به آنها نشان داده شود", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "ویژگی ها را به اینجا بکشید تا پنهان شوند", // [Auto-translated] "Unsorted items" - unsortedItems: "موارد مرتب نشده", + hiddenItems: "موارد مرتب نشده", // [Auto-translated] "Name" categoryName: "نام", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const faStrings = { titleField: "عنوان", // [Auto-translated] "Helper Text" descriptionField: "متن کمکی", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "یک مورد را از این ستون به سمت چپ بکشید - در پنل Tabs قابل مشاهده ظاهر می شود. همچنین می توانید موارد را با استفاده از دکمه های مثبت (+) و منفی (-) جابجا کنید.", // [Auto-translated] "Add Custom Category" addCustomCategory: "افزودن دسته بندی سفارشی" }, diff --git a/packages/survey-creator-core/src/presets/localization/polish.ts b/packages/survey-creator-core/src/presets/localization/polish.ts index aa74d8ce4b..f8421efb4c 100644 --- a/packages/survey-creator-core/src/presets/localization/polish.ts +++ b/packages/survey-creator-core/src/presets/localization/polish.ts @@ -26,11 +26,13 @@ export const plStrings = { // [Auto-translated] "Visible tabs" items: "Widoczne zakładki", // [Auto-translated] "Hidden tabs" - unsortedItems: "Ukryte karty", + hiddenItems: "Ukryte karty", // [Auto-translated] "Default tab" defaultTab: "Zakładka Domyślne", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Przeciągnij element z tej kolumny do lewej - pojawi się on widoczny w panelu Karty. Możesz także przenosić elementy za pomocą przycisków plus (+) i minus (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Przeciągnij karty tutaj, aby je wyświetlić", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Przeciągnij karty tutaj, aby je ukryć", // [Auto-translated] "Name" name: "Nazwa", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const plStrings = { toolbox: "Skrzynka z narzędziami", // [Auto-translated] "Categories" categories: "Kategorie", + // [Auto-translated] "No categories" + noCategoriesText: "Brak kategorii", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Przeciągnij elementy tutaj, aby je wyświetlić", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Przeciągnij elementy tutaj, aby je ukryć", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Ukryte elementy przybornika", + hiddenItems: "Ukryte elementy przybornika", // [Auto-translated] "Enable grouping" enableGrouping: "Włączanie grupowania", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const plStrings = { addToToolbox: "Dodaj do przybornika", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Usuń element niestandardowy", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Przeciągnij element z tej kolumny do lewej - pojawi się on w panelu Przybornik. Możesz także przenosić elementy za pomocą przycisków plus (+) i minus (-).", // [Auto-translated] "New Category" addCustomCategory: "Nowa kategoria", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const plStrings = { selectElement: "Wybierz element, aby dostosować jego ustawienia dostępne w siatce właściwości", // [Auto-translated] "Property Grid" propertyGrid: "Siatka właściwości", + // [Auto-translated] "No categories" + noCategoriesText: "Brak kategorii", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Przeciągnij właściwości tutaj, aby je wyświetlić", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Przeciągnij właściwości tutaj, aby je ukryć", // [Auto-translated] "Unsorted items" - unsortedItems: "Nieposortowane przedmioty", + hiddenItems: "Nieposortowane przedmioty", // [Auto-translated] "Name" categoryName: "Nazwa", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const plStrings = { titleField: "Tytuł", // [Auto-translated] "Helper Text" descriptionField: "Tekst pomocniczy", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Przeciągnij element z tej kolumny do lewej - pojawi się on widoczny w panelu Karty. Możesz także przenosić elementy za pomocą przycisków plus (+) i minus (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Dodaj kategorię niestandardową" }, diff --git a/packages/survey-creator-core/src/presets/localization/portuguese.ts b/packages/survey-creator-core/src/presets/localization/portuguese.ts index a2ca36f6b5..5df5da7e6e 100644 --- a/packages/survey-creator-core/src/presets/localization/portuguese.ts +++ b/packages/survey-creator-core/src/presets/localization/portuguese.ts @@ -26,11 +26,13 @@ export const ptStrings = { // [Auto-translated] "Visible tabs" items: "Guias visíveis", // [Auto-translated] "Hidden tabs" - unsortedItems: "Guias ocultas", + hiddenItems: "Guias ocultas", // [Auto-translated] "Default tab" defaultTab: "Guia Padrão", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Arraste um item desta coluna para a esquerda - ele aparecerá visível no painel Guias. Você também pode mover itens, usando os botões de mais (+) e menos (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Arraste as guias aqui para mostrá-las", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Arraste as guias aqui para ocultá-las", // [Auto-translated] "Name" name: "Nome", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const ptStrings = { toolbox: "Toolbox", // [Auto-translated] "Categories" categories: "Categorias", + // [Auto-translated] "No categories" + noCategoriesText: "Sem categorias", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Arraste os itens aqui para mostrá-los", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Arraste os itens aqui para ocultá-los", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Itens ocultos da caixa de ferramentas", + hiddenItems: "Itens ocultos da caixa de ferramentas", // [Auto-translated] "Enable grouping" enableGrouping: "Habilitar agrupamento", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const ptStrings = { addToToolbox: "Adicionar à caixa de ferramentas", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Excluir item personalizado", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Arraste um item desta coluna para a esquerda - ele aparecerá visível no painel Caixa de ferramentas. Você também pode mover itens, usando os botões de mais (+) e menos (-).", // [Auto-translated] "New Category" addCustomCategory: "Nova categoria", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const ptStrings = { selectElement: "Selecione um elemento para personalizar suas configurações disponíveis na Grade de propriedades", // [Auto-translated] "Property Grid" propertyGrid: "Grade de propriedades", + // [Auto-translated] "No categories" + noCategoriesText: "Sem categorias", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Arraste as propriedades aqui para mostrá-las", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Arraste as propriedades aqui para ocultá-las", // [Auto-translated] "Unsorted items" - unsortedItems: "Itens não classificados", + hiddenItems: "Itens não classificados", // [Auto-translated] "Name" categoryName: "Nome", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const ptStrings = { titleField: "Título", // [Auto-translated] "Helper Text" descriptionField: "Texto auxiliar", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Arraste um item desta coluna para a esquerda - ele aparecerá visível no painel Guias. Você também pode mover itens, usando os botões de mais (+) e menos (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Adicionar categoria personalizada" }, diff --git a/packages/survey-creator-core/src/presets/localization/romanian.ts b/packages/survey-creator-core/src/presets/localization/romanian.ts index 9472467c4e..3cdfef5254 100644 --- a/packages/survey-creator-core/src/presets/localization/romanian.ts +++ b/packages/survey-creator-core/src/presets/localization/romanian.ts @@ -26,11 +26,13 @@ export const roStrings = { // [Auto-translated] "Visible tabs" items: "File vizibile", // [Auto-translated] "Hidden tabs" - unsortedItems: "File ascunse", + hiddenItems: "File ascunse", // [Auto-translated] "Default tab" defaultTab: "Fila implicită", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Trageți un element din această coloană în cea din stânga - acesta va apărea vizibil în panoul File. De asemenea, puteți muta elemente, folosind butoanele plus (+) și minus (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Trageți filele aici pentru a le afișa", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Trageți filele aici pentru a le ascunde", // [Auto-translated] "Name" name: "Nume", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const roStrings = { toolbox: "Cutie de scule", // [Auto-translated] "Categories" categories: "Categorii", + // [Auto-translated] "No categories" + noCategoriesText: "Fără categorii", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Trageți elementele aici pentru a le afișa", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Trageți elementele aici pentru a le ascunde", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Elemente ascunse din cutia de instrumente", + hiddenItems: "Elemente ascunse din cutia de instrumente", // [Auto-translated] "Enable grouping" enableGrouping: "Activați gruparea", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const roStrings = { addToToolbox: "Adăugați în trusa de instrumente", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Ștergeți elementul personalizat", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Trageți un element din această coloană în cea din stânga - acesta va apărea vizibil în panoul Trusa de scule. De asemenea, puteți muta elemente, folosind butoanele plus (+) și minus (-).", // [Auto-translated] "New Category" addCustomCategory: "Categorie nouă", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const roStrings = { selectElement: "Selectați un element pentru a-i personaliza setările disponibile în grila de proprietăți", // [Auto-translated] "Property Grid" propertyGrid: "Grilă de proprietăți", + // [Auto-translated] "No categories" + noCategoriesText: "Fără categorii", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Trageți proprietățile aici pentru a le afișa", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Trageți proprietățile aici pentru a le ascunde", // [Auto-translated] "Unsorted items" - unsortedItems: "Articole nesortate", + hiddenItems: "Articole nesortate", // [Auto-translated] "Name" categoryName: "Nume", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const roStrings = { titleField: "Titlu", // [Auto-translated] "Helper Text" descriptionField: "Text de ajutor", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Trageți un element din această coloană în cea din stânga - acesta va apărea vizibil în panoul File. De asemenea, puteți muta elemente, folosind butoanele plus (+) și minus (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Adăugați o categorie personalizată" }, diff --git a/packages/survey-creator-core/src/presets/localization/russian.ts b/packages/survey-creator-core/src/presets/localization/russian.ts index c782924b0e..4f251a5ce6 100644 --- a/packages/survey-creator-core/src/presets/localization/russian.ts +++ b/packages/survey-creator-core/src/presets/localization/russian.ts @@ -26,11 +26,13 @@ export const ruStrings = { // [Auto-translated] "Visible tabs" items: "Видимые вкладки", // [Auto-translated] "Hidden tabs" - unsortedItems: "Скрытые вкладки", + hiddenItems: "Скрытые вкладки", // [Auto-translated] "Default tab" defaultTab: "Вкладка \"По умолчанию\"", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Перетащите элемент из этой колонки в левую - он появится видимым на панели Вкладок. Вы также можете перемещать предметы, используя кнопки «плюс» (+) и «минус» (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Перетащите вкладки сюда, чтобы отобразить их", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Перетащите вкладки сюда, чтобы скрыть их", // [Auto-translated] "Name" name: "Имя", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const ruStrings = { toolbox: "Ящик для инструментов", // [Auto-translated] "Categories" categories: "Категории", + // [Auto-translated] "No categories" + noCategoriesText: "Без категорий", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Перетащите элементы сюда, чтобы отобразить их", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Перетащите элементы сюда, чтобы скрыть их", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Скрытые элементы панели инструментов", + hiddenItems: "Скрытые элементы панели инструментов", // [Auto-translated] "Enable grouping" enableGrouping: "Включить группировку", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const ruStrings = { addToToolbox: "Добавить в Toolbox", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Удалить пользовательский элемент", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Перетащите элемент из этой колонки в левую - он появится видимым на панели Toolbox. Вы также можете перемещать предметы, используя кнопки «плюс» (+) и «минус» (-).", // [Auto-translated] "New Category" addCustomCategory: "Новая категория", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const ruStrings = { selectElement: "Выберите элемент, чтобы настроить его параметры, доступные в сетке свойств", // [Auto-translated] "Property Grid" propertyGrid: "Сетка свойств", + // [Auto-translated] "No categories" + noCategoriesText: "Без категорий", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Перетащите свойства сюда, чтобы отобразить их", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Перетащите свойства сюда, чтобы скрыть их", // [Auto-translated] "Unsorted items" - unsortedItems: "Неотсортированные товары", + hiddenItems: "Неотсортированные товары", // [Auto-translated] "Name" categoryName: "Имя", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const ruStrings = { titleField: "Титул", // [Auto-translated] "Helper Text" descriptionField: "Вспомогательный текст", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Перетащите элемент из этой колонки в левую - он появится видимым на панели Вкладок. Вы также можете перемещать предметы, используя кнопки «плюс» (+) и «минус» (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Добавить пользовательскую категорию" }, diff --git a/packages/survey-creator-core/src/presets/localization/simplified-chinese.ts b/packages/survey-creator-core/src/presets/localization/simplified-chinese.ts index fa3ed6e7f7..00e31d2ab9 100644 --- a/packages/survey-creator-core/src/presets/localization/simplified-chinese.ts +++ b/packages/survey-creator-core/src/presets/localization/simplified-chinese.ts @@ -26,11 +26,13 @@ export const zhCnStrings = { // [Auto-translated] "Visible tabs" items: "可见选项卡", // [Auto-translated] "Hidden tabs" - unsortedItems: "隐藏标签页", + hiddenItems: "隐藏标签页", // [Auto-translated] "Default tab" defaultTab: "默认选项卡", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "将项目从此列拖到左侧 - 它将在选项卡面板中显示。您还可以使用加号 (+) 和减号 (-) 按钮移动项目。", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "将选项卡拖到此处以显示它们", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "将选项卡拖到此处以隐藏它们", // [Auto-translated] "Name" name: "名字", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const zhCnStrings = { toolbox: "工具箱", // [Auto-translated] "Categories" categories: "类别", + // [Auto-translated] "No categories" + noCategoriesText: "无类别", + // [Auto-translated] "Drag items here to show them" + noItemsText: "将项目拖到此处以显示它们", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "将项目拖到此处以隐藏它们", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "隐藏的工具箱项目", + hiddenItems: "隐藏的工具箱项目", // [Auto-translated] "Enable grouping" enableGrouping: "启用分组", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const zhCnStrings = { addToToolbox: "添加到工具箱", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "删除自定义项目", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "将项目从此列拖到左侧 - 它将在“工具箱”面板中显示。您还可以使用加号 (+) 和减号 (-) 按钮移动项目。", // [Auto-translated] "New Category" addCustomCategory: "新类别", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const zhCnStrings = { selectElement: "选择一个元素以自定义其在属性网格中可用的设置", // [Auto-translated] "Property Grid" propertyGrid: "属性网格", + // [Auto-translated] "No categories" + noCategoriesText: "无类别", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "将属性拖到此处以显示它们", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "将属性拖到此处以隐藏它们", // [Auto-translated] "Unsorted items" - unsortedItems: "未排序的项目", + hiddenItems: "未排序的项目", // [Auto-translated] "Name" categoryName: "名字", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const zhCnStrings = { titleField: "标题", // [Auto-translated] "Helper Text" descriptionField: "辅助文本", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "将项目从此列拖到左侧 - 它将在选项卡面板中显示。您还可以使用加号 (+) 和减号 (-) 按钮移动项目。", // [Auto-translated] "Add Custom Category" addCustomCategory: "添加自定义类别" }, diff --git a/packages/survey-creator-core/src/presets/localization/slovak.ts b/packages/survey-creator-core/src/presets/localization/slovak.ts index 9daddf4b70..1bb5b51aef 100644 --- a/packages/survey-creator-core/src/presets/localization/slovak.ts +++ b/packages/survey-creator-core/src/presets/localization/slovak.ts @@ -26,11 +26,13 @@ export const skStrings = { // [Auto-translated] "Visible tabs" items: "Viditeľné karty", // [Auto-translated] "Hidden tabs" - unsortedItems: "Skryté karty", + hiddenItems: "Skryté karty", // [Auto-translated] "Default tab" defaultTab: "Predvolená karta", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Presuňte položku z tohto stĺpca doľava - zobrazí sa viditeľne na paneli Karty. Položky môžete presúvať aj pomocou tlačidiel plus (+) a mínus (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Potiahnutím kariet sem ich zobrazíte", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Presunutím kariet sem ich skryjete", // [Auto-translated] "Name" name: "Meno", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const skStrings = { toolbox: "Toolbox", // [Auto-translated] "Categories" categories: "Kategórie", + // [Auto-translated] "No categories" + noCategoriesText: "Žiadne kategórie", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Presunutím položiek sem ich zobrazíte", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Presunutím položiek sem ich skryjete", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Skryté položky panela s nástrojmi", + hiddenItems: "Skryté položky panela s nástrojmi", // [Auto-translated] "Enable grouping" enableGrouping: "Povoliť zoskupovanie", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const skStrings = { addToToolbox: "Pridať do Toolboxu", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Odstrániť vlastnú položku", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Presuňte položku z tohto stĺpca doľava - zobrazí sa viditeľná na paneli Toolbox. Položky môžete presúvať aj pomocou tlačidiel plus (+) a mínus (-).", // [Auto-translated] "New Category" addCustomCategory: "Nová kategória", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const skStrings = { selectElement: "Výberom prvku prispôsobte jeho nastavenia dostupné v mriežke vlastností", // [Auto-translated] "Property Grid" propertyGrid: "Mriežka vlastností", + // [Auto-translated] "No categories" + noCategoriesText: "Žiadne kategórie", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Presuňte sem vlastnosti, aby ste ich zobrazili", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Presunutím vlastností sem ich skryjete", // [Auto-translated] "Unsorted items" - unsortedItems: "Nezoradené položky", + hiddenItems: "Nezoradené položky", // [Auto-translated] "Name" categoryName: "Meno", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const skStrings = { titleField: "Titul", // [Auto-translated] "Helper Text" descriptionField: "Pomocný text", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Presuňte položku z tohto stĺpca doľava - zobrazí sa viditeľne na paneli Karty. Položky môžete presúvať aj pomocou tlačidiel plus (+) a mínus (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Pridať vlastnú kategóriu" }, diff --git a/packages/survey-creator-core/src/presets/localization/slovenian.ts b/packages/survey-creator-core/src/presets/localization/slovenian.ts index 91ddb519b5..59d55fa4df 100644 --- a/packages/survey-creator-core/src/presets/localization/slovenian.ts +++ b/packages/survey-creator-core/src/presets/localization/slovenian.ts @@ -26,11 +26,13 @@ export const slStrings = { // [Auto-translated] "Visible tabs" items: "Vidni zavihki", // [Auto-translated] "Hidden tabs" - unsortedItems: "Skriti zavihki", + hiddenItems: "Skriti zavihki", // [Auto-translated] "Default tab" defaultTab: "Privzeti zavihek", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Povlecite element iz tega stolpca v levo - prikaže se na plošči Zavihki. Predmete lahko premikate tudi z gumboma plus (+) in minus (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Povlecite zavihke sem, da jih prikažete", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Povlecite zavihke sem, da jih skrijete", // [Auto-translated] "Name" name: "Ime", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const slStrings = { toolbox: "Orodjarni", // [Auto-translated] "Categories" categories: "Kategorije", + // [Auto-translated] "No categories" + noCategoriesText: "Brez kategorij", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Povlecite elemente sem, da jih prikažete", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Povlecite elemente sem, da jih skrijete", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Skriti elementi zbirke orodij", + hiddenItems: "Skriti elementi zbirke orodij", // [Auto-translated] "Enable grouping" enableGrouping: "Omogočanje združevanja v skupine", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const slStrings = { addToToolbox: "Dodaj v zbirko orodij", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Izbriši element po meri", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Povlecite element iz tega stolpca v levo - prikazan bo na plošči Toolbox. Predmete lahko premikate tudi z gumboma plus (+) in minus (-).", // [Auto-translated] "New Category" addCustomCategory: "Nova kategorija", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const slStrings = { selectElement: "Izberite element, da prilagodite njegove nastavitve, ki so na voljo v mreži lastnosti", // [Auto-translated] "Property Grid" propertyGrid: "Mreža lastnosti", + // [Auto-translated] "No categories" + noCategoriesText: "Brez kategorij", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Povlecite lastnosti sem, da jih prikažete", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Povlecite lastnosti sem, da jih skrijete", // [Auto-translated] "Unsorted items" - unsortedItems: "Nerazvrščeni elementi", + hiddenItems: "Nerazvrščeni elementi", // [Auto-translated] "Name" categoryName: "Ime", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const slStrings = { titleField: "Naslov", // [Auto-translated] "Helper Text" descriptionField: "Pomožno besedilo", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Povlecite element iz tega stolpca v levo - prikaže se na plošči Zavihki. Predmete lahko premikate tudi z gumboma plus (+) in minus (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Dodaj kategorijo po meri" }, diff --git a/packages/survey-creator-core/src/presets/localization/spanish.ts b/packages/survey-creator-core/src/presets/localization/spanish.ts index 259d1482d5..9739c57a14 100644 --- a/packages/survey-creator-core/src/presets/localization/spanish.ts +++ b/packages/survey-creator-core/src/presets/localization/spanish.ts @@ -26,11 +26,13 @@ export const esStrings = { // [Auto-translated] "Visible tabs" items: "Pestañas visibles", // [Auto-translated] "Hidden tabs" - unsortedItems: "Pestañas ocultas", + hiddenItems: "Pestañas ocultas", // [Auto-translated] "Default tab" defaultTab: "Pestaña predeterminada", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Arrastre un elemento de esta columna a la izquierda: aparecerá visible en el panel Pestañas. También puede mover elementos, usando los botones más (+) y menos (-).", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Arrastre las pestañas aquí para mostrarlas", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Arrastra pestañas aquí para ocultarlas", // [Auto-translated] "Name" name: "Nombre", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const esStrings = { toolbox: "Caja de herramientas", // [Auto-translated] "Categories" categories: "Categorías", + // [Auto-translated] "No categories" + noCategoriesText: "Sin categorías", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Arrastra elementos aquí para mostrarlos", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Arrastra elementos aquí para ocultarlos", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Elementos ocultos de la caja de herramientas", + hiddenItems: "Elementos ocultos de la caja de herramientas", // [Auto-translated] "Enable grouping" enableGrouping: "Habilitar agrupación", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const esStrings = { addToToolbox: "Agregar a la caja de herramientas", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Eliminar elemento personalizado", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Arrastre un elemento de esta columna a la izquierda: aparecerá visible en el panel Caja de herramientas. También puede mover elementos, usando los botones más (+) y menos (-).", // [Auto-translated] "New Category" addCustomCategory: "Nueva categoría", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const esStrings = { selectElement: "Seleccione un elemento para personalizar su configuración disponible en la cuadrícula de propiedades", // [Auto-translated] "Property Grid" propertyGrid: "Cuadrícula de propiedades", + // [Auto-translated] "No categories" + noCategoriesText: "Sin categorías", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Arrastre las propiedades aquí para mostrarlas", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Arrastre las propiedades aquí para ocultarlas", // [Auto-translated] "Unsorted items" - unsortedItems: "Artículos sin clasificar", + hiddenItems: "Artículos sin clasificar", // [Auto-translated] "Name" categoryName: "Nombre", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const esStrings = { titleField: "Título", // [Auto-translated] "Helper Text" descriptionField: "Texto auxiliar", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Arrastre un elemento de esta columna a la izquierda: aparecerá visible en el panel Pestañas. También puede mover elementos, usando los botones más (+) y menos (-).", // [Auto-translated] "Add Custom Category" addCustomCategory: "Agregar categoría personalizada" }, diff --git a/packages/survey-creator-core/src/presets/localization/swedish.ts b/packages/survey-creator-core/src/presets/localization/swedish.ts index b59197bba5..5a29b6dbfa 100644 --- a/packages/survey-creator-core/src/presets/localization/swedish.ts +++ b/packages/survey-creator-core/src/presets/localization/swedish.ts @@ -26,11 +26,13 @@ export const svStrings = { // [Auto-translated] "Visible tabs" items: "Synliga flikar", // [Auto-translated] "Hidden tabs" - unsortedItems: "Dolda flikar", + hiddenItems: "Dolda flikar", // [Auto-translated] "Default tab" defaultTab: "Fliken Standard", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Dra ett objekt från den här kolumnen till den vänstra - det kommer att visas synligt i flikpanelen. Du kan också flytta objekt med hjälp av plus- (+) och minus- (-)-knapparna.", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Dra flikar hit för att visa dem", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Dra flikar hit för att dölja dem", // [Auto-translated] "Name" name: "Namn", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const svStrings = { toolbox: "Verktygslåda", // [Auto-translated] "Categories" categories: "Kategorier", + // [Auto-translated] "No categories" + noCategoriesText: "Inga kategorier", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Dra objekt hit för att visa dem", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Dra objekt hit för att dölja dem", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Dolda objekt i verktygslådan", + hiddenItems: "Dolda objekt i verktygslådan", // [Auto-translated] "Enable grouping" enableGrouping: "Aktivera gruppering", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const svStrings = { addToToolbox: "Lägg till i Toolbox", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Ta bort anpassat objekt", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Dra ett objekt från den här kolumnen till den vänstra - det kommer att visas synligt i verktygslådepanelen. Du kan också flytta objekt med hjälp av plus- (+) och minus- (-)-knapparna.", // [Auto-translated] "New Category" addCustomCategory: "Ny kategori", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const svStrings = { selectElement: "Välj ett element för att anpassa dess inställningar som är tillgängliga i egenskapsrutnätet", // [Auto-translated] "Property Grid" propertyGrid: "Rutnät för fastigheter", + // [Auto-translated] "No categories" + noCategoriesText: "Inga kategorier", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Dra egenskaper hit för att visa dem", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Dra egenskaper hit för att dölja dem", // [Auto-translated] "Unsorted items" - unsortedItems: "Osorterade objekt", + hiddenItems: "Osorterade objekt", // [Auto-translated] "Name" categoryName: "Namn", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const svStrings = { titleField: "Titel", // [Auto-translated] "Helper Text" descriptionField: "Text för hjälpare", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Dra ett objekt från den här kolumnen till den vänstra - det kommer att visas synligt i flikpanelen. Du kan också flytta objekt med hjälp av plus- (+) och minus- (-)-knapparna.", // [Auto-translated] "Add Custom Category" addCustomCategory: "Lägg till anpassad kategori" }, diff --git a/packages/survey-creator-core/src/presets/localization/thai.ts b/packages/survey-creator-core/src/presets/localization/thai.ts index 8d6380043f..fc5eda2642 100644 --- a/packages/survey-creator-core/src/presets/localization/thai.ts +++ b/packages/survey-creator-core/src/presets/localization/thai.ts @@ -26,11 +26,13 @@ export const thStrings = { // [Auto-translated] "Visible tabs" items: "แท็บที่มองเห็นได้", // [Auto-translated] "Hidden tabs" - unsortedItems: "แท็บที่ซ่อนอยู่", + hiddenItems: "แท็บที่ซ่อนอยู่", // [Auto-translated] "Default tab" defaultTab: "แท็บเริ่มต้น", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "ลากรายการจากคอลัมน์นี้ไปทางซ้าย - รายการนั้นจะปรากฏในแผงแท็บ คุณยังสามารถย้ายรายการได้โดยใช้ปุ่มบวก (+) และลบ (-)", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "ลากแท็บมาที่นี่เพื่อแสดง", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "ลากแท็บมาที่นี่เพื่อซ่อนแท็บ", // [Auto-translated] "Name" name: "ชื่อ", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const thStrings = { toolbox: "เครื่อง มือ", // [Auto-translated] "Categories" categories: "ประเภท", + // [Auto-translated] "No categories" + noCategoriesText: "ไม่มีหมวดหมู่", + // [Auto-translated] "Drag items here to show them" + noItemsText: "ลากรายการมาที่นี่เพื่อแสดงรายการเหล่านั้น", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "ลากรายการมาที่นี่เพื่อซ่อนรายการเหล่านั้น", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "รายการกล่องเครื่องมือที่ซ่อนอยู่", + hiddenItems: "รายการกล่องเครื่องมือที่ซ่อนอยู่", // [Auto-translated] "Enable grouping" enableGrouping: "เปิดใช้งานการจัดกลุ่ม", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const thStrings = { addToToolbox: "เพิ่มไปยังกล่องเครื่องมือ", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "ลบรายการที่กําหนดเอง", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "ลากรายการจากคอลัมน์นี้ไปทางซ้าย - รายการนั้นจะปรากฏในแผงกล่องเครื่องมือ คุณยังสามารถย้ายรายการได้โดยใช้ปุ่มบวก (+) และลบ (-)", // [Auto-translated] "New Category" addCustomCategory: "หมวดหมู่ใหม่", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const thStrings = { selectElement: "เลือกองค์ประกอบเพื่อปรับแต่งการตั้งค่าที่มีอยู่ในกริดคุณสมบัติ", // [Auto-translated] "Property Grid" propertyGrid: "ตารางทรัพย์สิน", + // [Auto-translated] "No categories" + noCategoriesText: "ไม่มีหมวดหมู่", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "ลากคุณสมบัติมาที่นี่เพื่อแสดง", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "ลากคุณสมบัติที่นี่เพื่อซ่อน", // [Auto-translated] "Unsorted items" - unsortedItems: "รายการที่ไม่ได้เรียงลําดับ", + hiddenItems: "รายการที่ไม่ได้เรียงลําดับ", // [Auto-translated] "Name" categoryName: "ชื่อ", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const thStrings = { titleField: "ชื่อเรื่อง", // [Auto-translated] "Helper Text" descriptionField: "ข้อความตัวช่วย", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "ลากรายการจากคอลัมน์นี้ไปทางซ้าย - รายการนั้นจะปรากฏในแผงแท็บ คุณยังสามารถย้ายรายการได้โดยใช้ปุ่มบวก (+) และลบ (-)", // [Auto-translated] "Add Custom Category" addCustomCategory: "เพิ่มหมวดหมู่ที่กําหนดเอง" }, diff --git a/packages/survey-creator-core/src/presets/localization/traditional-chinese.ts b/packages/survey-creator-core/src/presets/localization/traditional-chinese.ts index cd3dd42720..61634e4911 100644 --- a/packages/survey-creator-core/src/presets/localization/traditional-chinese.ts +++ b/packages/survey-creator-core/src/presets/localization/traditional-chinese.ts @@ -26,11 +26,13 @@ export const zhTwStrings = { // [Auto-translated] "Visible tabs" items: "可見標籤", // [Auto-translated] "Hidden tabs" - unsortedItems: "隱藏標籤", + hiddenItems: "隱藏標籤", // [Auto-translated] "Default tab" defaultTab: "預設索引標籤", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "將項目從此欄拖曳到左側 - 它將顯示在「標籤」面板中。您還可以使用加號 (+) 和減號 (-) 按鈕移動項目。", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "將標籤拖曳到此處以顯示它們", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "將標籤拖曳到此處以隱藏它們", // [Auto-translated] "Name" name: "名字", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const zhTwStrings = { toolbox: "工具箱", // [Auto-translated] "Categories" categories: "類別", + // [Auto-translated] "No categories" + noCategoriesText: "無分類", + // [Auto-translated] "Drag items here to show them" + noItemsText: "將項目拖曳到此處以顯示它們", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "將項目拖曳到此處以隱藏它們", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "隱藏的工具箱項目", + hiddenItems: "隱藏的工具箱項目", // [Auto-translated] "Enable grouping" enableGrouping: "啟用分組", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const zhTwStrings = { addToToolbox: "新增至工具箱", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "刪除自訂項目", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "將項目從此欄拖到左側 - 它將顯示在“工具箱”面板中。您還可以使用加號 (+) 和減號 (-) 按鈕移動項目。", // [Auto-translated] "New Category" addCustomCategory: "新類別", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const zhTwStrings = { selectElement: "選取元素以自訂其在「性質格線」中可用的設定", // [Auto-translated] "Property Grid" propertyGrid: "屬性格線", + // [Auto-translated] "No categories" + noCategoriesText: "無分類", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "將屬性拖曳到此處以顯示它們", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "將屬性拖曳到此處以隱藏它們", // [Auto-translated] "Unsorted items" - unsortedItems: "未排序的項目", + hiddenItems: "未排序的項目", // [Auto-translated] "Name" categoryName: "名字", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const zhTwStrings = { titleField: "名", // [Auto-translated] "Helper Text" descriptionField: "輔助文字", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "將項目從此欄拖曳到左側 - 它將顯示在「標籤」面板中。您還可以使用加號 (+) 和減號 (-) 按鈕移動項目。", // [Auto-translated] "Add Custom Category" addCustomCategory: "新增自訂類別" }, diff --git a/packages/survey-creator-core/src/presets/localization/turkish.ts b/packages/survey-creator-core/src/presets/localization/turkish.ts index eeca8a9455..b3df90089d 100644 --- a/packages/survey-creator-core/src/presets/localization/turkish.ts +++ b/packages/survey-creator-core/src/presets/localization/turkish.ts @@ -26,11 +26,13 @@ export const trStrings = { // [Auto-translated] "Visible tabs" items: "Görünür sekmeler", // [Auto-translated] "Hidden tabs" - unsortedItems: "Gizli sekmeler", + hiddenItems: "Gizli sekmeler", // [Auto-translated] "Default tab" defaultTab: "Varsayılan sekme", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Bir öğeyi bu sütundan sola sürükleyin - Sekmeler panelinde görünür görünecektir. Artı (+) ve eksi (-) düğmelerini kullanarak öğeleri de taşıyabilirsiniz.", + // [Auto-translated] "Drag tabs here to show them" + noItemsText: "Sekmeleri göstermek için buraya sürükleyin", + // [Auto-translated] "Drag tabs here to hide them" + noHiddenItemsText: "Gizlemek için sekmeleri buraya sürükleyin", // [Auto-translated] "Name" name: "Ad", // [Auto-translated] "Title" @@ -49,8 +51,14 @@ export const trStrings = { toolbox: "Araç", // [Auto-translated] "Categories" categories: "Kategori", + // [Auto-translated] "No categories" + noCategoriesText: "Kategori yok", + // [Auto-translated] "Drag items here to show them" + noItemsText: "Öğeleri göstermek için buraya sürükleyin", + // [Auto-translated] "Drag items here to hide them" + noHiddenItemsText: "Öğeleri gizlemek için buraya sürükleyin", // [Auto-translated] "Hidden toolbox items" - unsortedItems: "Gizli araç kutusu öğeleri", + hiddenItems: "Gizli araç kutusu öğeleri", // [Auto-translated] "Enable grouping" enableGrouping: "Gruplandırmayı etkinleştir", // [Auto-translated] "Show category titles" @@ -75,8 +83,6 @@ export const trStrings = { addToToolbox: "Araç Kutusu'na ekle", // [Auto-translated] "Delete Custom Item" deleteCustomItem: "Özel Öğeyi Sil", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Toolbox panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Bir öğeyi bu sütundan sola sürükleyin - Araç Kutusu panelinde görünür görünecektir. Artı (+) ve eksi (-) düğmelerini kullanarak öğeleri de taşıyabilirsiniz.", // [Auto-translated] "New Category" addCustomCategory: "Yeni Kategori", // [Auto-translated] "New Item" @@ -101,8 +107,14 @@ export const trStrings = { selectElement: "Özellik Izgarası'nda bulunan ayarlarını özelleştirmek için bir öğe seçin", // [Auto-translated] "Property Grid" propertyGrid: "Özellik Izgarası", + // [Auto-translated] "No categories" + noCategoriesText: "Kategori yok", + // [Auto-translated] "Drag properties here to show them" + noItemsText: "Özellikleri göstermek için buraya sürükleyin", + // [Auto-translated] "Drag properties here to hide them" + noHiddenItemsText: "Özellikleri gizlemek için buraya sürükleyin", // [Auto-translated] "Unsorted items" - unsortedItems: "Sıralanmamış öğeler", + hiddenItems: "Sıralanmamış öğeler", // [Auto-translated] "Name" categoryName: "Ad", // [Auto-translated] "Title" @@ -115,8 +127,6 @@ export const trStrings = { titleField: "Başlık", // [Auto-translated] "Helper Text" descriptionField: "Yardımcı Metin", - // [Auto-translated] "Drag an item from this column to the left one - it will appear visible in the Tabs panel. You can also move items, using plus (+) and minus (-) buttons." - unsortedDescription: "Bir öğeyi bu sütundan sola sürükleyin - Sekmeler panelinde görünür görünecektir. Artı (+) ve eksi (-) düğmelerini kullanarak öğeleri de taşıyabilirsiniz.", // [Auto-translated] "Add Custom Category" addCustomCategory: "Özel Kategori Ekle" }, diff --git a/packages/survey-creator-core/src/presets/presets-editable-properties.ts b/packages/survey-creator-core/src/presets/presets-editable-properties.ts index 8da528d5d9..66762f96e0 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-properties.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-properties.ts @@ -269,6 +269,7 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare allowRowReorder: true, addRowButtonLocation: "top", allowAddRows: true, + noRowsText: getLocString("presets.propertyGrid.noCategoriesText"), addRowText: getLocString("presets.propertyGrid.addCustomCategory"), showHeader: false, columns: [ @@ -283,14 +284,15 @@ export class CreatorPresetEditablePropertyGrid extends CreatorPresetEditableCare { type: "dropdown", name: "iconName", title: getLocString("presets.propertyGrid.iconName"), itemComponent: "svc-presets-icon-item", "allowCustomChoices": true, choices: this.iconList, visible: false }, this.createItemsMatrixJSON({ name: this.nameInnerMatrix, + noRowsText: getLocString("presets.propertyGrid.noItemsText"), titleLocation: "hidden", }) ] }, this.createItemsMatrixJSON({ - title: getLocString("presets.propertyGrid.unsortedItems"), + title: getLocString("presets.propertyGrid.hiddenItems"), name: this.nameMatrix, - description: getLocString("presets.propertyGrid.unsortedDescription"), + noRowsText: getLocString("presets.propertyGrid.noHiddenItemsText"), descriptionLocation: "underInput", startWithNewLine: false, }) diff --git a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts index bd14d31cfc..10ffaa7fb4 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-tabs.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-tabs.ts @@ -46,13 +46,14 @@ export class CreatorPresetEditableTabs extends CreatorPresetEditableList { elements: [ this.createItemsMatrixJSON({ title: getLocString("presets.tabs.items"), + noRowsText: getLocString("presets.tabs.noItemsText"), name: this.nameItems }), this.createItemsMatrixJSON({ startWithNewLine: false, - title: getLocString("presets.tabs.unsortedItems"), + title: getLocString("presets.tabs.hiddenItems"), + noRowsText: getLocString("presets.tabs.noHiddenItemsText"), name: this.nameMatrix, - description: getLocString("presets.tabs.unsortedDescription"), descriptionLocation: "underInput", }), ] diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 367af514f9..16c8acda03 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -28,8 +28,6 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita rowCount: 0, allowAddRows: false, addRowButtonLocation: "top", - addRowText: "Add Custom Item", - "noRowsText": "There are no items", columns: [ { "name": "name", @@ -102,6 +100,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita allowRowReorder: true, allowAddRows: true, addRowButtonLocation: "top", + noRowsText: getLocString("presets.toolbox.noCategoriesText"), addRowText: getLocString("presets.toolbox.addCustomCategory"), showHeader: false, columns: [ @@ -118,6 +117,7 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita titleLocation: "hidden", allowAddRows: true, addRowButtonLocation: "bottom", + noRowsText: getLocString("presets.toolbox.noItemsText"), addRowText: getLocString("presets.toolbox.addNewItem"), valueName: "items" }, true) @@ -127,14 +127,15 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita name: this.nameItems, title: getLocString("presets.toolbox.toolbox"), addRowButtonLocation: "top", + noRowsText: getLocString("presets.toolbox.noItemsText"), addRowText: getLocString("presets.toolbox.addCustomItem"), startWithNewLine: false, visibleIf: this.getTextVisibleIf(this.nameCategoriesMode, "items"), }, true), this.createItemsMatrixJSON({ allowAddRows: true, - title: getLocString("presets.toolbox.unsortedItems"), - description: getLocString("presets.toolbox.unsortedDescription"), + title: getLocString("presets.toolbox.hiddenItems"), + noRowsText: getLocString("presets.toolbox.noHiddenItemsText"), descriptionLocation: "underInput", addRowButtonLocation: "bottom", addRowText: getLocString("presets.toolbox.addNewItem"), From ecd77eb9fb2cf0407cf3db46995204d38f35c2ea Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 17 Oct 2025 13:58:09 +0300 Subject: [PATCH 200/240] #7004 v-tests --- e2e/helper.ts | 14 +++++ packages/survey-creator-core/package.json | 2 +- packages/survey-creator-react/package.json | 1 + .../testCafe/presets.html | 55 +++++++++++++++++++ screenshotTests/helper.ts | 7 --- screenshotTests/presets.spec.ts | 55 +++++++++++++++++++ 6 files changed, 126 insertions(+), 8 deletions(-) create mode 100644 packages/survey-creator-react/testCafe/presets.html create mode 100644 screenshotTests/presets.spec.ts diff --git a/e2e/helper.ts b/e2e/helper.ts index 0b90b5cfa1..e865604881 100644 --- a/e2e/helper.ts +++ b/e2e/helper.ts @@ -2,6 +2,12 @@ import type { Locator, Page } from "@playwright/test"; import { expect, test as baseTest } from "@playwright/test"; export const url = "http://127.0.0.1:8080/testCafe/testcafe"; +export const urlByPage = "http://127.0.0.1:8080/testCafe/by-page"; +export const urlPreviewThemeSwitcher = "http://127.0.0.1:8080/testCafe/preview-theme-switcher"; +export const urlThemeForPreview = "http://127.0.0.1:8080/testCafe/theme-for-preview-option"; +export const urlDropdownCollapseView = "http://127.0.0.1:8080/testCafe/dropdown-collapse-view"; +export const urlLocalized_de = "http://127.0.0.1:8080/testCafe/testcafe_localized_ui"; +export const urlPresets = "http://127.0.0.1:8080/testCafe/presets"; export async function compareScreenshot(page: Page, elementSelector: string | Locator | undefined, screenshotName: string, elementIndex = 0) { let currentElement = elementSelector; @@ -55,4 +61,12 @@ export async function doDragDrop({ page, element, target, options }: { page: Pag await page.mouse.up(); } +export async function showCreatorSettings(page) { + await page.locator(".svc-sidebar-tabs__bottom-container .svc-menu-action__button").click(); +} +export async function showPresets(page) { + await showCreatorSettings(page); + await page.locator(".sps-launch__card").click(); +} + export { expect }; \ No newline at end of file diff --git a/packages/survey-creator-core/package.json b/packages/survey-creator-core/package.json index 5a16cebc9d..a1f0705b62 100644 --- a/packages/survey-creator-core/package.json +++ b/packages/survey-creator-core/package.json @@ -11,7 +11,7 @@ "build": "webpack --env buildType=dev --env emitDeclarations --env emitStyles --env emitNonSourceFiles && webpack --env buildType=prod --env emitStyles && rollup -c", "build:i18n": "webpack --config ./webpack.i18n.js --env buildType=dev && webpack --config ./webpack.i18n.js --env buildType=prod && rollup -c rollup.i18n.config.js", "build:themes": "node creator-themes-import.js && webpack --config ./webpack.themes.config.js --env buildType=dev --env emitDeclarations && webpack --config ./webpack.themes.config.js --env buildType=prod && rollup -c rollup.themes.config.js", - "build:all": "npm run build && npm run build:i18n && npm run build:themes && npm run build:presets", + "build:all": "npm run build && npm run build:i18n && npm run build:themes && npm run build:presets && npm run build:i18n:presets", "build:presets": "webpack --config ./webpack.presets.config.js --env buildType=dev --env emitDeclarations && webpack --config ./webpack.presets.config.js --env buildType=prod && rollup -c rollup.presets.config.js --bundleConfigAsCjs", "build:i18n:presets": "webpack --config ./webpack.i18n.presets.js --env buildType=dev --env emitDeclarations && webpack --config ./webpack.i18n.presets.js --env buildType=prod && rollup -c rollup.i18n.presets.config.js --bundleConfigAsCjs", "watch:presets": "webpack --config ./webpack.presets.config.js --watch --env buildType=dev --env emitDeclarations && webpack --config ./webpack.presets.config.js --env buildType=prod && rollup -c rollup.presets.config.js --bundleConfigAsCjs", diff --git a/packages/survey-creator-react/package.json b/packages/survey-creator-react/package.json index 23105f0e52..70022b2e87 100644 --- a/packages/survey-creator-react/package.json +++ b/packages/survey-creator-react/package.json @@ -32,6 +32,7 @@ "remove-package-lock": "rimraf package-lock.json", "build": "webpack --env buildType=dev --env emitDeclarations --env emitNonSourceFiles && webpack --env buildType=prod && rollup -c", "build:presets": "webpack --config ./webpack.presets.config.js --env buildType=dev --env emitDeclarations && webpack --config ./webpack.presets.config.js --env buildType=prod", + "build:all": "npm run build && npm run build:presets", "watch:dev": "concurrently \"webpack --env buildType=dev --watch --env emitDeclarations --env emitStyles\" \"rollup -c -w\" ", "watch:prod": "webpack --env buildType=prod --watch", "lint": "eslint . --max-warnings=0", diff --git a/packages/survey-creator-react/testCafe/presets.html b/packages/survey-creator-react/testCafe/presets.html new file mode 100644 index 0000000000..6f29a5977d --- /dev/null +++ b/packages/survey-creator-react/testCafe/presets.html @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/screenshotTests/helper.ts b/screenshotTests/helper.ts index 1cb5bb2681..ae6430d78f 100644 --- a/screenshotTests/helper.ts +++ b/screenshotTests/helper.ts @@ -2,13 +2,6 @@ import { Locator, Page } from "playwright/test"; export * from "../e2e/helper"; -export const url = "http://127.0.0.1:8080/testCafe/testcafe"; -export const urlByPage = "http://127.0.0.1:8080/testCafe/by-page"; -export const urlPreviewThemeSwitcher = "http://127.0.0.1:8080/testCafe/preview-theme-switcher"; -export const urlThemeForPreview = "http://127.0.0.1:8080/testCafe/theme-for-preview-option"; -export const urlDropdownCollapseView = "http://127.0.0.1:8080/testCafe/dropdown-collapse-view"; -export const urlLocalized_de = "http://127.0.0.1:8080/testCafe/testcafe_localized_ui"; - export const base64image = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFBQIAX8jx0gAAAABJRU5ErkJggg=="; diff --git a/screenshotTests/presets.spec.ts b/screenshotTests/presets.spec.ts new file mode 100644 index 0000000000..8a4a93c65d --- /dev/null +++ b/screenshotTests/presets.spec.ts @@ -0,0 +1,55 @@ +import { urlPresets, compareScreenshot, test, expect, changeToolboxSearchEnabled, changeToolboxScrolling, showCreatorSettings, showPresets } from "./helper"; + +const title = "Presets"; + +test.describe(title, () => { + test.beforeEach(async ({ page }) => { + await page.waitForLoadState("networkidle"); + await page.goto(`${urlPresets}`); + }); + + test("Check presets launch button", async ({ page }) => { + await changeToolboxScrolling(page, false); + await changeToolboxSearchEnabled(page, false); + await page.setViewportSize({ width: 1120, height: 900 }); + await showCreatorSettings(page); + const root = page.locator(".svc-side-bar__container-content").nth(0); + await compareScreenshot(page, root, "presets-launch-button.png"); + }); +}); + +test.describe(title, () => { + test.beforeEach(async ({ page }) => { + await page.waitForLoadState("networkidle"); + await page.goto(`${urlPresets}`); + await changeToolboxScrolling(page, false); + await changeToolboxSearchEnabled(page, false); + await page.setViewportSize({ width: 1440, height: 1440 }); + await showPresets(page); + }); + + test("Check presets menu", async ({ page }) => { + await page.locator(".sps-list__item").nth(2).hover(); + await compareScreenshot(page, page.locator(".sps-list__container"), "presets-menu.png"); + await compareScreenshot(page, page.locator(".svc-sidebar-tabs"), "presets-menu-position.png"); + }); + + test("Presets pages overview", async ({ page }) => { + page.locator(".svc-menu-action__button").click(); + expect(page.locator(".sps-list__container").getByText("Languages")).not.toBeVisible(); + expect(page.locator(".sps-page__title").getByText("Languages")).toBeVisible(); + await compareScreenshot(page, page.locator(".sps-page"), "presets-languages.png"); + + await page.locator(".sps-panel--navigation").getByText("Next").click(); + expect(page.locator(".sps-page__title").getByText("Tabs")).toBeVisible(); + await compareScreenshot(page, page.locator(".sps-page"), "presets-tabs.png"); + + await page.locator(".sps-panel--navigation").getByText("Next").click(); + expect(page.locator(".sps-page__title").getByText("Toolbox")).toBeVisible(); + await compareScreenshot(page, page.locator(".sps-page"), "presets-toolbox.png"); + + await page.locator(".sps-panel--navigation").getByText("Next").click(); + expect(page.locator(".sps-page__title").getByText("Property Grid")).toBeVisible(); + await compareScreenshot(page, page.locator(".sps-page"), "presets-property-grid.png"); + }); +}); From 819304a3a503eb719125ee733361924491da10fe Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 17 Oct 2025 17:38:54 +0300 Subject: [PATCH 201/240] #7004 - more visial tests --- screenshotTests/presets.spec.ts | 59 +++++++++++++++++- .../categories-text-click.png | Bin 0 -> 17319 bytes .../presets-categories-button-hover.png | Bin 0 -> 16868 bytes .../presets-categories-expanded-hovered.png | Bin 0 -> 42449 bytes .../presets-categories-expanded-subitems.png | Bin 0 -> 48311 bytes .../presets-categories-expanded.png | Bin 0 -> 42172 bytes .../presets-categories-hover.png | Bin 0 -> 16698 bytes .../presets-categories-new-hover.png | Bin 0 -> 14888 bytes .../presets-categories-text-hover.png | Bin 0 -> 17236 bytes .../presets-categories.png | Bin 0 -> 14520 bytes .../presets-context-menu.png | Bin 0 -> 52057 bytes .../presets-items-button-hover.png | Bin 0 -> 13287 bytes .../presets-items-hover.png | Bin 0 -> 13183 bytes .../presets-items-text-click.png | Bin 0 -> 13725 bytes .../presets-items-text-hover.png | Bin 0 -> 13648 bytes .../presets-items.png | Bin 0 -> 11094 bytes .../presets-languages.png | Bin 0 -> 102374 bytes .../presets-launch-button.png | Bin 0 -> 28795 bytes .../presets-menu-position.png | Bin 0 -> 5988 bytes .../presets-menu.png | Bin 0 -> 17754 bytes .../presets-property-grid.png | Bin 0 -> 64130 bytes .../presets-tabs.png | Bin 0 -> 45222 bytes .../presets-toolbox.png | Bin 0 -> 51734 bytes 23 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 screenshotTests/presets.spec.ts-snapshots/categories-text-click.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-categories-button-hover.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-categories-expanded-hovered.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-categories-expanded-subitems.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-categories-expanded.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-categories-hover.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-categories-new-hover.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-categories-text-hover.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-categories.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-context-menu.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-items-button-hover.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-items-hover.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-items-text-click.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-items-text-hover.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-items.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-languages.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-launch-button.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-menu-position.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-menu.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-property-grid.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-tabs.png create mode 100644 screenshotTests/presets.spec.ts-snapshots/presets-toolbox.png diff --git a/screenshotTests/presets.spec.ts b/screenshotTests/presets.spec.ts index 8a4a93c65d..de02c8968f 100644 --- a/screenshotTests/presets.spec.ts +++ b/screenshotTests/presets.spec.ts @@ -35,8 +35,8 @@ test.describe(title, () => { }); test("Presets pages overview", async ({ page }) => { - page.locator(".svc-menu-action__button").click(); - expect(page.locator(".sps-list__container").getByText("Languages")).not.toBeVisible(); + page.locator(".sps-menu-floating-action").click(); + expect(page.locator(".sps-list__container")).not.toBeVisible(); expect(page.locator(".sps-page__title").getByText("Languages")).toBeVisible(); await compareScreenshot(page, page.locator(".sps-page"), "presets-languages.png"); @@ -52,4 +52,59 @@ test.describe(title, () => { expect(page.locator(".sps-page__title").getByText("Property Grid")).toBeVisible(); await compareScreenshot(page, page.locator(".sps-page"), "presets-property-grid.png"); }); + + test("Presets Items", async ({ page }) => { + page.locator(".sps-list__container").getByText("Tabs").click(); + expect(page.locator(".sps-page__title").getByText("Tabs")).toBeVisible(); + + const root = page.locator(".sps-question--matrixdynamic").first(); + await compareScreenshot(page, root, "presets-items.png"); + page.locator(".sd-table__cell--drag").first().hover(); + await compareScreenshot(page, root, "presets-items-hover.png"); + page.locator(".sps-table__row").first().locator(".sps-input").hover(); + await compareScreenshot(page, root, "presets-items-text-hover.png"); + page.locator(".sps-table__row").first().locator(".sps-action-button").last().hover(); + await compareScreenshot(page, root, "presets-items-button-hover.png"); + page.locator(".sps-table__row").first().locator(".sps-input").click(); + await compareScreenshot(page, root, "presets-items-text-click.png"); + }); + + test("Presets Categories", async ({ page }) => { + page.locator(".sps-list__container").getByText("Toolbox").click(); + expect(page.locator(".sps-page__title").getByText("Toolbox")).toBeVisible(); + + const root = page.locator(".sps-question--matrixdynamic").first(); + await compareScreenshot(page, root, "presets-categories.png"); + + page.locator(".sps-matrixdynamic__add-btn--icon").hover(); + await compareScreenshot(page, root, "presets-categories-new-hover.png"); + + page.locator(".sd-table__cell--drag").first().hover(); + await compareScreenshot(page, root, "presets-categories-hover.png"); + page.locator(".sps-table__row").first().locator(".sps-input").hover(); + await compareScreenshot(page, root, "presets-categories-text-hover.png"); + page.locator(".sps-table__row").first().locator(".sps-action-button").last().hover(); + await compareScreenshot(page, root, "presets-categories-button-hover.png"); + page.locator(".sps-table__row").first().locator(".sps-input").click(); + await compareScreenshot(page, root, "categories-text-click.png"); + + page.locator(".sps-table__row").first().getByTitle("Expand").click(); + await compareScreenshot(page, root, "presets-categories-expanded.png"); + page.locator(".sps-table__row--detail").first().locator(".sps-table__row").nth(1).hover(); + await compareScreenshot(page, root, "presets-categories-expanded-hovered.png"); + page.locator(".sps-table__row--detail").first().locator(".sps-table__row").nth(1).getByTitle("Expand").click(); + await compareScreenshot(page, root, "presets-categories-expanded-subitems.png"); + }); + + test("Presets Context Menu", async ({ page }) => { + page.locator(".sps-list__container").getByText("Toolbox").click(); + expect(page.locator(".sps-page__title").getByText("Toolbox")).toBeVisible(); + + const root = page.locator(".sps-panel").first(); + + page.locator(".sps-table__row").first().getByTitle("Expand").click(); + page.locator(".sps-table__row").first().getByTitle("More").click(); + page.getByText("Move to category...").hover(); + await compareScreenshot(page, root, "presets-context-menu.png"); + }); }); diff --git a/screenshotTests/presets.spec.ts-snapshots/categories-text-click.png b/screenshotTests/presets.spec.ts-snapshots/categories-text-click.png new file mode 100644 index 0000000000000000000000000000000000000000..82403bc549d1ba5da4f1de9b0f404254334752cf GIT binary patch literal 17319 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

A5-hs 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%0AS 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

5n*3zG$`JU)I59wRKL225LQKVd-Svj>unsR~w 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 AXaE2J literal 0 HcmV?d00001 diff --git a/screenshotTests/presets.spec.ts-snapshots/presets-categories-expanded.png b/screenshotTests/presets.spec.ts-snapshots/presets-categories-expanded.png new file mode 100644 index 0000000000000000000000000000000000000000..bb3ffa300d59266b0d799c06eef6b0ffde12932b GIT binary patch literal 42172 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�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 literal 0 HcmV?d00001 diff --git a/screenshotTests/presets.spec.ts-snapshots/presets-context-menu.png b/screenshotTests/presets.spec.ts-snapshots/presets-context-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..1365ca6e6e16a4f76320be0fcfc6f0a1fe6146ab GIT binary patch literal 52057 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 E0M5NwLI3~& literal 0 HcmV?d00001 diff --git a/screenshotTests/presets.spec.ts-snapshots/presets-items-hover.png b/screenshotTests/presets.spec.ts-snapshots/presets-items-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..2072930515356374c541612a4330a6cadb9e54c1 GIT binary patch literal 13183 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 literal 0 HcmV?d00001 diff --git a/screenshotTests/presets.spec.ts-snapshots/presets-items-text-hover.png b/screenshotTests/presets.spec.ts-snapshots/presets-items-text-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..1042e4619313f4ea4ccaf138561f2989c50bee4d GIT binary patch literal 13648 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

Eb-n^kVF+^sWgh>-c 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 Dq&W&` literal 0 HcmV?d00001 diff --git a/screenshotTests/presets.spec.ts-snapshots/presets-menu.png b/screenshotTests/presets.spec.ts-snapshots/presets-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..5aad43f2aa27c171e1f23966573c6c8b04f1bb71 GIT binary patch literal 17754 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 UJSY$BSpZ!(xp}qH$nDX80r&#A2mk;8 literal 0 HcmV?d00001 diff --git a/screenshotTests/presets.spec.ts-snapshots/presets-tabs.png b/screenshotTests/presets.spec.ts-snapshots/presets-tabs.png new file mode 100644 index 0000000000000000000000000000000000000000..bd006846505fa2b33a81e945be926fbedb2fa3e9 GIT binary patch literal 45222 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�~uova?^9+gLFC+Y+q z$vL&xrXSLz*J=kmcqV0QbgZu~uPL|7GJ$~!+AgS-)UXHx$H9D_caF(*OMj9p47F$u z*RLX?f(rNp5J2-8`L0V@F)@oJ{liN^hJ$?nSjN`;Te`mzPiog=`&)Rh1@*UGz z*p!m5?qzkYi}d1vs0+^BA^rGR{{FpL&*gj>I4k9)TQ%>tVD_IaOdlVMktZl9{!i{u z`X9QrxYW^KZgq8;K@k26?LoRY*^-i!q$FX_XfmTJ?5|w85|zuF@s?U#G zNqTy<4Gj%HfBwOGVLWuAQ}}RE2hoL23>3n#g)yVD#G{Eu_qD+D{Qw^y9|eV1m1L-I z{_RAWVYT`BB17v*m%x!9F^ELKumzqh9BoX9&H3n*>X$n;EQA$0u}}!tJ&PVCCop75 zWqqHH(hQkkshJtXAijJ9xRg-)~-!X<@i8r$15)g@=yaV(Mt zmAA<<1mFMLR*yI`Q*E8m#78muEB&z?)Px__qDambzNR<~CdX|i$ycvl1poj?XY~A_ z(qhzAirAt``Lcl(JG4Z;=hjrLi2(Vz{Lra#<9a6+xv1+dM4QPQK>YTMe)(6UT03}Z zGC4W^bD_o#UZPj}SjppBgNCqKC^`Fb<;u`{5Si$P?iwew#N(f7JxjKmVHB@J?DKCB zCp2YO*0N!^DP!g$3GxGk3yqy&BC@1yO|iv)M-XXNi%g9hV!YO5V6< zi5ui8b@V+7oAJ31 z-ze{)m*eu^)ZA zO}csKj>EbU`H~CAjXQUmU4j|AC`_u!OP6j2(JI>h=cRvWzo|A}G3j7>B3C+l*<9!X zwwWqRD=AS&-=eVLqGHWad;6BD>9XU}MEvB8a-M1GA$9G)C9d;Kum3-{DK_3^uQ`Ot zSm|^gO{y9C`Q~c~WdN?X9*=~TU87J~&fe`&PF0`qGVLE%YFm3k-m)f>1sWuSO;O;P z{0hj_zFQ$xU0%jRb$^w+9znpB`V4sJg!;}ChOayEkrf*>EABNu@%-z$a9cD&Ti@Z;ED}!I|4SvSs0R0xR_$;i$jrZj`j9z6OUS2ht

?ha|r+A?u|F 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 bBnzS&IF@>T-{)l;z2s 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

A_{wzRD|4BQt z)^#Ka9r;spK4^UUv#|JnEzO_w?#CLtP_%&2*8-mkyV*PKTEC}V3{#nf)0Ckb9e(8u z_GMU%?&);n<~>v{jXN2eU}~lNWIpQbD(#zw)_KyBU%_Z171Lu%4@+r=tXnErTK;ed zDdW>6REfe-;qftprH=ePGZC#BxUljQr;7wSzK~H?Tar^qSN)Ma4ttGd@xpMJ&f7=v zHh%ujc6%w86-%ZJA{X?E;j@={#xJ$h#SLz{SKS zbV*qd_V{oZT9Yv*w(vV_ltM;s_xskPLlvVRfs5W&S5~jGh0^}$NO}xoAluX0#?)t_ zxPbHNFm*$`~Z0DUaIJCLsUq4 zB%}RQ$lkWxKz*C8fys7$JTM?J5`t+H+%iR(e`Wk-(0<-wg2_qE@fy@$(Zu4oHo4ue zLjWsdv$?Mg&wJjpQ1x}YW~PmdCLcGzp&HN#NRa7cnQ)uwElfvjDsiyfEK{U zOL89i0lh9BOv*D1)XR@T8F@v)gT792ZArMFY!D5fqSU%gimgC{!!?&kyDZpsMqoG) z<=(>o=%B2o9Qi*1q7qP%k3|L`mhia2=;Y!nBx3x|ig&Dx_-s5;qay>;v*GhE_sVy_ z%74@c+i!jGdz36ce{^st$u6 zVauz6@cvSn4 zPd&d+rSg#y;01gch>6rNR`-Qys0Mrya#DHQu84i-Xv;WQ36MY5b&O;oeYpBOBG>*E zWQ3Z>vIf-QL zOLC4s!Y5?LC$=Ib;LJVGAz^{5na_~bawnPH9UCEA z%wi40K8;7i8$`;W@V;Hz&+Jx`x?Ex%tOVNHPAk7ow>(aj;UsFUavi?2ke}FTQu>kq zr`8Cw<L&cRPmw1Zi)PkO|#4={^(Hax$LUD_R zYcDepHp zqrN9>miPPrG#ffew>=06u0EA=Qu z8$ULTwZSgT>7lXM#uaG6Bf~U_hrPrBhm=IE6JphGeht&3btke#rmHT~GeP*=gwK!A z67^J7WshIf^i-+WnMv79W|%V8GU*jJMn&7VuC{r!bP%YPrdrELFr99GoNO0LcNfDhc zPm!g+4zs5VaMN1Hk}k|umr<$m`ngu8XR}yk4;s~wg9$4n*t3-;>JPr1TQ*u|o>Ys`0} zR9ZVe3J)A_Kn}>IW3xJP2yg6=NJyiK8FA8>Zm&-?xr6Xp?&D$&ROBl%+EmyWz)@ue zoS$Qn35+_m#(T7}Rx@OWyB(~SCXSgI+kAUU5jg_!^M{NO5dAt&aKPizVwaP$vikWa zVhh`;>hkpaFhteX@A6nuJA5s9_4OkUqtaEGp&Yf)Zo4ggG17nwyKs%sajPj4w8OXX z5&l)TD7v<-cwu+*lt4)Cs;N^9hhRJ&nJ#Zbi+g6jxT&5A#22dYy;5ivDG*3H6ZOmC z2w(sCrRihaTugSeNl9x7&y%dJD0k+UtSFxm(7t=4UHRXKq&dagw{HpLkM8!v8i&+N z~t0&|LGVrwn?SJ?NdnZ5+aRny1Mv}49ET10Yuz9!hI2AH2_C?fTFHt<34G)<-T4T85 ziWI1fEv-C4zs|=`XN-JZWcwT6yr$~X2}7-g<```0ceA|pj8B&qC}ZZl8lR-o=;l0_ zU|3IJ)^L|Ks`;lPR0{)Wu(4Px|2}y>eX*Qx{bL08#eeiMd<6U&kF0=2Z-lfhx1HJ* z}~H^#&L*-c?|&o^0yzV;aX| zT{BfY`_J-*8BZRSPYrV{t;5z&O4`WQ`hB3NCrV@FU7IT#*2KDD8|QoYK70rEBNHQ& zt{4%P;HLcgtQAYr@)s^TdNb!@xwiv|fg!GkkJc8>TQR!7DJAZL)BFD42*3|8!OU+@ zb>qjE1Z`_}kd14fiuKpXFKLG`4lG-Qv=lrj(*!z&G7eonxSyNRP_6hfZ%&t;cy)+-BVm0eWKmL@u|0n*q? z+$GX9hEzTV*urtgE9M6TRq=k#mysDF{lWK!>}WmLdvcyKf9u|D^u8WNA~4iEG<^1M z|BlUXZf&`Hw2n;}d{34Jtv|_NtG1aPN;&JrlcXwLIo$mH9DJHS*k)Cw+&WNCYzRZq zF-HqKu`Tlm<$$+G_*0TcgZ_8)!hVy;p0KiHG!hWaMW;1k$Sg z1pNe4#?#}m&SQ&bTdm!S?nfLxet!0MllgL~2@$9WtI?Y~JNGv?)lP8NEpp%Y>7IP_ z92XbY#KeRzy-cU+ikX@5x4_bb{R@FNnmkJ$e^)!w`CWbPk8~56bp!+&KXgCG>6zQi zS6iH4OezRJUQ99$!cO3HE@$;ZLqam#^L2vINi#h5ixMKxe}Sy}on)Z1i3!UI(s_&w zHXZ)~AjIMA4K!*!ua7-ibaTe*8=Q?bYV-VFnzv|L7lkd<*_}U}EH%0Is{QjXD~x0t z-C)=7+jUNi2&HO+xmuc~2__4kZf-oh1{T0)e)Pt~#>NH(y&bHbwX9(xMg7b${c{`vyws>SA_7VTuZ57J)*C^}@8TrdgE;mUP~*&AK1?!u!bR+%{LIYbRXz<|%?aCdV`96DR)^Z}tXbYr6QEe2U!!m`hC!w!im z%2MyK0w6 zKgQ@2Y{Blje48Ksyd68tWNyW$srS6?-&+FwCQ6%JFLfH7>}7SH35+Q+F2tx0px~KU=MVogmqrW3ArzTsHGOznGt!n~OZp-Ab#s zSU^_Zs~6_DB+<5n@7`p6-TfZ&{QOrpa=;hA7w|Md-j7R-zE7@ZW@c|yp3x};rjfb1 zTbOrA!i&%7(sgby*FXc3ub9tIs(Atp%6TZhM;lErkzxGH4SW!(wwMguxlM?8`3v+7 z9^I#*vG-l`x$>|0_9OD|(SCS8pA7&6gqs|Z|Fyu*|B;7y+ACMbW@@h#iK+D@2LwJX zh%jpvG`e$Rlu+Hz3F?-=n)+&1HG5Fqc~oGP66-VkkRGH)))4J|J(oGrmLwRdL3}j_@dz z{o%@M+uJajHH}x+N%7x%VbogkfsZFR*5lj6m`(oM(h}Y9!BI8bgK>8Ap#jarl{+$X z^iksRVZT_9W}LsvwV~T0>Vb8H_u_Lias^REmGf z)VC#Zd=n8y#4pr&JzG+Gf{4CgdP{g9%8-Ng(MfjdkH`}JSz8*`U1FFXF{InMJ;WKa z%*l9!R$?Iddt0s zBZxS-70=JY{*}v zG6^{++Zf2xc&pET8d0O9+j*?gS3HEy`}8N}7BH@ki>55i3%^Ug!llRsEtzmS72JiH zX}etQe4by_3Ixt_iJ>Q@dsSWEKP@)zO-kNTT#Y_%r`C+uuuygiw@q99`Ex32lFQp{ zI5EcEnV*)}$}41P{N3s{&&EhtNJ#{!V*hueFCds`E;mn$+wRUuJgTa3u_1mK84=;T z>G(b^wkF7a_k1g{?{>-8qy)Ypq+Gk1qOQ3Hq;=stKYVCkS`^11W!|g?f(2{qb34dDW9LFS+1uy4|s-1Sm#IS+?oH9EP5dH~*Eg3j~ku zj|uV}_qhs>jlFMlmXYi7_o`l9dLL-sHHPe1^1PHsLVG=(4uX^=z}meLB`_8ZKI>|X zXuyUxVl>T0Zs14rL!`;4A5%Wvva=`ZAEXp7Z zQru{jhT&Zq2rv@!2P{b%uMwU4Jt=K!tVjeG= z(J%Iu9U>saV9~(a_ZB$r^F7epvRA4Pf}ITl248M=ii2P+>M(e?L5xaan4Hr`NVZ?x z#{)yTl8G#6iW2+I)d&#S@#sO!V3<4F_8ItQ!?wk*tBY247rRA(LQiX4-vq8QsN9Am z4BP-QLMuhb!d4-6(R;$2_O$j(;VG$j(w+ki+b3+~gw&9M6AsnTIB=iyZkKEK+d7Nj zH?m;yN<@TV>&=mQ$U|PQBrP>}GbG?3o=NK@E)jdYTW+#o>dwq>ZY5o3ft&Rrg^f`= zT&L(K$HF|^QvT1m0AQ+1E=x}5Oa_RlOKF13fq0znK}1%xCK&#n)h28{8oL%bj@9%E z4A-Jo$AX{W5xZ1})~nOgXw(x>DnWkteo5N_YqVfG| zJUDGn=8HzeTYrKj8EfL$6PAiJNJJfvh%lY^Ka_8!_}VP2m)7-9Pshvqv_7mcPltU6 zcd?^S+hzx8o@Lk{3DR+G%#YHxrJNQ+xQx1Ur!_FJ;g&|VL!@it)&f5mjGn9ZNZzf- z@3l&#_*qiV3~)O5Ln-^AdIO~3kVr1YFS{wQ3bI4(HpzHcQ=8QD<#CSz>mD6V!pD(2 z$7f|ib~_})+v@T@o_0tN?2n3|3D!ILkbM>w<~2FmydEU0Ro8kq{}nLYQSD`khf(}w zdTGgcg$7UD{zSa(gS=@Z%w0qZ~*g^#3$|u08 z*HrZ`H{X&{8jrgY`>x*G)SC!Bi_ztgIA6H3m*3A)8Mo0KLV&0lWoj_wtS?Kc6A;~Q zASJJ6Yt0Vxyt?4cEbEnvVURFUjFJSyG4i%2 zQPVjd+i4(HR3bMUG)+ir{u*BziQR7E#*_0*m?^~exozEE!ksN^GdddD4Q$DINmX$ zrjTB@Mmjba9)!f(?{Eh8l=Y0f65@}&=r50$ML(ARY`9Q&`S&POP6S+Q~mlp^J=cx&?Nc;zau0&gC1K_2ymO zzdaL0L^SE@?|rPTTR4L`>p-u^D$framuHFL~to z+380}{P54S`!4hT-)S-J)Zl+74Xk33rR%iELrP2GV1NSJewn30bQ4tXl z5D<6(0qN4EtAHp-@4ZRyy$2QPO?oHv&;rtXQ6NYSz4sP+=p{fhJDzi9zV|!x&b%|f zcjmkQQRB|uciZ>6*0rv+a!1n54G2YTkC!+swi1b*3_ zb`VLFD!q6}BYLqMObh%`FPFr58Z0U*ngdirv70%$M1V0nh8W;}tnBQ&yWZIT&ehMc z*!!K&d#u7Dn|8{Ydi(kU0s?eJ?Akx$0-nEGky^CaS@OKSgJg%aY777N6*<+;;G+IP z^UReOIgN(P%v(A)mSMeooXJFyE@*=b0vIx;e_)_x*W@W{ zg7wY>6ru=LP*ilV*{NNJo2j|IPOwv}5z2dTiJXOeLW8P!Y?`Jl@&4lm4Pki#-XD^M~^FG9Bl<9eG z^rr~$Atju8mHK`mc%$8odVqk2@5cJ$f&LtL;>U=C(-UkXq!M(|j>Y72xg_qgGzi@O zGoRM>Bz0&Muynv=d2ggxaEe!hZcyQ?i6I}8UoK}Se=-2leMmBKt7KxTb&r8dbmB+y$V;hi%CmEG;QS5h5Ckk8mRS772XM_YdI3s6t zb6YLePV@(QB`R!C9bX7}N%8NTQav3*7P-~Jd?>aSs{%{zL#*gEHH5;*I_L70eTaN_ zN=BwVtR4#pVARrQM|uItvV!_j-zkn9ztEb z=7+5#+UOA<^Q{W&*@|s5Nhv97L2**yo<|kgrQ693qHJTy*9Rv#D3gy4k;!_G>qlIx zXWXlI_lEq(&`u|bEBveD^d^1JxE*s?_+0$+x6*n?N|j8V-ygp|Jw->w^FY#Nt>C*@i&}5Q$$b1rSYe z{bh(bo~f}(1LqD~M$y#g4l zvVp-bL?tagQnTKP%U|d1OKR1j6!qVWP*My8K3BDfcCpuKXwi_0O5Cr!#8{aWj!1S& zQt-N^PgIxu0L^~~5~^4k$jl%?MG3O`D%7csAdpf|Ngp9$Wv%Z=e9@k`=+ZbW_`x7d}m{0qd>Z+Lc5$C ztZ$=;fGZts!TU75CHUQ$<W!p#E_hM?n)(SP37Iu3JCu}I z_k*(CW`ObhjP9w|lldnqHa1>gx^jb5ApW*es`vM(9<$~fQa64IP+!jil!O?~?U*~dnF9LS&c80;v?GBzmawt5 zPDQ4?H2#$-=5w|?ojVFtFVMe%1L5KUc*V3WYeF&gJfL%GG>ItnLqp4@tI;z-^JG;; zhuK9aNOl2P$XIB|i(fPkN;p_+LgV*)&wcr7>nzkhDt&lUq?#VY6KA3H86lnFd8!m% zQ9N$;Xy+MhfZ#FBv!`kpDUA_;eXU7mH%X;k&`N-L^m4}dhlF_I2eZnjiL-i)g^mdw zB|+={5~s{1Bd*XXe%`L>7fSS|NYwv}6nyHN(rkBAu~c5Iqfe1A9hyh(PeCk4Nd0)Z zVH?2b)|i@S{a)?}R?HNocs$bT5Af4)&sS94xjVW6iEn#AvJwx?>f zMj#e7W~0<+C&Xv0p_GQuZ=9&@>*6Sm&?m&vS%PQ*)duf8f5pf~1l}=Rv_C>A9p`(g zJc~^wxIQCW-|1swuVo$zdiuxQ_RW>PXt1tce6Fa4Db#(t|Jwp0DA^WD6z~BK+{X&U zW~RP3V?t3o;#xZ6URuewv$Yg-`K6UEJB*>}ep+D5OpZR8w4)J01f9zV{P>9U@X%Qoc=$JJOMk&tdM>YEODJZpTR=w zcLg1at=UNFL&8qt?;j|9tI9z+X~mtE%uv7FNG z6;eMQKH^oNdBa-?^Rff)VwUFI^3@TP>^f~lg&I=SkJuA)a#({^)1!(rxD@qAPv#Oe ziE5rrSIn>*3TsYGHu1m{%-H(N8|NqM0?(O(KYB4#`??>k zJWlJ_a-EVTkM^k%wMEA-$$_57n8JkI`~B+pEUypb1|+dIb?CRV;7KYdN;y~BF!EB;bTXP}_u{mjxE@-A8<|L!N@o4sX>U)+r-5bB4NL{N~ z82?Mx^I#!s>JA#)2bw>*JE&`FKM!S*jYNfnypS~HVm06$uRDQu2mf_?@7^}=r~U}) zcf`c-Z~1H_AiZZ!(O^^=e!;$vN-_lphuBqiwD$cwbsQZU-?X-T9PY z=Y72*(?3Wq?42`Z`z9K8R^K0rUF+?eK})^`F9c&jjN4~qo5VJ9kvp8tcCl4VT)fo+ zs0QG^TaRqL(h)@*!zE~ioYyedaLg`XFM)^=^+@?_1(cfNu=OnRTqVc*IxQsR+Vdb1 z!UTF&y}udzn@vw`=tKi-T+p!L)}b5z9f$K1Pm1t%IW0~-d0fxhwnOq~T}Q|;2Qh`X z?*$M&fu{=rhZiiG)=*9DWT(7sf)<64z@&h|m?_ifz@Q*B`n-*coxRz(DlvouFrGh> z3>51X_q?JU`hn!2t}RCctGIk!9-Cko5#66yj@>$_T+thVg3-@}j*j}cEX>Wz4BHH{ zmF57r2aFC{TrBK!W(&l;3KYTU8JqHXV6$iFTQQ>q*Y{K^om#k^^**c6xhZtlcaN~ka@8GiL`9p4CCYOR%Ku&T}=v4`{>3FgFF#^8W;9_BB zwmzIIFgQh?4M#ySJhc+~*vQzybVrxTud44|d5uQ;`As@YA{7f5c!N$vgkJUH?G# z96#**y|%4YsT5o*z9PmK;N1`laBx&!tv%f165afRNmX$#>$3q{qQzACv=(UxoxSlRg$qoiXBzA=Y+$Uy+ZxW z7xFq4fk_V?jc*}( zIuT8FJv4?+qyU~c9-5IDbCR0BQ;=-9D1|GizitkXdIH@%&V>OD{oFKhI31*e{ZY#QHO!41jx1)Tby;^>w`@AAw^=c^YYGOhO zQ|c?{=*TVi&gqZj?3Q;3^Uu=Kr>|8Y&}pQZJvub#Mn+S{TLSEFAeJB1I0Mr?^Rs-@ zBTb6)S{Lj7?Z2lMmfB3Kr1m(siJ67}ZAi$4 z;!U;l{QH;~8{6(;yKZ*{pbkcDKQSJ2>RaA(&D7Q+_JRBSOu^4>Z8@B34D4K@s8_G# zIq$vaLc#P-PY0*Nx;n@OM4-0&Hw+qmav~*B8k&Bo?0xT|8XO0W`r62eE7*N~W9Z!` zC(UPLD&-mMj%kI?t-{CbDMbJjZ!)iGK3jLiOZ)O;gm=TiN7H~NCh z5<-7*2x0JHBc;hXc#y&ER`~QI88I;n%M2q!T=%(JNJ!3kJR(S>j+|m<+Us&eQ!W5e zooG9KhIOu7kTuMe2%uvV^K^r1PR32B|!H?pt!w zQl$cEIhX)ru_yHR^C1pv$wL}6HY!nu6+GE>D$ChQXEeO4+J?HyR(=gWR#^wY?=(u%Sm0xw^(D9bpmZV?8{XiA!v!h;3A3>VZ`I9qmL_K4QsV{ca)W?Xe zH?Tl$yBo&a19}+eLY<=TL5fXzXgn5O@g}~_$kMTwSbqZ;iqJxXkc-UfyaG_=3ol#1qvKE8Z;lu9Mc1D=cFD!VT5^ zjxR75z+Nh-@$4XZyC43mFB2dTNQlmSuJLTH6%L#2#nUbngdPIrENwh#{~)FHel#d2 z{4LsPA0de^Yc>^N94WZK@M>(-xX|{apyX=si&+DAo8n%%j20x3%|xt4rxJA3=+#WC zbsBH#N1g-pQh{NL@T=+yJkt+Fol<;}g5Gz6y#be^78;rzX`iSAEXh%{Ffno3&!t^4 zzRE3f;yI73_@@zsv#ox3sURx@F)6<70{6!1A{(4~tsTtdUpVb9&4(6C;8j9t}uW*<-V1ZJ}3Msj_eBhBEh{AQ6OjW&AU9sZ3FI`G^!u%3KO8uIF2CE?Xvi=#0&q1}!k6 zozWfoQ0w)Mx@39h&L`U~OU*3|X~p)E(>O!+*H*XyPb93m@G#B9(b0yY{Q$MJOpDLe zJ58~uTU2P6N4GUc2k+J_D|sp)KIhOF@*?1IrMUK!;R4q&snwE%p-@9V*HfERHt%;I z^(eUyIdqqQA-bcVo_XA~QnbuEP77I|&ga~{ska6xr75(HRQgr7#;Tgdh14>a^(mJi z$-*0C^NM*FO@&(Ibnyhl{fhv38r` zNy9|kgLXw6rAOAx6!DU51HcDbJT2Ea7;it5lU@M<0RGI`KzDdhEoR5#AMhW)OdX;m zGbj&UwyDydb#&(S3kXODlTz%=IBu)Q13qW*tICoCsnN`T`2lCOV^XuK9A@hSAhwzy z7<04e*Q+~1_X%`$j8<7M?gX;Rp8sh7`?F01Koi!Zg)pGTS_Abh)Fs1PdbF*gR+E!S ziQ)M;?oSgI)?(*ZU0a1Smq%m#1DUg|vvG@EljqSuVr5CNPSoy{y>r;;vSXO%H}T_2 z|K<3YQ4fuAO|vU+&5bknZoJjA@k_(mX9~oS4vimlO|sB4D?@_JT*&k5df)!~amHE~ zTE!mJKp+(AH@s2lH)hQ;6=S#)&->6KDIa8SZ|e?L-0vksGV2WL+b3yv_wiDHi*k1;yc32Yj<6TMiLK^+0t~wDGj4->%7(+|_+%kGb3r z?S$}8JPjx+rX?~hRy-U>2A27X53seiC&Se*G7+Qq@W|m;F%|$pKpoxl4d*je57eM{ zhC1!Ob%q-~y+ZInJ^E7n_Vza|7#%Kf2@r>9k9=;qk;$HdLK!VS4-N_WrAj4wy|=>1 z{n7gtPCX75xSAe56LuLLO3Bc_4dC~G>KGkEZTK3^cn(eeu;YS>Hc#rb?o+fAhWL*H zMp1*Zb@710Mhkb2y zuII$-wt5ffa`_ra8EA*n``1#6L)CYd{&^H zfi5B%UwXYZ3R@WFrmoJiP23Rj8!ZrKse_3!PnpeQIsG<{KhcWg(>=F~17btNMPL*i zMPM=ay{!vEGq#*~gu7RlybkeX_PRlSrC07k1+1J+mwQbw)WG0FI6+5^Qvj^>Wj*S~ zGmrqqw=Ll$n@2#2ogDkS_M(mJdwXJ^-p9+1=XMRazp8NR(XiP4)y8KICA(HB@#mO< z%jByRsr~Gs2r_4oRj^q&36ca27hTH7;h(~b)CS%KKQjw|LfP{#Er1OboI=-*Z&*`KTfv@Aw3$#ZbscXJiO` z`Z$!47WyiCTK?4o8?a6N?MO~kplHd{q=&;&TvdG&71$-CjCWF7vxH@#XgNJrRleth z_5Vn&QVkkgOlI=-&TJ_ws)NDb%A7T{_?x1#50$xX>k0aXn(|j)RK}KTx)(R2tWK(*3ei0 zGg)ZjWa;gO5RPLrkN3MHS2bif5}YbwtgV>*mXqqUPKse@C zg$FENyyWPYqq|@JqgrS+W16i_|H-6+&feoJJC;Px7gC*;4c9m^el92-3zdmtDLcU! z`yehY@~;bnOSIhy;#m)%_S^od6% z5JN4kDi)AI43SMnmm!T92GtmVPxzRM0%Y7I)5h*@O&euv-DHSyWD)W#?4sY+nVZ!J ze)vRA?~|u#@$N9!T;HWxpn4~>0A2e_5#jwB+uRl?0d?&%%(Md~NUiQlT;$MXVQZ3Q ztnqQKdB6@y2z19$jy-{{uEaNQyN$!mxd^w6lS7feT8AAPA)J9s9)B?-wI_YW5zKCq zLSCHev9NFvZgX-N+iYF(TUviyNP0%)>$u4i?r3#8F^BS61*uMp6?+%0v)IXzT(_e8 zm`>6X^3Jp7{t+s>1}Eu0Fa(~b=W@|4x6wih^?5^l&>2=LXyT_=F@(RAxxKwTm?@^K zsd)|@Pwwsn4NrY@;XW57rEwGx`XssAma83^^3&o#05O}tmlfqI&@Q_5f_KuFj>EAsYA8> z+hTiuXL=?oDCWUS8|g@=^K=8$+E9ED^Jp0grn{E?;3=;~cs5M$WjEw+ul6dT2xr_= z5c(2qSu@6{%6nza-r3<@%97cLlCZsIBz zB9gY_m}i}c57N|WtA(5H<5+6@ZEo+f;+(I-oUk+Z=upJq8ZG;d$0 zE9=ZtOU31H^}G7EagerRJ~@B@Assrg=rvo(3#w60Z_*#|)$&fZ2}b5}Ak=Ij7e38HnTI# zSnv2vrlrIA6XHYVtKa)}Uha@|r&nCRt?XJ3!>3NCcfvRz8T2cncKup$%&D^uZP)mO z*RUI4G2GlV&p$H(4wSw=wW;1~p9ZJ7?ce!4z9e<=`v#(GpUzx{@qilB3gj7;c?Yh# zWhb)zWxwwaF$Z5-@qzG|Hj#d9CVeCv>{DgWDsy%_o_815;{ulp8jay2coN{9^Q6e` znT3c6Ak>p#KXkzuoY!^k&+^sqD#v8>xtVeA-x&&!QNoZEFH55d@&x&EbF%Wz(l&)y zw_G=!1g51J53!Mcq@d4(Qr)qY$~nGryB=fU_K+PaK^w>o(Y%yYXR;V0OmQ_=#p>qW zx+mugJ>o?`gMDQ?k^Uq0Q^q^Da}p{=Jtak5hiemiD(bc+aPE! zD1m_g>N8aQ_X^Y|p&8O(d%Yh=IH~88b)R7y5dBZ7zum6yx;JyWk>=34YsD1TGrsr| zw{8g*-tXyyZFRMmRFDXr3a^>Z$rZWRXZxVD6;dMHdJ?ocH;&*hFngB%oF~t6Bbu~vd1aa7vn zTNlE<)VG5`84vqUhl3FE3DCTflwY6(AKNMyJ}6cd6_|@Gmk>JKs|0iI65xO&|BN!u z%%_&oT51>i__4@a0f*T|*EL9U5`96!e2bB8(emr9i6>o0p?#?X0;0`)hdmz=U=4rw zA;&CBE6?dsuJxLcfShno7{`Up;TOpSeD`MOV01!JpH50m^7%?fA1LKuITH_GVln0P z_hB8_Qw)hfF-X{^iS7n=EVG?Gd-dsJEn}z`D4g1gu^#n=QZv-bz*#VFV4FRR?bxxG=n1ysl9pir1E^1C08eU;&%fQ45{aY z6?nQ8wHB*|-!Fu(3eI2tih`dffKUkhQmWY1I}(Z0Vs17+e^$aPVLgoyN`gC|7yrge zdiGpiabY~?4yMwi*IK{ji5xkf5az0N*Fh&16HjJ#h^!jf8r|C%K5gg38$>4Es9gWt zUM1?+dMUo95tw7+v3KBM5N=gN1WrCY1bMh3S@j#wC=*1{wX4A#7P{iRf3LS#(Rp0U zXiA@ppcFquk>212goMPG8z{Li_Is$J7AMr7)SZEk-mXmV?Hqv~H6XuOPPeszgqNl( z#msIDKZXjc>uE?Vn3b`|6~3X{Ly3Z>YJHEVxd|3RCtoy%yyf+sh`)NsHLo=7dHp4x z^aCBxiG`b}!mT1Y=k2IaWWh;WZqv$!?he61-AHpG(Sz0VML*_L z1Mz`}3+}T}sOw5KnS)LPDxh*(l^HHJGggwo+m&k*-qd#GP^Hx`iHCMxSa?NDEdAaS zqng$i1(~xO_IKCqC)C!2h@(wcistFuj(iImv5$Y|N_!MBZYJ&wg9-X44V*bdz0NRJ5=pKkU zaa$)uGRmU4wRHDFaj;5)noC#Er>fy_D=#ezY92X>_q4>c-*Zq2o z2%>P~*sGG*Qgbo3o{IaK3Kw8MJ`13-|3>bJtmJTdM{G~f9ny7A+Lu3Rup6tSKIXq- zCL$o*rxo7!>mJ=9d&i$a{)z$7!VJ<8ur^v;LKBy7UbR(t=M?0FzN#!Jp0XwL)H@h~ zTcaIfKBUOeG<%NEtw;US{%-#!Npn3M}&}gN~=Aqmw>kl2Kf2+{w=-dKl&D=-62wh*Irk zD}0Ir@&Q@!Q6ihGAaYk1=&M{b8qK+P3#UwyDXxga{{|Z?HjHz|$uhlOCi1V}75W!i zXy5#g>cn0#{mKEo=Hv<@JoX@o@iey8az~0&XL_xa8U*66<1yZO%#eFYbNc^8cU2mz=R?OQK52Fq?a@&cFFb6#JyVMI*zaLRN6-N?_q`?1~MN$~Ad_y6luT;IM zs#Y9-OS5`TfjNvfGyLqhs7-s|bN9wNwVOd78p=2=6d1faSt$qHWogEFwO(EQbPpKd z(O%tRP5rbxDPm3Gm~?M!4mR){$p$UO@;^5T26NmGs`!)cx()W8Y%UE`KyuNsSJK$F z9Ax3W9VdyWdjA<`$?wdYDX)71zRL0g1yWo|r`Y5~SK;VE&ZXW<)S0mFMM!zMLwK4U zVqG1RfuXJQ44GS*{^7MAfl^F=?3ECyXLb*~=h~a4@o<7-BU0O%x+Z&f{)O2M4Oe-d zv`+{BZ~(0B)l@9$;=pav43-|Yn3v>yKuI?oy*j{u?3Y$I7aj$-7A38CC+2cC0)d z-fzmKZ6<`jjv83~)*-AWK|E(Us;ryk8U=|#_#IFU#WyA@#|nJA(8pMY~3Vk1& z{N!c5^Fu<^IOMgNMtMeWiQXz8RdaaC$YU)j543@W4`N)S0cOit-R{BVuZ+rSlg~L% zELW5OmBhEqwbmxA>^TknyT3Lst0ks3JYLd zId>fEsu*JsWq%h&^vt>gVFCv^zpmuAmc)`$(i82HJ;X&QUVs+yp!u*se&BB9CNE!e zX|$iN{L?znvx}o_N>GMvMkxOe*@S$jKa^helK<1i1M>v141fba zrb3Zqw3yyHkrH3Ssyr*7mnLu+S-sSIqHYHKK7|O!4r$j&=+--k*;c13Vyv{foozc; zZsbTkREH}+Crw3!$*!_oy{+8p8!S8H41MAVmS9crA7d)(l~vhH^7X7)6=YVNVthSo z!mjKY@{}V9nPt1xAG;(`{(<0JCFB>IFDm`H#aZ#5J8{KKX&5?Y`A--(Nx=G}Csl#@ zj9_crjRPDM&;M>GUyZe;I<%xRHr-}aP!O6+e7zlPWh~xne?MPXbg#j)hl`VpSjekV z=hhu*tAzW9N-xH7L%DJHuCRl}(FES@ab-C(y8I3TlcNVBFP{12lwAyID?E#vt~@7PITZ|Tc`N?LHp zH6Xb4H6gk6pelFOpif|?e5(@3ApkTG^-gm~0EIj%ub;}5Fzj2!pvCdd%JY7S!HJ4b z)vL8^`P4`DV%CKI_Rj63~~i}KGkD0-J{o$tgnP}O9|zuX{soteag>NATM+-J^h&W1<3PGdGlp< z_)_VLCOtWPfDSE<0NbMhRP=zBRzg`cLD!|V1un2g4EQUTUCZ3chJzqRI6qq<=3>=r zPk{EKafm{OO789^71M^|2{Wg#lBQlP*YXXr#r8^E2l|bptbWPG%9CDhnAduwsi~x- zZR(MS^TNUAMs!Y1{~ubb%ymd%3;YUEPRb9Pck$kelT>vc)H4>rPEN4PYP}ob$sW}% z`$hkh^KYk33&`4Bljr3Xn?~nae)Dc@yBXI_k2uW+v|hvdJFFa{6`L2NzDFV>fJSW;ivYWfl)!_ORJ%fb^Y= z?RS2bOZz`~uT$~20Xwq|z%^m#M8*DDUD;0+3Io$j#cQXnLT27DJ1i$uryDkDwzEf1 zAN5sJrFNn2VqS_%8OC`ncX75BzlS&qj-HWmcj&7US&vv%Syi^ndRZWGX?+JY z4S!y){#@LJ^Wo(QRbh4Md$@o|x|>3)#~L|4Q|!{cwXMQ^&!lyrzedgidO-#g%XjMrE-~8 z7uZEbPmrZi4+_WdK3q*DI+F5fLXi4nWx=oU|13*l?{|CU@IL3!=32&JEJ;-6Fjty! zCgDorwARAIjcAqbBiVs)vaV`2ljr*j{*m=vB57TmOD^}O zno|DtiHeta-7fs6o!7I$|CzR0j`iTfQs0_u9`AAw2SvEfoeN8jZ_Z_IZf-=HrvZ^M zwYYERA|?}ssNtM)^`D6NjXRy&YU!=kul@{$cnjN)no+7<`6Wn;S1$};NK*eBoF$Y6 zPm10RA&Db_W^Z&Q_uciW;b<0cfO4tDD*bp^1&(_fdUpC!08Xv0`YwF1$}Y23Ir^5Gdg}SG3r2+ z0re4BwFtV>4^P`$eUZsO#I>() zbHUaCNL$s^d}Bl;hDSTR`qUFG;WX4K#&)Ac;vX9LHzvQ9S4sjm!I>obH%Pj-JO-y} zI&-}asw7qJb!lo|VS=qr>pbOp9`x zSN}sW5dL%^jVCehxRMH*XD}-duL&ZDd$Z`SY26XO%`)mu6(C7O52<3Mmi=8{5f7 z7XtDAm>^h%+NysBnJ5D}h=ZKQxDe?qguZ{1~&4G?-G zsp=47f&%k%&JZE^Uj>t5=XGI#B$HhCoi?JYCE29_9U^wsgWCfuBqSZ@A1BquBVv@v z+lKRzHf{HGAKj24p@oH7WF@cSj!ou7yW<)*wo@s?y^xK0FKEFJuQ#!iuJ;uiRnuWz z{S>M0i;%JxAuzyCwdl!ofk!w3H!u&WdPHpUAYNyeeg ze=GWAhIxd^OFPosqR-;a;N?LA7QQ`^1s`m|yX6cHaRIrWu5i`!3%Je5ua+k{2lv6^ z%snYB);^{vUabJ}IUX_Do%Qv6wfB1;!vB(bXPt0A2B3M`JEz*uK%&_0mVN(c5b$vn zWmv|{5A*;N1|;lhc4 zE`_$>TuR7C?~@%7r7$8I>#4J_XhKWt{Qo1w_s&PR1p7V=aRZnIaIG4*3OEOndM#V0 z-TxKxgFY)mJB0sb>0?lQTRM&WnG?;pg(x|cpv*tny1iM${Bc-_tCg2?ZkMf zOKJSA7(>eFMdv=RJ{Hu+UVbDfAAAV4%y>s4CI*+?#6GT!RL~%0XcpU=Y6famvC%pM z=hr5>dQwWqhC0*cLafS3ANA~<>3wW1w-+Jy(=A+cCAv4UPw^^er-Pz3*o@;?(W#r` zL2=SjqVc$<8@3d@-NrgsDEzrVT!;dj8S|q0aePVVj<)jIt z@2?W2`ZDWZT7ZePLlwWu^`3C-BZO1`v9lyQ*$xM~mie~=P*L)5ew{xtFP5I3DSJQ+ zv}EP*jmlgi#lXbvRmMYICzNW{17m`MK)u%aS#=$5hdyp0KpOw5ORhvcB>TtEeklne zbR|L}KdHL$#CPXc<_Cf?$OHKS-ao*_o`1u9Em=osx(sfhX)Cn%gcxCE3QH9oo&)(@ zU14)29B*S?lr|YN0g(DFO<6_sQ z{jMG}U(nziwoD)(N+%a&sg~M)f=5qhrE7ujd&HaplgXzz`_la5^hR0pB@}LGEU*hKh>W=a{sKG{@+LL z{C^52Rwnq(<}*`ct#)@=XONZ(+f@{>#z9UjZgXS<3-rgb9|DG-h`uPkVW*9!@1kTz74NjN&aGQ&@hY5gD4vcP-)lnECEqQ zYmgZBjM#?*Di8JXx;8YbuWk`ExneHjby*0V79x)nNtrC;xw!DGfkswpry@?0#2Nok zMV$h*lkJ(jbf1P?TTm&4K5T#vsdcL5Mem_~x}jcBmsx1vOI;U(U(f363(VzwcK%3( z9D%O;`uWVes*?Xhfwa|KNOySFzq@jb7r`iqSi2}(s*QX{aSDD_UWk;d^5?8>6BU3qXBtS z&*k}#&gav~{#lm_tF_Sz;^OSP%_NFXut#bMcmk12)lxV`M{lAhEJf1N&#Bv83|J;> zC75zdE=7PEi#Nn<@2?C%)ExFUBD6p!js|Rf3yuu!h!AvAT0>+`qusY_sqb+Te%PJFrYlaUDb4t z)FVt&7uQ~S&~|F-cGxa4^CHE~iaX?ed-d0C!d$6$c7;Vin-(duxS5_%R}@b~)_FQe zOLtXH9aA1=%O#ApQ!3R8%;bsce-!fuJ+A6}7i6ecKH2_L$Ko(aX4cWh ztmf~MaSX2z7i_>qG{vT@tf(USyi6|a=#Us=)l?$b8Qxi5 zf_*ki`kIUJ2h`Y5JtL1DmbxmN5|dBt4CGsXN8I=8P4wPFL#K8u=<#ljUqHq)bRHJ`}D#Uosj z$keu#o|r#X-_SaNl649s)iRfto-naC_fo#IaYmoN<+cM*cD7!XZq_`S`_OO8p6}y zsP}56)YK`l%9ag{BG`juE&#C45A|7d4cbGPeUHRv%*ma|d}GP4KgKRfL(&Dz+XTFo z4jLeJF#8tQfVw&7zI-H|l}hrsH=pkeFEoz_KI_+cv^dT|UF;%jgJ(EEUGp@5`Aw-e zx7^-Jydj`yQYrH~XS<1TkOpX=%`LBqzF^LhaUe-j?reLw_sLJd$7gGs`u_JU(}R(d z5ymzTyU9u{qg^J1-4KnyhM4I_=W$G5^xV6ujXwIiO55tVek|NkI2howp-$!Tn z9!Za!r5^K(>Tmp;Rw;=i!fm(}76MQ?7MiRiwej#{`HHGUXvlz~ z7h_vj`#P`5+j^Jz=7?f~@*B)_6Xu|J8}BEEHdfC5F5Ub4Z_1vgS=$yEMTTq8^yF%= zR^`}s)ih2uPW1BXOskiS=11v6+zNCGa@9rLe;AgcvUr5c>Lt6Nl-JzZC6?|=9en&X zmfy18n1+1#9hi1-!|;Om?qADsvc1G#=cqB?Kn<-*S_5!XDwpSD5m#1tw@ch!!mg{G@)8F1?tc0>X^^I zvx~37W?Kz)FbaOOWOr~rXItMzOyGi98NNMwJ3L(lQNvgppK7}d&Yl*xg2BEjg}N0v zWsKA#9BzGWf)2)`QTXA}><<;iYMZ&KXLL}G_9}AgfPhwPf5QL5T=_+^S09`$(Llgq zYyWG>W}3hMPSL4ghSQ82(d3w*0MI6&T8@WBrw7h@fp6F2~{X4L;1uH33L_{N@BUQ|v=qYWskWPlL0et+uWAw~gx=y;n4aY~s!cZ6csVk`d20mz{RS1md@Mvp3VjS>GlL*=*PkzGh85COYr8 zLZ^)ad^Te@yd>QTuDZC$eOr1fA>2N_*4f_c!#2G2aww>!G=IHk2O*AH*G0}5u-ry0 zxJ{-c9HX!714=vxC7|ADi_ygf(}^*l1jNzNXlo6h*LdZOnPxmlltFqpFr4Nx+!2|6 z6uS~z>4JQ)Sgt>|`l5S{qOMFwz<;i?VP26-;yj3%ifBh1Qn~>~&qnkx0`@HL`nsEG z?)sX`f?4uz_DQPYyjBIaPsM9(;?>7Ag`M%>QXO~sdQ;e1Z0txSg~vCWL@2696Lpkt zXK+|`3`tDLQ(-iNEGT)PS0Jr*le}=C*x+3%4OLZ_G36!++|AcsS9^6#@~N)vhVJu? zZa}RSS|)jv%K4>^$h@fKjni_3s>6K=Uvv>$&HV@NHWQ_xhqFXR2f9_}^1F)3FQ4yv z=R@dBS2{yUm=$*SHs0(cv(enF_g1o546x|~Q*;|o45*`;r73w~^h;9XXM+caxCDF4 z+I0p3=n2l9IJ#z!oktokZw6o$=l`qRwG-g&8BrQ@h{w1OPkyRNT}qs4tfehVz7e&uQP zrXU|3tvL2=<x0brzi#MwlaMnGyWjH+D z#rKrZVxVzrITdyi)wF{)RBznf-2(4@e+L-0zp;lFaEoEPBdZpU#oAI5A4%|IO3LEiggY)J)@FE}{}`Q4bhfw>0ui1gv* zajRH9>VIqROT(JVx^!dlDT)JHmZBo0C@m;OKtyB=DWNP>CXsmxq5>iigfIsZ6$AwZ zWfYl2WhRV5Ado~sM5Z8Pm=Pib2qX*{Ac5p=>g&GU_qk8^kAC_NKkEDl960A>?{(H* zd$0ArYwe19DZTfVQ*TiG&=B0iE2+u^*FamrI9e_##bjT#nI-bEt||DsuhNZm0Uz?) zcFILw^XD#{>L=UVh7V+{avdF>B^xoziaf7I@9!~D-;E{eCOw5h_1EUrHDsN`n}U!9 zCEi}(D8V@r+5*6E`*!X8|8B9}{CtcCHhQt?s&yxmuO=sfT>i-PY|-?>?VWPwq0O|e z348uZ!_n!j!+q=;XB-m;-1;L4QT=^=#{(=!3)?^t6?Y|3US=uP36C5DHCdvsB$E2V zNdu-D+jfk;Qun;M!4*5Q0V*^c6daV_v&&%ZTnjL48JfN~eKde2+A*+S?nQ} ze`bs>VZU2jrxb`mG$Ys6#K-tF1-TcOy+&$qP-~F(bAP19+u;}0NEN1p_%+e@fhA-4 zUP;9tAU8g^o=f}V=GyP^KkRrU{DRBKm;^}2KW{P0@72=s+pQ0uwnie6C=?1_vJ-ND z8+CLvBRyT`>)ZPmbKri8X&v64o+$od$cKwQ;7h>K`fl{$SM0%$^yz0_o}P^CfNhYo z*M^6OS62Sq$Nud``E35^G4<2fO+II{3b^|_+V~uX;j=dAtoer<-DY*km-j$be<`c3 zuEtu6Lw*-|dV9;L{?he6a_Nb%{)e&I?za;m^vu%IQjEh12xK#_xR{X{G=3Bo%KlyQ zA3I(M+i?pE3#zvyq>mlrdq0Cf*y&MGQQ*9)s!BZc=d+L5&d5jmLG8DCLJa`GIrOXB zAdhjtpDFfqz>unHzFF|q@%lR-J$jUWq1tQsePK3rH{|z|>7X|C`@-Dv@_Vnve~2)} z(ye#8jMn;^m_UbHwnOgizq7Rt<=+E;5`*nO@^r_~ctUJ(b+tE`-`prbA>M#OJOelf z>hN%0^=l2WM29iML-Id1iI$?_FJ)vQHvlKwd$S2De13UP&>p#ki#H+E% z@+7Hc&e%@}44)p?@*6C75z~}~K)B%5ZV8(~Ed$b0N!D)EjVyN;OLG{jYLYs9*zMd~ zy^Zn^AmbB;ak>lTO$n{He|hm70f9t(1ZBp~r5OX>H8?yy+uNnJKwyG;E{b&IpHp-; zbk@Zy)ilW8-`{JfQay3#RqO4Hq3w{f<&~9{KR)^67gb#a_h4}Ixip=xCm!b9zRyE0 zo=jt_0kd}eeIv#JTzTW3vagL5}zQ z2aUM)-CDki^ETcdL{32?F&JTi`P;vG{e?o2oz2<0b*skwR?o*9LV!A>02~H7f7cT8 zi)z^G=p6QKPNitnx_wIPjDO-3k5V!NWwBsQ118CwCSkY!w6zA6G zpJwQEN%rd-OUKGbfz}KY0@}?DWs*}R#nInW9p=ZPq z-13r)l9B^MP0{Y*T(X`Gc8z(0ao2`KCXtB0qV9z!|JYO+vnrAI3^w)fiL1ru;A0lVqrRuGlar>g40yF4OIPv20$;4KStrX1DRl8k^~5{s}8+>akH1<##% zlbXT_U*Fi+h>HssCNy3wg!_56r{GTf`E+*cZb6x=XQ&Z1M?IC7Qc6j|&5=~#pha0D zwoud`5fqd(gH9GYLZxI?Z+=Qqa%;c;6&To7uYi+skUhH`>IwTYH|=5G%nq-``QBEW zekch&yFi`y0PQb=hv8L>y)LLR#76EVrDy%<&xoM!0_8q{ffz zJ~Qgr50I$H2tNu>Z=O~|#p6Fg+kX!D%||Ef0$5|;fF8e1r4B1ZuhcZTpZIrc@t0@! zb8QR_4MDnupQycqI6g0rCUmv9eOHU6uys9%K0`FfMuHXrHyE$!M8CTM+GxTm~H9vM2F6DxJ<3_em2Mb>@V2OBCqxiOSwaR7phybP7($cq&1LUK0cscBoxeE7?P#6 zwYBMA2L^)yodcs7^agwe-TzYp^5Mggn{*`1R>aDO^S)wg21-*(u{1VaHndzgA-T}* zR}Qkk?%uic<@Px+q+s7#gwr!KAo6@6vGx4<^R;(&K|VackmSdpz^$>OYIh!|_M_hX zXw9Oa42Gsdi*Ge(il>2Ej2b#R^{-$5Jbqe2LIMbN0#q6b26pV{8o5LV$pMkT%+vWP zF(rF|bO$PhuJNUPc4>;5rqf#x=D_5ZyEI)ujvhgSAju!+&iic%AKD;v6qPW<%iugW z2b8G9GdiE1dwumZI;4E1$a21DT=w{<;UZS;N?zMuG1ybFBI4Eoo5$d?Knn=ewV^CM z%L%OrQv#p9iVP+A@+3*sOYi$Uc2CT+R6okiM@V&{XGjMTr82X=5O)99m#1kp8VJ3g zTlQmkvj<68+B02$KHDp|A$-dd1vNoM%bnN}k2H$+2og=3t~b@J;-wa5q!NPX@>!=h zCu6&u?HWWUbPLWCxg9h~Z^FXoxq~}GPl}s@3ByNFEei~<6e8FKkYnW{6A}_E%wQal zFEt@j2S!~(LxbhxRg?g73@~Lt&Wx zCEK809}%x{n~ZF^DC&bsgT}}!9v1oZ?TQ35YlZGCOQiMoq#8Em|BAn$^Er&h-_V&NQXq@&+Q>=2u$SbFXK zSB)XpxAIA@(fhSU?CvNlXhRsKh^>~t5#6nAr0mVpsOy(u|P&#T3VRq7tu6K(}RMqmtzfr8t&n{X{KaZcxX^Nh32u zh1GiIHa0=+O85m)D0rc0cvkt{^(LiWEZDl`Xzmu<*3dL7WE!VIIrihS^J<4rj~FZp z@gC<$s-%kdk{uBJWp5wkAU}27B5|n-n8h-)ja7k}V7~du{$bJkjiv{(eXo0xk#iE; zvvpjSUx;%9;&nXw9)w@~R(0fuIu5WxEV^PC(96IP`!SL(VYc2d``!&}{y<~z_0<#& zE9JF6L$-Je*QZmJO2#YbB^C3jt8PiDUf5ab-9>uU7E13tS()goSHMMwQoA-?1KN?+ zz%5iNK1|6>0QVIp6cUvOt`nCk3&%W9pHflDzK+n#-N=*r%Nf1giPm=FG3ut93oYlT za>t^T&vR^rNp&!BV*5HAc&nE)x$S&2A$B}bDH;CC+&Tk1@>h3?!*#*3`)n5d{lc{3 z!DHDC$Up72S{c($Fmw>&&R6{`_|Lxni zRP)8@p*ezc*XEjo4vnCI&bpse>Rdx>*P{vArPbuZ{N!C`Xt~y7*AlKeZLBGHSXRB( z4fq&Qul1tPwI6uu^O!ozp+XI-T!Wo+gccvdx4y-olngDOIjF%-xstkDf3`l=Io8x; z1l;-40iPQeCm4D2k5ZF;uqa+wG@FlMhAZk}s8)Fl<|3xkh$#@cZM`1+@D3r{kCxu_ncLF*@|2W(8f;#ICMU4bHm4 zVGXbGihFs5mHciCMV8KFn!vQcQ8%B!jBs+kM~g*e)v+SovkUo8^K19*vs<)cRYyM8 z*qkl1W>;QbK9H|07#@v6&8TOn`7Az-J)9i3TQ2g&bbQB4>OIP#c2e!;(FFGL+qB7~iiBs=;;r5qKGj1C;Y30W$z^fgkRtdN zw>wbxCw*IOo{FC>EB9Zy0Cy<@juG(VRFv!9OjGQtFctNZ%f-mGwmN*YXnA9pA60GU zEW^wQ5S9hv64*VgPD0`I3Y~i4{P~jb`N}t+pYiC$ zN@eP8LyOw_l-JBsak_Ih)qBBF?2|q)V9Ul~F>?=$#792bJJfhxIT@%YX{Sq1 zzZuR+S0{3arvWDU^ZwA6sfDD;ExD|BQPt1)!2$wm!v`LX$-U3#p~@VVm#xP)aXz|s zfsECy+Sbh(qR=5WJ0jj{am@o4vhb0AYC^k=u7kTXfGc*ctvH`FzE%(1=cp*1d|ueS znJydhT2s%pKw9jU?Dp2n?iyPA)@-4I4d;s$Q!kV_g?F*3Dmom(Au#ieb%}aMrQ|^+ z?STvDOK{RU;T6G60Fs~`Q6Mj8Sh6`aEE~}ncI}3+&*rb#K7Wam?>JS}i z(qCrdy-Q9MtAX(dvQT{{nxCS@rzh+Qc;<6vY>A0}qN+w-;~0|m>yONn!%$8}U$R!# z%MhyPBA4BrV0tS4;cJ7eY~1LuBw^J1r4NbNd#Y@7jny$|r>TQ=u zc=G&A(MxPU`x@BU`^{BEXgf}=Jq9dsV)C6TWc+x2``6gRPPVU% zBfqPnkV2@%U1S|PHTIDeZ1wibO{vtwATrxZC z$eq^<6C{i($~K@)J} z0)kjsddIDq9%OGqGk`lMkZyOMu(AG03dBH@tuxf?biTxN5pPnKo42>_|1*VB$BlUt z1f1(eq`F?iw{doEEHleO`&{IUT$C_Sm}Db0O1vA-qQktJ1N%9m$p?lcIPrZ!LBY>y zx~mOobJ1C0b2M@1@S9g?Nvjm?`z;9TiRGrEQ&_==4UbE$&(FNNAo^_7VH4$-ss5vcTE<4-4V$){s zag`}4xV6thMK`p^F0o4}@YRy@+Mw>0i!7fuD@Gbce}8F_oyMhO!>6c7z3IjllJ2ra z*)T$2BjSoq>#UY#ZqN;g)%sxO69N{9N%TUiA%+v&B`%dc8{nfxB97z6h)elnFP)u^M=i6$$_=noE`_u=%e zT9eDaT3xzvf6s%_7(Xi-@n{WxdyU8nQ*UNkC@GhOS?rU|e)}U)b}{+5-Tq??^dHR~ z9tx~l^Ls1rd#+jFk@*TlMD@82-CHdcJ1$wAj_FY$Zb_RVoDuXAZTM|ht|R!+&vnSp-s@VBNfF@bi3`DFh77)8pNB2b%IM!z8Z zrU#9EP^F~cva<8C2w-w|FS)K{l$nfs>`Ajh6bk!vP`p3mWo70k7}MDsROcdzD$1bh z@Gb?bpK_fM#1@0Ay!VI3V%)kGR0m&Fk;AXl@~9(0#nz(L#?NYGRQI+FtyNrVaZj#$ zb_FdQ)6;s$Wm>T;`kF5@|0HEc`d(LK?kM0F*PI=AFIy9Sc{@lWd#Lld$NO@Q%USO z!#J4l?ZBOxbCcLWoAtDy=Q`XT5caoQ8&(A-^0^T2 zZRKc#pYfk(o(^`|tZf>ySd1UCN8*#^(dkT8um)W+k;AXkNl4lB8dLc7VA7}fs?r!lZ(l7$OLW0Ao&Us(r53RYUFcc2^ ztq8yOj9$f?*MY6!#r8np9_x!i{U%v3RJqKRBl;l7#hjlXo}&OK3I_MwGAA}RHi29w zJTvTA?s0=-=xnhBF zm7-$3sN}gWZNLVL4>k?O3<8STM%T*t3IR zu%4E#CRa5JSy6B%;|Bq`$H_`GtEeUykBNcJG#j_Q`ewPva z;HG@eD1HEUhXRZ3LURb9SC&P$2Uci@VQ2;$K{q|4tjzGn_93gi?(+K4sK;Q8z3f7TrHVALWbuXvpryi~QflU}%TRN!Dvb4Hj-J$E6 zs-I@7tJOy&wWk*>e~it?Fe;{?dYtPfe|3n3T!1lRW83vtblL+kDB#2A^H#I)H}RyE zMa4Kr;b8Av`Furmk6M@B>iw*XR(@U{1+@VjQ)yot-kfu5ml=7Al0Q%y?z>#VLuvgyzOS;NRGMUFlm5jFA_6d9Cqfot{VmAVtQ$0Gv!uw zVKMcm=|`m$|1Vi#->GFs3O-j)%vt)+VlhXDzbD(()uD%eI?_uFF|@GJL!FNwZw!S-;^9k7vndWA$OK z%?nIVLDow395~)COX{J(|zam#Mt=ZF*W&d z`+;ybYRn^OU{uBvYKEh*uqFD}9kdCR$!q8S;m26mWyli6ZpCND4pTkTkExUi7u{{= z^4;aVMg?(&_r8BWXfRfl9H2D!99ifPIM#sH+mx!iz4C-n=71PUpuCf|QC=I6ELL#F zt|w(Wzngu->huscuS;!I7LmYalvX@F+d4*+6|7p<&RQFjDhMi`ZCp>42hoG|1VWxa z0hi01tV6NP5d2N8F=$bIy7d8Ba`?x#&;IgbE2jMqS)=8>9miW=ZJ!|I7Lk6<1g-E} zA4Mmkl;J^8_ie%XD^K8Y@S5A@U41F3srZpyLmOyRULX_i0KDxgz{T||~TvxgU?sNWCgT-4$)OSs#lJcjO z$r!)sWVKQUYbtRsr%c&-E!bpd&dl0j9xioCGx>*IjVWXrI_ewZg(c=6P@S{{Hi1iUDd8H%X zIm~}vQHOPaqBZX+x(5DNjpeY!yU*WTEyFfn z#E8NepAghtf2acm1@Z7sy{W;?uoobJD5Q~vs}mc-pfc~fqrW9M)AUAZ#kfwjVNWhEUKnqSbJ)ELC=?nz;OpW92NewE$>00dCe ziR9^P0yYbx=&%|VD%-Cb865;L$BW;Tl!)Mz*|194b&wk*8xL1bC9I$Gik%CPW1fGdn%c>AvQ`x+S?k}sY}A8%MopX90;0iK#lum?T= zu&CLhn3c9pQBosde>bcD&ZQavKk+q1@kK5H(H(7$TO&%dRgXtK>rTf<>QF7LyfDH%!P`Z{ujFuU6SHc z|AKp?wR^)v#7(XPfPaRwZGx+C>i}H=kRLShCpSrH?&zGoDpH|=v6G9VTTYDVkVDTq-KbwR&AJFIT9QmMSGEX3yJVwWWQl{O_`K! ztR>VLnISgjjAX;N=xsw?LEjXHM@BS|qnd#W2xX;v5TZyZ0NZ&n0$2lbKQ{`ri0p&} zXez9l&mYS_aeQi=F(}w3Encx)hZZHe%xeU3+HH3ff|wx3wE}FV^+_1H%b;=pV0}L^ zf|1{nISyy==X~=e=LRI?EMcURj={7IwX3l;ilu9mjF@td-fz0uYq)8il}(3eL@P0V zBe=m;jf_T`558|VcZ~QQfLq`&GJ-FLdIIZ?xFsq<-qT)U(f3Mj^5>?ss;Un|_K$)1 z$o@u+STZ}Jvao`>0zN0s2(LpAAMe|zc;-%6*p=xhru`Lsg9VCZMYWODqA!S5MbLk5 zmxk$CDutB0p`EI$`*5|B!_MbTvti-)vf9;=qqW{6HPtmWT$iEEp5b8vIP<0LOYv+A zvld_4%s?9DJKQ~t2(aL!t&$nGdXS$?TA1)%rPf8Y-3 zzgz+Ah)1Hprc=L4<%58)on>fG9iF(>p4J?(TJLn;y}L4wfepqC#RHE;&ivYW4}O0< z6~Rybs0DM`DR&&RHVL*9K^hquUA$OwvF81IK*LyEYLbj+^9{Z{K*OmMXklMEVsC4i zBXL2hN}M&a8-Un*o}uuep+KJiFohrppNVlEj-hTjq8F|hY#z}MMM1j8<~_jc28iSO z`g(YFE>Q*GG4>7)0RCH`{;(qwh368$E}ZNE-pP|v}ctL$7=rfSOzrmaKcb1PnmDVT)*cw>0fv70JsuUCyUR=KI8lEEN zUr!*MOX~n=DuFJi`-%P;Y!QEF4{>xpko~2pRNJl1s)aqdqJMnl=ECs&04)B}UjVFN zrZXMyHPkaSw0;z!prfM$9;l%a#GdUI4|F~Xfr#BHm^r*h7JT2aU6A`ud(+akQh}om z|4;Jdp!gG)Xl6^kLCDBt)v}rxWZ`-EPHYyFRwG51A*3>OlJGKm>B6<-SINnop*&A9 z2;Yw4PI%q?F(-aR&wJs(zo5$CtKlQb=HI^cLgBl%u;^BHQw-$(=J{XHYrjjnd|>;I zsJyg2j6D-!3B|(_TTlL&M~?dHQ>U(*Y0CTOmAZ(%U*K{H@5!MQ>NM`C5v)b`BH8V5J)zqK%UEN$xKcCjodHWnli%%Pk zCQEOFh!xxj_WOgo)S2mk_YVj_GLFqo9uFRBs`RU@{PVUXi>4Y`Z+{QiFXJ=l+fIvZ z01LW%^p$2T4>H^L^G^X9R7l7Pz;kJdhfctY z#UR{?rIM0KJE0{(0Z=DMW~cmqyMshh0Eq^$!9Kppo|!$aewtiZ*y_Io$g33;3I%XY z%-^nTaYt;~7RXL1!(>r2}K{(ofe@5lft8yjj3D16l00o2^U z5{(vsijG75)h3=7efV?dTI#{>j9%W};eh81ctjvapHXrZkmKJ}Re{v~37@-nkE!K- zUAHe67fW#%Q*(cMMD=EGo{3Mx@}Dj)lP=LRDaHhU805pZ5B1{Ts{bFRIkPV_B{J)u5Su?8i5L zJNi={=gIAJ)ULB2we8-Kmw%1ueWCxIr0D;Uh`jy(0Ym%m#{4%?-TxNk--7%Tgm-S)%A18mY~Tzl%Fftt z)#Ci1zr{{HOaK~Q{&g!+?9o>K*cpG2l5`_y>!t4oL|2II-x{z~2)1 de Date: Fri, 17 Oct 2025 17:47:36 +0300 Subject: [PATCH 202/240] #7004 - fix some styles and texts --- .../src/presets/localization/arabic.ts | 4 ++-- .../src/presets/localization/bulgarian.ts | 4 ++-- .../src/presets/localization/burmese.ts | 4 ++-- .../src/presets/localization/croatian.ts | 4 ++-- .../src/presets/localization/czech.ts | 4 ++-- .../src/presets/localization/danish.ts | 4 ++-- .../src/presets/localization/dutch.ts | 4 ++-- .../src/presets/localization/english.ts | 8 ++++---- .../src/presets/localization/finnish.ts | 4 ++-- .../src/presets/localization/french.ts | 4 ++-- .../src/presets/localization/german.ts | 4 ++-- .../src/presets/localization/greek.ts | 4 ++-- .../src/presets/localization/haitian-creole.ts | 4 ++-- .../src/presets/localization/hebrew.ts | 4 ++-- .../src/presets/localization/hungarian.ts | 4 ++-- .../src/presets/localization/indonesian.ts | 4 ++-- .../src/presets/localization/italian.ts | 4 ++-- .../src/presets/localization/japanese.ts | 4 ++-- .../src/presets/localization/korean.ts | 4 ++-- .../src/presets/localization/malay.ts | 4 ++-- .../src/presets/localization/mongolian.ts | 4 ++-- .../src/presets/localization/norwegian.ts | 4 ++-- .../src/presets/localization/persian.ts | 4 ++-- .../src/presets/localization/polish.ts | 4 ++-- .../src/presets/localization/portuguese.ts | 4 ++-- .../src/presets/localization/romanian.ts | 4 ++-- .../src/presets/localization/russian.ts | 4 ++-- .../src/presets/localization/simplified-chinese.ts | 4 ++-- .../src/presets/localization/slovak.ts | 4 ++-- .../src/presets/localization/slovenian.ts | 4 ++-- .../src/presets/localization/spanish.ts | 4 ++-- .../src/presets/localization/swedish.ts | 4 ++-- .../src/presets/localization/thai.ts | 4 ++-- .../src/presets/localization/traditional-chinese.ts | 4 ++-- .../src/presets/localization/turkish.ts | 4 ++-- .../src/presets/presets-editable-categorized.ts | 4 ++-- .../src/presets/presets-editable-toolbox.ts | 4 ++-- .../src/presets/presets-theme/blocks/sps-popup.scss | 10 ++++++++-- 38 files changed, 84 insertions(+), 78 deletions(-) diff --git a/packages/survey-creator-core/src/presets/localization/arabic.ts b/packages/survey-creator-core/src/presets/localization/arabic.ts index 7093b6342e..a29af2fdd2 100644 --- a/packages/survey-creator-core/src/presets/localization/arabic.ts +++ b/packages/survey-creator-core/src/presets/localization/arabic.ts @@ -74,9 +74,9 @@ export const arStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "JSON لتطبيقه عند تحديد المستخدمين لعنصر مربع الأدوات هذا", // [Auto-translated] "Subcategories" - subcategories: "الفئات الفرعيه", + subitems: "الفئات الفرعيه", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "تمكين العناصر الفرعية لهذا السؤال...", + enableSubitems: "تمكين العناصر الفرعية لهذا السؤال...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "نقل كعنصر فرعي إلى...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/bulgarian.ts b/packages/survey-creator-core/src/presets/localization/bulgarian.ts index 495ae76095..f1c52ac213 100644 --- a/packages/survey-creator-core/src/presets/localization/bulgarian.ts +++ b/packages/survey-creator-core/src/presets/localization/bulgarian.ts @@ -74,9 +74,9 @@ export const bgStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "JSON обект, който да се приложи, когато потребителите изберат този елемент от кутията с инструменти", // [Auto-translated] "Subcategories" - subcategories: "Подкатегории", + subitems: "Подкатегории", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Активирайте поделементи за този въпрос...", + enableSubitems: "Активирайте поделементи за този въпрос...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Преместване като поделемент към...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/burmese.ts b/packages/survey-creator-core/src/presets/localization/burmese.ts index 4c5237fe61..b714b5b6b7 100644 --- a/packages/survey-creator-core/src/presets/localization/burmese.ts +++ b/packages/survey-creator-core/src/presets/localization/burmese.ts @@ -64,9 +64,9 @@ export const mmStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "သုံးစွဲသူတွေက ဒီကိရိယာအိတ် အချက်အလက်ကို ရွေးတဲ့အခါ အသုံးချဖို့ JSON အရာဝတ္ထု", // [Auto-translated] "Subcategories" - subcategories: "အမျိုးအစား ခွဲ များ", + subitems: "အမျိုးအစား ခွဲ များ", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "ဒီမေးခွန်းအတွက် အစိတ်အပိုင်းများကို ခွင့်ပြုပါ...", + enableSubitems: "ဒီမေးခွန်းအတွက် အစိတ်အပိုင်းများကို ခွင့်ပြုပါ...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "အပိုင်းအပိုင်းတစ်ခုအဖြစ် ရွှေ့ပြောင်းပါ...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/croatian.ts b/packages/survey-creator-core/src/presets/localization/croatian.ts index 04df9028ea..d36c6cac82 100644 --- a/packages/survey-creator-core/src/presets/localization/croatian.ts +++ b/packages/survey-creator-core/src/presets/localization/croatian.ts @@ -74,9 +74,9 @@ export const hrStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "JSON objekt koji će se primijeniti kada korisnici odaberu ovu stavku alata", // [Auto-translated] "Subcategories" - subcategories: "Podkategorije", + subitems: "Podkategorije", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Omogućite podstavke za ovo pitanje...", + enableSubitems: "Omogućite podstavke za ovo pitanje...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Premjesti kao podstavku u...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/czech.ts b/packages/survey-creator-core/src/presets/localization/czech.ts index 2b148530d8..22c2b0ae84 100644 --- a/packages/survey-creator-core/src/presets/localization/czech.ts +++ b/packages/survey-creator-core/src/presets/localization/czech.ts @@ -74,9 +74,9 @@ export const csStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "Objekt JSON, který se použije, když uživatelé vyberou tuto položku panelu nástrojů", // [Auto-translated] "Subcategories" - subcategories: "Podkategorie", + subitems: "Podkategorie", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Povolit podpoložky pro tuto otázku...", + enableSubitems: "Povolit podpoložky pro tuto otázku...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Přesunout jako podpoložku do...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/danish.ts b/packages/survey-creator-core/src/presets/localization/danish.ts index 419fe32237..ce798050bf 100644 --- a/packages/survey-creator-core/src/presets/localization/danish.ts +++ b/packages/survey-creator-core/src/presets/localization/danish.ts @@ -74,9 +74,9 @@ export const daStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "JSON-objekt, der skal anvendes, når brugere vælger dette værktøjskasseelement", // [Auto-translated] "Subcategories" - subcategories: "Underkategorier", + subitems: "Underkategorier", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Aktiver underelementer for dette spørgsmål...", + enableSubitems: "Aktiver underelementer for dette spørgsmål...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Flyt som et underemne til...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/dutch.ts b/packages/survey-creator-core/src/presets/localization/dutch.ts index 0307339747..e3a59cd6cf 100644 --- a/packages/survey-creator-core/src/presets/localization/dutch.ts +++ b/packages/survey-creator-core/src/presets/localization/dutch.ts @@ -74,9 +74,9 @@ export const nlStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "JSON-object dat moet worden toegepast wanneer gebruikers dit toolbox-item selecteren", // [Auto-translated] "Subcategories" - subcategories: "Subcategorieën", + subitems: "Subcategorieën", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Schakel subitems in voor deze vraag...", + enableSubitems: "Schakel subitems in voor deze vraag...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Verplaats als subitem naar...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/english.ts b/packages/survey-creator-core/src/presets/localization/english.ts index bb66a95a7a..4247c2ddaa 100644 --- a/packages/survey-creator-core/src/presets/localization/english.ts +++ b/packages/survey-creator-core/src/presets/localization/english.ts @@ -39,8 +39,8 @@ export const enStrings = { tooltip: "Tooltip", iconName: "Icon name", jsonObject: "JSON object to apply when users select this toolbox item", - subcategories: "Subcategories", - convertToSubcategory: "Enable subitems for this question...", + subitems: "Subitems", + enableSubitems: "Enable subitems for this question", moveAsSubitem: "Move as a subitem to...", addToToolbox: "Add to Toolbox", deleteCustomItem: "Delete Custom Item", @@ -60,7 +60,7 @@ export const enStrings = { noCategoriesText: "No categories", noItemsText: "Drag properties here to show them", noHiddenItemsText: "Drag properties here to hide them", - hiddenItems: "Unsorted items", + hiddenItems: "Hidden properties", categoryName: "Name", categoryTitle: "Title", iconName: "Icon name", @@ -76,7 +76,7 @@ export const enStrings = { addCustomCategory: "New Category", newCategory: "New category in", moveToCategory: "Move to category...", - moveToNewCategory: "Move to new category...", + moveToNewCategory: "Move to new category", categoriesLabel: "Categories", moveTo: "Move To...", removeFrom: "Remove from {0}", diff --git a/packages/survey-creator-core/src/presets/localization/finnish.ts b/packages/survey-creator-core/src/presets/localization/finnish.ts index 8d579cbe7f..695256d561 100644 --- a/packages/survey-creator-core/src/presets/localization/finnish.ts +++ b/packages/survey-creator-core/src/presets/localization/finnish.ts @@ -74,9 +74,9 @@ export const fiStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "JSON-objekti, jota käytetään, kun käyttäjät valitsevat tämän työkalupalkin kohteen", // [Auto-translated] "Subcategories" - subcategories: "Alaluokat", + subitems: "Alaluokat", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Ota tämän kysymyksen alakohdat käyttöön...", + enableSubitems: "Ota tämän kysymyksen alakohdat käyttöön...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Siirrä alikohteena...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/french.ts b/packages/survey-creator-core/src/presets/localization/french.ts index 161d484de1..1a2c39944d 100644 --- a/packages/survey-creator-core/src/presets/localization/french.ts +++ b/packages/survey-creator-core/src/presets/localization/french.ts @@ -74,9 +74,9 @@ export const frStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "Objet JSON à appliquer lorsque les utilisateurs sélectionnent cet élément de la boîte à outils", // [Auto-translated] "Subcategories" - subcategories: "Sous-catégories", + subitems: "Sous-catégories", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Activez les sous-éléments pour cette question...", + enableSubitems: "Activez les sous-éléments pour cette question...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Déplacer en tant que sous-élément vers...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/german.ts b/packages/survey-creator-core/src/presets/localization/german.ts index 8d3b6d7ba4..3cdb5ffa47 100644 --- a/packages/survey-creator-core/src/presets/localization/german.ts +++ b/packages/survey-creator-core/src/presets/localization/german.ts @@ -74,9 +74,9 @@ export const deStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "JSON-Objekt, das angewendet werden soll, wenn Benutzer dieses Toolboxelement auswählen", // [Auto-translated] "Subcategories" - subcategories: "Unterkategorie", + subitems: "Unterkategorie", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Aktivieren Sie Unterpunkte für diese Frage...", + enableSubitems: "Aktivieren Sie Unterpunkte für diese Frage...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Als Unterelement verschieben nach...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/greek.ts b/packages/survey-creator-core/src/presets/localization/greek.ts index 9b17a8a3d3..12b88810ad 100644 --- a/packages/survey-creator-core/src/presets/localization/greek.ts +++ b/packages/survey-creator-core/src/presets/localization/greek.ts @@ -74,9 +74,9 @@ export const elStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "Αντικείμενο JSON για εφαρμογή όταν οι χρήστες επιλέγουν αυτό το στοιχείο εργαλειοθήκης", // [Auto-translated] "Subcategories" - subcategories: "Υποκατηγορίες", + subitems: "Υποκατηγορίες", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Ενεργοποιήστε τα δευτερεύοντα στοιχεία για αυτήν την ερώτηση...", + enableSubitems: "Ενεργοποιήστε τα δευτερεύοντα στοιχεία για αυτήν την ερώτηση...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Μετακίνηση ως υποστοιχείο σε...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/haitian-creole.ts b/packages/survey-creator-core/src/presets/localization/haitian-creole.ts index 62112d98da..2bc8db51c4 100644 --- a/packages/survey-creator-core/src/presets/localization/haitian-creole.ts +++ b/packages/survey-creator-core/src/presets/localization/haitian-creole.ts @@ -74,9 +74,9 @@ export const htStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "JSON objè pou aplike lè itilizatè yo chwazi atik bwat zouti sa a", // [Auto-translated] "Subcategories" - subcategories: "Sous-kategori", + subitems: "Sous-kategori", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Pèmèt subitems pou kesyon sa a...", + enableSubitems: "Pèmèt subitems pou kesyon sa a...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Deplase kòm yon subitem pou...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/hebrew.ts b/packages/survey-creator-core/src/presets/localization/hebrew.ts index 810a8d9fe5..d88d5d6336 100644 --- a/packages/survey-creator-core/src/presets/localization/hebrew.ts +++ b/packages/survey-creator-core/src/presets/localization/hebrew.ts @@ -74,9 +74,9 @@ export const heStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "JSON להחלה כאשר משתמשים בוחרים בפריט ארגז כלים זה", // [Auto-translated] "Subcategories" - subcategories: "קטגוריות משנה", + subitems: "קטגוריות משנה", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "אפשר פריטי משנה לשאלה זו...", + enableSubitems: "אפשר פריטי משנה לשאלה זו...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "העבר כפריט משנה אל...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/hungarian.ts b/packages/survey-creator-core/src/presets/localization/hungarian.ts index ad906401b7..8289726bf7 100644 --- a/packages/survey-creator-core/src/presets/localization/hungarian.ts +++ b/packages/survey-creator-core/src/presets/localization/hungarian.ts @@ -74,9 +74,9 @@ export const huStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "JSON-objektum, amelyet akkor kell alkalmazni, amikor a felhasználók kiválasztják ezt az eszközkészlet-elemet", // [Auto-translated] "Subcategories" - subcategories: "Alkategóriák", + subitems: "Alkategóriák", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Engedélyezze a kérdés alelemeit...", + enableSubitems: "Engedélyezze a kérdés alelemeit...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Áthelyezés alelemként a...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/indonesian.ts b/packages/survey-creator-core/src/presets/localization/indonesian.ts index 45954b0641..8f855f13a0 100644 --- a/packages/survey-creator-core/src/presets/localization/indonesian.ts +++ b/packages/survey-creator-core/src/presets/localization/indonesian.ts @@ -74,9 +74,9 @@ export const idStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "JSON untuk diterapkan saat pengguna memilih item toolbox ini", // [Auto-translated] "Subcategories" - subcategories: "Subkategori", + subitems: "Subkategori", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Aktifkan subitem untuk pertanyaan ini...", + enableSubitems: "Aktifkan subitem untuk pertanyaan ini...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Pindah sebagai subitem ke...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/italian.ts b/packages/survey-creator-core/src/presets/localization/italian.ts index ced131bd64..784e6654d2 100644 --- a/packages/survey-creator-core/src/presets/localization/italian.ts +++ b/packages/survey-creator-core/src/presets/localization/italian.ts @@ -74,9 +74,9 @@ export const itStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "Oggetto JSON da applicare quando gli utenti selezionano questo elemento della casella degli strumenti", // [Auto-translated] "Subcategories" - subcategories: "Sottocategorie", + subitems: "Sottocategorie", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Abilita gli elementi secondari per questa domanda...", + enableSubitems: "Abilita gli elementi secondari per questa domanda...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Sposta come sottoelemento in...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/japanese.ts b/packages/survey-creator-core/src/presets/localization/japanese.ts index 1920164479..571d9540dc 100644 --- a/packages/survey-creator-core/src/presets/localization/japanese.ts +++ b/packages/survey-creator-core/src/presets/localization/japanese.ts @@ -74,9 +74,9 @@ export const jaStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "ユーザーがこのツールボックス項目を選択したときに適用する JSON オブジェクト", // [Auto-translated] "Subcategories" - subcategories: "サブカテゴリ", + subitems: "サブカテゴリ", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "この質問のサブ項目を有効にしてください...", + enableSubitems: "この質問のサブ項目を有効にしてください...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "サブアイテムとして移動する...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/korean.ts b/packages/survey-creator-core/src/presets/localization/korean.ts index 585ae43874..54037989e2 100644 --- a/packages/survey-creator-core/src/presets/localization/korean.ts +++ b/packages/survey-creator-core/src/presets/localization/korean.ts @@ -74,9 +74,9 @@ export const koStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "사용자가 이 도구 상자 항목을 선택할 때 적용할 JSON 개체", // [Auto-translated] "Subcategories" - subcategories: "하위 범주", + subitems: "하위 범주", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "이 질문에 대한 하위 항목 활성화...", + enableSubitems: "이 질문에 대한 하위 항목 활성화...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "하위 항목으로 이동...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/malay.ts b/packages/survey-creator-core/src/presets/localization/malay.ts index b6166b2e2b..edc58bc129 100644 --- a/packages/survey-creator-core/src/presets/localization/malay.ts +++ b/packages/survey-creator-core/src/presets/localization/malay.ts @@ -74,9 +74,9 @@ export const msStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "Objek JSON untuk digunakan apabila pengguna memilih item kotak alat ini", // [Auto-translated] "Subcategories" - subcategories: "Subkategori", + subitems: "Subkategori", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Dayakan subitem untuk soalan ini...", + enableSubitems: "Dayakan subitem untuk soalan ini...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Bergerak sebagai subitem ke...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/mongolian.ts b/packages/survey-creator-core/src/presets/localization/mongolian.ts index f07a9b649c..6cc0ce8120 100644 --- a/packages/survey-creator-core/src/presets/localization/mongolian.ts +++ b/packages/survey-creator-core/src/presets/localization/mongolian.ts @@ -74,9 +74,9 @@ export const mnStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "JSON объект хэрэглэгчид энэ toolbox элементийг сонгоход хэрэглэнэ", // [Auto-translated] "Subcategories" - subcategories: "Дэд ангилал", + subitems: "Дэд ангилал", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Энэ асуултын дэд элементүүдийг идэвхжүүл...", + enableSubitems: "Энэ асуултын дэд элементүүдийг идэвхжүүл...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Дэд зүйл болгон шилжүүлнэ...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/norwegian.ts b/packages/survey-creator-core/src/presets/localization/norwegian.ts index e44e0adde9..164572c2df 100644 --- a/packages/survey-creator-core/src/presets/localization/norwegian.ts +++ b/packages/survey-creator-core/src/presets/localization/norwegian.ts @@ -74,9 +74,9 @@ export const nbStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "JSON-objekt som skal brukes når brukere velger dette verktøykasseelementet", // [Auto-translated] "Subcategories" - subcategories: "Underkategorier", + subitems: "Underkategorier", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Aktiver underelementer for dette spørsmålet...", + enableSubitems: "Aktiver underelementer for dette spørsmålet...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Flytt som et underelement til...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/persian.ts b/packages/survey-creator-core/src/presets/localization/persian.ts index 9c59189fd4..6b6033517a 100644 --- a/packages/survey-creator-core/src/presets/localization/persian.ts +++ b/packages/survey-creator-core/src/presets/localization/persian.ts @@ -74,9 +74,9 @@ export const faStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "JSON برای اعمال زمانی که کاربران این مورد جعبه ابزار را انتخاب می کنند", // [Auto-translated] "Subcategories" - subcategories: "زیر مجموعه ها", + subitems: "زیر مجموعه ها", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "موارد فرعی را برای این سوال فعال کنید...", + enableSubitems: "موارد فرعی را برای این سوال فعال کنید...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "به عنوان یک زیر آیتم به...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/polish.ts b/packages/survey-creator-core/src/presets/localization/polish.ts index f8421efb4c..efb6674017 100644 --- a/packages/survey-creator-core/src/presets/localization/polish.ts +++ b/packages/survey-creator-core/src/presets/localization/polish.ts @@ -74,9 +74,9 @@ export const plStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "Obiekt JSON do zastosowania, gdy użytkownicy wybiorą ten element przybornika", // [Auto-translated] "Subcategories" - subcategories: "Podkategorie", + subitems: "Podkategorie", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Włącz elementy podrzędne dla tego pytania...", + enableSubitems: "Włącz elementy podrzędne dla tego pytania...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Przenieś jako element podrzędny do...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/portuguese.ts b/packages/survey-creator-core/src/presets/localization/portuguese.ts index 5df5da7e6e..02be954bae 100644 --- a/packages/survey-creator-core/src/presets/localization/portuguese.ts +++ b/packages/survey-creator-core/src/presets/localization/portuguese.ts @@ -74,9 +74,9 @@ export const ptStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "JSON a ser aplicado quando os usuários selecionam este item da caixa de ferramentas", // [Auto-translated] "Subcategories" - subcategories: "Subcategorias", + subitems: "Subcategorias", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Habilitar subitens para esta pergunta...", + enableSubitems: "Habilitar subitens para esta pergunta...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Mover como um subitem para...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/romanian.ts b/packages/survey-creator-core/src/presets/localization/romanian.ts index 3cdfef5254..5816742e90 100644 --- a/packages/survey-creator-core/src/presets/localization/romanian.ts +++ b/packages/survey-creator-core/src/presets/localization/romanian.ts @@ -74,9 +74,9 @@ export const roStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "Obiect JSON de aplicat atunci când utilizatorii selectează acest element din caseta de instrumente", // [Auto-translated] "Subcategories" - subcategories: "Subcategorii", + subitems: "Subcategorii", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Activați subelemente pentru această întrebare...", + enableSubitems: "Activați subelemente pentru această întrebare...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Mutați ca subelement în...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/russian.ts b/packages/survey-creator-core/src/presets/localization/russian.ts index 4f251a5ce6..6c783ad90e 100644 --- a/packages/survey-creator-core/src/presets/localization/russian.ts +++ b/packages/survey-creator-core/src/presets/localization/russian.ts @@ -74,9 +74,9 @@ export const ruStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "Объект JSON, который будет применяться при выборе пользователем этого элемента панели инструментов", // [Auto-translated] "Subcategories" - subcategories: "Подкатегории", + subitems: "Подкатегории", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Включите подпункты для этого вопроса...", + enableSubitems: "Включите подпункты для этого вопроса...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Переместить в качестве подэлемента в...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/simplified-chinese.ts b/packages/survey-creator-core/src/presets/localization/simplified-chinese.ts index 00e31d2ab9..3b23ddc3c9 100644 --- a/packages/survey-creator-core/src/presets/localization/simplified-chinese.ts +++ b/packages/survey-creator-core/src/presets/localization/simplified-chinese.ts @@ -74,9 +74,9 @@ export const zhCnStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "当用户选择此工具箱项时要应用的 JSON 对象", // [Auto-translated] "Subcategories" - subcategories: "子类别", + subitems: "子类别", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "为此问题启用子项...", + enableSubitems: "为此问题启用子项...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "作为子项移动到...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/slovak.ts b/packages/survey-creator-core/src/presets/localization/slovak.ts index 1bb5b51aef..bfc7ac2a33 100644 --- a/packages/survey-creator-core/src/presets/localization/slovak.ts +++ b/packages/survey-creator-core/src/presets/localization/slovak.ts @@ -74,9 +74,9 @@ export const skStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "Objekt JSON, ktorý sa použije, keď používatelia vyberú túto položku panela nástrojov", // [Auto-translated] "Subcategories" - subcategories: "Podkategórie", + subitems: "Podkategórie", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Povoliť podpoložky pre túto otázku...", + enableSubitems: "Povoliť podpoložky pre túto otázku...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Presunúť ako podpoložku do...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/slovenian.ts b/packages/survey-creator-core/src/presets/localization/slovenian.ts index 59d55fa4df..f73c661373 100644 --- a/packages/survey-creator-core/src/presets/localization/slovenian.ts +++ b/packages/survey-creator-core/src/presets/localization/slovenian.ts @@ -74,9 +74,9 @@ export const slStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "Predmet JSON, ki se uporabi, ko uporabniki izberejo ta element zbirke orodij", // [Auto-translated] "Subcategories" - subcategories: "Podkategorije", + subitems: "Podkategorije", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Omogočite podelemente za to vprašanje ...", + enableSubitems: "Omogočite podelemente za to vprašanje ...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Premakni kot podelement v...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/spanish.ts b/packages/survey-creator-core/src/presets/localization/spanish.ts index 9739c57a14..b732a05a22 100644 --- a/packages/survey-creator-core/src/presets/localization/spanish.ts +++ b/packages/survey-creator-core/src/presets/localization/spanish.ts @@ -74,9 +74,9 @@ export const esStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "Objeto JSON que se aplicará cuando los usuarios seleccionen este elemento de la caja de herramientas", // [Auto-translated] "Subcategories" - subcategories: "Subcategorías", + subitems: "Subcategorías", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Habilite los subelementos para esta pregunta...", + enableSubitems: "Habilite los subelementos para esta pregunta...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Mover como subelemento a...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/swedish.ts b/packages/survey-creator-core/src/presets/localization/swedish.ts index 5a29b6dbfa..a8e7f57755 100644 --- a/packages/survey-creator-core/src/presets/localization/swedish.ts +++ b/packages/survey-creator-core/src/presets/localization/swedish.ts @@ -74,9 +74,9 @@ export const svStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "JSON-objekt som ska användas när användare väljer det här verktygslådeobjektet", // [Auto-translated] "Subcategories" - subcategories: "Underkategorier", + subitems: "Underkategorier", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Aktivera underobjekt för den här frågan...", + enableSubitems: "Aktivera underobjekt för den här frågan...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Flytta som ett underobjekt till...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/thai.ts b/packages/survey-creator-core/src/presets/localization/thai.ts index fc5eda2642..b0dd423423 100644 --- a/packages/survey-creator-core/src/presets/localization/thai.ts +++ b/packages/survey-creator-core/src/presets/localization/thai.ts @@ -74,9 +74,9 @@ export const thStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "ออบเจ็กต์ JSON ที่จะนําไปใช้เมื่อผู้ใช้เลือกรายการกล่องเครื่องมือนี้", // [Auto-translated] "Subcategories" - subcategories: "หมวดหมู่ย่อย", + subitems: "หมวดหมู่ย่อย", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "เปิดใช้งานรายการย่อยสําหรับคําถามนี้...", + enableSubitems: "เปิดใช้งานรายการย่อยสําหรับคําถามนี้...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "ย้ายเป็นรายการย่อยไปยัง...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/traditional-chinese.ts b/packages/survey-creator-core/src/presets/localization/traditional-chinese.ts index 61634e4911..a74b12fbfc 100644 --- a/packages/survey-creator-core/src/presets/localization/traditional-chinese.ts +++ b/packages/survey-creator-core/src/presets/localization/traditional-chinese.ts @@ -74,9 +74,9 @@ export const zhTwStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "當使用者選取此工具箱項目時要套用的 JSON 物件", // [Auto-translated] "Subcategories" - subcategories: "子類別", + subitems: "子類別", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "啟用此問題的子項目...", + enableSubitems: "啟用此問題的子項目...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "作為子項目移動到...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/localization/turkish.ts b/packages/survey-creator-core/src/presets/localization/turkish.ts index b3df90089d..393f513e2c 100644 --- a/packages/survey-creator-core/src/presets/localization/turkish.ts +++ b/packages/survey-creator-core/src/presets/localization/turkish.ts @@ -74,9 +74,9 @@ export const trStrings = { // [Auto-translated] "JSON object to apply when users select this toolbox item" jsonObject: "Kullanıcılar bu araç kutusu öğesini seçtiğinde uygulanacak JSON nesnesi", // [Auto-translated] "Subcategories" - subcategories: "Alt kategori", + subitems: "Alt kategori", // [Auto-translated] "Enable subitems for this question..." - convertToSubcategory: "Bu soru için alt öğeleri etkinleştirin...", + enableSubitems: "Bu soru için alt öğeleri etkinleştirin...", // [Auto-translated] "Move as a subitem to..." moveAsSubitem: "Bir alt öğe olarak şuraya taşı...", // [Auto-translated] "Add to Toolbox" diff --git a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts index a23cb39470..2e9a71cbbb 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-categorized.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-categorized.ts @@ -170,9 +170,9 @@ export class CreatorPresetEditableCaregorizedListConfigurator extends CreatorPre }, { items: [], showPointer: false, - verticalPosition: "top", + verticalPosition: "bottom", horizontalPosition: "center", - cssClass: "sps-popup-menu", + cssClass: "sps-popup-menu sps-popup-menu--context", cssClasses: listComponentCss, searchEnabled: false }); diff --git a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts index 16c8acda03..880fdc3cfe 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-toolbox.ts @@ -254,14 +254,14 @@ export class CreatorPresetEditableToolboxConfigurator extends CreatorPresetEdita if (question.name == this.nameItems || question.name == this.nameInnerMatrix) { actions.push(new Action({ id: "subcategories", - title: getLocString("presets.toolbox.subcategories"), + title: getLocString("presets.toolbox.subitems"), css: "sps-list__item--label", enabled: false, needSeparator: true })); actions.push(new Action({ id: "convert-to-subcategory", - title: getLocString("presets.toolbox.convertToSubcategory"), + title: getLocString("presets.toolbox.enableSubitems"), action: () => { const destination = hasCategories ? this.getQuestionCategories(model) : this.getQuestionItems(model); const destValue = JSON.parse(JSON.stringify(destination.value)); diff --git a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss index 3efd74a28b..7a00cb0f60 100644 --- a/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss +++ b/packages/survey-creator-core/src/presets/presets-theme/blocks/sps-popup.scss @@ -8,8 +8,8 @@ } .sv-popup__container { border: initial; - padding: 0 var(--sjs2-spacing-x150, 12px); - margin: -13px 0; + + padding: var(--sjs2-spacing-x150, 12px); box-shadow: initial; background: initial; @@ -28,6 +28,12 @@ } } +.sps-popup-menu.sps-popup-menu--context { + .sv-popup__container { + padding: 0 var(--sjs2-spacing-x100, 8px); + } +} + .sps-popup { From 2920024a46523dea051e464fa0f7945245bad7ac Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Fri, 17 Oct 2025 18:27:29 +0300 Subject: [PATCH 203/240] #7004 - changes to examples in angular and vue --- devops-pull-requests.yml | 2 ++ .../example/angular-ui/src/app/app.module.ts | 3 ++- .../angular-ui/src/app/router.module.ts | 2 ++ .../src/app/test/presets.component.ts | 22 +++++++++++++++++++ .../example/src/components/test/Presets.vue | 12 ++++++++++ .../example/src/router/index.ts | 4 +++- 6 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 packages/survey-creator-angular/example/angular-ui/src/app/test/presets.component.ts create mode 100644 packages/survey-creator-vue/example/src/components/test/Presets.vue diff --git a/devops-pull-requests.yml b/devops-pull-requests.yml index 70e078786d..8f36e269db 100644 --- a/devops-pull-requests.yml +++ b/devops-pull-requests.yml @@ -125,6 +125,7 @@ jobs: npm run build:i18n npm run build npm run build:themes + npm run build:presets displayName: "Build Creator V2 Core" - script: | @@ -317,6 +318,7 @@ jobs: - script: | cd $(Build.SourcesDirectory)/survey-creator/packages/survey-creator-react npm run build + npm run build:presets displayName: "Build CreatorV2 React" - script: | diff --git a/packages/survey-creator-angular/example/angular-ui/src/app/app.module.ts b/packages/survey-creator-angular/example/angular-ui/src/app/app.module.ts index 67a68859ad..f70bc63860 100644 --- a/packages/survey-creator-angular/example/angular-ui/src/app/app.module.ts +++ b/packages/survey-creator-angular/example/angular-ui/src/app/app.module.ts @@ -18,10 +18,11 @@ import { TestDropdownCollapseComponent } from "./test/dropdown-collapse.componen import { TestLocalizationComponent } from "./test/localization.component"; import { ThemeTabComponent } from "./test/test-theme-tab.component"; import { NoLicenseComponent } from "./test/test-no-license.component"; +import { PresetsComponent } from "./test/presets.component"; @NgModule({ declarations: [ - AppComponent, ExampleComponent, TestDefaultComponent, TestThemeSwitcherComponent, ThemePreviewComponent, TestByPageComponent, TestCustomWidgetComponent, TestDropdownCollapseComponent, TestLocalizationComponent, ThemeTabComponent, NoLicenseComponent + AppComponent, ExampleComponent, TestDefaultComponent, TestThemeSwitcherComponent, ThemePreviewComponent, TestByPageComponent, TestCustomWidgetComponent, TestDropdownCollapseComponent, TestLocalizationComponent, ThemeTabComponent, NoLicenseComponent, PresetsComponent ], imports: [ BrowserModule, SurveyCreatorModule, FormsModule, SurveyModule, AppRoutingModule, PresetsModule diff --git a/packages/survey-creator-angular/example/angular-ui/src/app/router.module.ts b/packages/survey-creator-angular/example/angular-ui/src/app/router.module.ts index c32de31cc4..53944f26e1 100644 --- a/packages/survey-creator-angular/example/angular-ui/src/app/router.module.ts +++ b/packages/survey-creator-angular/example/angular-ui/src/app/router.module.ts @@ -9,6 +9,7 @@ import { TestThemeSwitcherComponent } from "./test/theme-switcher.component"; import { TestLocalizationComponent } from "./test/localization.component"; import { ThemeTabComponent } from "./test/test-theme-tab.component"; import { NoLicenseComponent } from "./test/test-no-license.component"; +import { PresetsComponent } from "./test/presets.component"; import { ExampleComponent } from "./example.component"; const routes = [ @@ -21,6 +22,7 @@ const routes = [ { path: "testCafe/dropdown-collapse-view", component: TestDropdownCollapseComponent }, { path: "testCafe/testcafe-theme-tab", component: ThemeTabComponent }, { path: "testCafe/testcafe-no-license", component: NoLicenseComponent }, + { path: "testCafe/presets", component: PresetsComponent }, { path: "", component: ExampleComponent } ]; diff --git a/packages/survey-creator-angular/example/angular-ui/src/app/test/presets.component.ts b/packages/survey-creator-angular/example/angular-ui/src/app/test/presets.component.ts new file mode 100644 index 0000000000..9d29f93c08 --- /dev/null +++ b/packages/survey-creator-angular/example/angular-ui/src/app/test/presets.component.ts @@ -0,0 +1,22 @@ +import { Component, ViewEncapsulation } from "@angular/core"; +import { SurveyCreatorModel } from "survey-creator-core"; +import { TestDefaultComponent } from "./default.component"; +import { TabPresetsPlugin } from "survey-creator-core/presets"; +@Component({ + selector: "test-theme-preview", + templateUrl: "./test.component.html", + encapsulation: ViewEncapsulation.None +}) +export class PresetsComponent extends TestDefaultComponent { + constructor() { + super(); + } + protected override getSlk(): boolean { return false; } + protected override createCreator(): void { + this.creator = new SurveyCreatorModel({ expandCollapseButtonVisibility: "never", showLogicTab: true, showTranslationTab: true }); + this.creator.tabResponsivenessMode = "menu"; + this.creator["animationEnabled"] = false; + this.creator.allowZoom = false; + new TabPresetsPlugin((window as any).creator); + } +} \ No newline at end of file diff --git a/packages/survey-creator-vue/example/src/components/test/Presets.vue b/packages/survey-creator-vue/example/src/components/test/Presets.vue new file mode 100644 index 0000000000..0a2338c9d9 --- /dev/null +++ b/packages/survey-creator-vue/example/src/components/test/Presets.vue @@ -0,0 +1,12 @@ + + \ No newline at end of file diff --git a/packages/survey-creator-vue/example/src/router/index.ts b/packages/survey-creator-vue/example/src/router/index.ts index c6fd6154c8..cf4fa7fddf 100644 --- a/packages/survey-creator-vue/example/src/router/index.ts +++ b/packages/survey-creator-vue/example/src/router/index.ts @@ -9,6 +9,7 @@ import NoLicense from "../components/test/NoLicense.vue"; import ByPage from "../components/test/ByPage.vue"; import DropdownCollapse from "../components/test/DropdownCollapse.vue"; import CustomWidget from "../components/test/CustomWidget.vue"; +import Presets from "../components/test/Presets.vue"; import Example from '@/components/Example.vue'; @@ -24,7 +25,8 @@ const router = createRouter({ { path: "/testCafe/testcafe_localized_ui", component: Localization }, { path: "/testCafe/dropdown-collapse-view", component: DropdownCollapse }, { path: "/testCafe/testcafe-theme-tab", component: ThemeTab }, - { path: "/testCafe/testcafe-no-license", component: NoLicense } + { path: "/testCafe/testcafe-no-license", component: NoLicense }, + { path: "/testCafe/presets", component: Presets } ] }) From 696340c61bc909c9e429951fcf4d116022efc8d8 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 20 Oct 2025 09:46:54 +0300 Subject: [PATCH 204/240] #7004 Fixed unit test --- .../tests-presets/presets-editable-base.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-core/tests-presets/presets-editable-base.test.ts b/packages/survey-creator-core/tests-presets/presets-editable-base.test.ts index 60df6ccf6d..de0df15d83 100644 --- a/packages/survey-creator-core/tests-presets/presets-editable-base.test.ts +++ b/packages/survey-creator-core/tests-presets/presets-editable-base.test.ts @@ -44,7 +44,7 @@ describe("CreatorPresetEditableBase", () => { // Create mock matrix mockMatrix = new QuestionMatrixDynamicModel("matrix"); mockMatrix.fromJSON({ - detailElements: [{ type: "text", name: "question1", isRequired: true }] + detailElements: [{ type: "text", name: "question1", isRequired: true, visible: false }] }); mockMatrix.value = [{ question1: "initial value" }]; mockRow = mockMatrix.visibleRows[0] as any; From 5c388b6f86db69014ec038e4752a3d74e70b6555 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 20 Oct 2025 10:12:20 +0300 Subject: [PATCH 205/240] #7004 - fix adding categories after delete --- .../survey-creator-core/src/presets/presets-editable-base.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/survey-creator-core/src/presets/presets-editable-base.ts b/packages/survey-creator-core/src/presets/presets-editable-base.ts index 9ccb4fbbcc..c66e18c37f 100644 --- a/packages/survey-creator-core/src/presets/presets-editable-base.ts +++ b/packages/survey-creator-core/src/presets/presets-editable-base.ts @@ -182,7 +182,8 @@ export class CreatorPresetEditableBase { } protected showDetailPanelInPopup(matrix: QuestionMatrixDynamicModel, row: MatrixDynamicRowModel, rootElement: HTMLElement, options: {actions?: IAction[], title?: string}) { - const data = matrix.value[(matrix.visibleRows as any).findIndex(r => r === row)]; + const index = (matrix.visibleRows as any).findIndex(r => r === row); + const data = matrix.value[index]; const survey = new SurveyModel({ elements: matrix.toJSON().detailElements }); survey.fitToContainer = false; survey.showNavigationButtons = false; @@ -203,7 +204,7 @@ export class CreatorPresetEditableBase { } }); const newRowValue = { ...row.value, ...newData }; - newValue[row.index] = newRowValue; + newValue[index] = newRowValue; matrix.value = newValue; return true; } else { From 45d7e09a281a0cca1b607752d10fe939f0c30cb9 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 20 Oct 2025 13:00:03 +0300 Subject: [PATCH 206/240] #7004 devops scripts --- devops-pull-requests.yml | 3 +++ devops-visual-regression-tests.yml | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/devops-pull-requests.yml b/devops-pull-requests.yml index 8f36e269db..9ac44f9587 100644 --- a/devops-pull-requests.yml +++ b/devops-pull-requests.yml @@ -456,6 +456,7 @@ jobs: - script: | cd $(Build.SourcesDirectory)/survey-creator/packages/survey-creator-angular npm run build + npm run build:presets displayName: "Build CreatorV2 Angular" - script: | @@ -600,6 +601,7 @@ jobs: - script: | cd $(Build.SourcesDirectory)/survey-creator/packages/survey-creator-vue npm run build + npm run build:presets displayName: "Build CreatorV2 Vue" - script: | @@ -793,6 +795,7 @@ jobs: - script: | cd $(Build.SourcesDirectory)/survey-creator/packages/survey-creator-js npm run build + npm run build:presets displayName: "Build CreatorV2 JS" # - script: | diff --git a/devops-visual-regression-tests.yml b/devops-visual-regression-tests.yml index b7dc9e8c6b..3251023c27 100644 --- a/devops-visual-regression-tests.yml +++ b/devops-visual-regression-tests.yml @@ -105,6 +105,11 @@ jobs: cd $(Build.SourcesDirectory)/survey-creator/packages/survey-creator-core npm run build:themes displayName: "Build Creator V2 Core themes" + + - script: | + cd $(Build.SourcesDirectory)/survey-creator/packages/survey-creator-core + npm run build:presets + displayName: "Build Creator V2 Core presets" - task: CopyFiles@2 inputs: @@ -287,6 +292,7 @@ jobs: - script: | cd $(Build.SourcesDirectory)/survey-creator/packages/survey-creator-react npm run build + npm run build:presets displayName: "Build CreatorV2 React" @@ -458,6 +464,7 @@ jobs: - script: | cd $(Build.SourcesDirectory)/survey-creator/packages/survey-creator-angular npm run build + npm run build:presets displayName: "Build CreatorV2 Angular" - script: | @@ -638,6 +645,7 @@ jobs: - script: | cd $(Build.SourcesDirectory)/survey-creator/packages/survey-creator-vue npm run build + npm run build:presets displayName: "Build CreatorV2 Vue" - script: | @@ -865,6 +873,7 @@ jobs: - script: | cd $(Build.SourcesDirectory)/survey-creator/packages/survey-creator-js npm run build + npm run build:presets displayName: "Build CreatorV2 JS" - script: | From d1255ca5a4549eeb7d4f4c81b38c77500b8d4e32 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 20 Oct 2025 13:02:40 +0300 Subject: [PATCH 207/240] #7004 survey-creator-js --- packages/survey-creator-js/entries/presets.ts | 1 + packages/survey-creator-js/package.json | 1 + .../survey-creator-js/tsconfig.presets.json | 13 ++ .../webpack.presets.config.js | 183 ++++++++++++++++++ 4 files changed, 198 insertions(+) create mode 100644 packages/survey-creator-js/entries/presets.ts create mode 100644 packages/survey-creator-js/tsconfig.presets.json create mode 100644 packages/survey-creator-js/webpack.presets.config.js diff --git a/packages/survey-creator-js/entries/presets.ts b/packages/survey-creator-js/entries/presets.ts new file mode 100644 index 0000000000..486b91fbcb --- /dev/null +++ b/packages/survey-creator-js/entries/presets.ts @@ -0,0 +1 @@ +export * from "../../survey-creator-react/src/entries/presets"; diff --git a/packages/survey-creator-js/package.json b/packages/survey-creator-js/package.json index dc1162cbaa..f05bc99ac7 100644 --- a/packages/survey-creator-js/package.json +++ b/packages/survey-creator-js/package.json @@ -29,6 +29,7 @@ "release": "standard-version --message \"Release: %s [azurepipelines skip]\"", "remove-package-lock": "rimraf package-lock.json", "build": "webpack --env buildType=dev && webpack --env buildType=prod && rollup -c", + "build:presets": "webpack --config ./webpack.presets.config.js --env buildType=dev --env emitDeclarations && webpack --config ./webpack.presets.config.js --env buildType=prod", "watch:dev": "webpack --env buildType=dev --watch && rollup -c -w", "watch:prod": "webpack --env buildType=prod --watch", "lint": "eslint ./src", diff --git a/packages/survey-creator-js/tsconfig.presets.json b/packages/survey-creator-js/tsconfig.presets.json new file mode 100644 index 0000000000..979ad924c8 --- /dev/null +++ b/packages/survey-creator-js/tsconfig.presets.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "paths": { + "survey-creator-core": [ + "./build" + ] + } + }, + "include": [ + "./src/entries/presets.ts" + ] +} \ No newline at end of file diff --git a/packages/survey-creator-js/webpack.presets.config.js b/packages/survey-creator-js/webpack.presets.config.js new file mode 100644 index 0000000000..908c818863 --- /dev/null +++ b/packages/survey-creator-js/webpack.presets.config.js @@ -0,0 +1,183 @@ +"use strict"; + +const webpack = require("webpack"); +const path = require("path"); +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); +const TsconfigPathsPlugin = require("tsconfig-paths-webpack-plugin"); +const HtmlWebpackPlugin = require("html-webpack-plugin"); +var DashedNamePlugin = require("../../webpack-dashed-name"); +const packageJson = require("./package.json"); +const fs = require("fs"); + +const year = new Date().getFullYear(); +const banner = [ + "SurveyJS Creator Presets UI v" + packageJson.version, + "(c) 2015-" + year + " Devsoft Baltic OÜ - http://surveyjs.io/", + "Github: https://github.com/surveyjs/survey-creator", + "License: https://surveyjs.io/Licenses#SurveyCreator" +].join("\n"); + +module.exports = function (options) { + const buildPath = __dirname + "/build/"; + const isProductionBuild = options.buildType === "prod"; + const emitDeclarations = !!options.emitDeclarations; + const emitNonSourceFiles = !!options.emitNonSourceFiles; + + const compilerOptions = emitDeclarations ? {} : { + declaration: false, + declarationDir: null + }; + + const config = { + mode: isProductionBuild ? "production" : "development", + entry: { + "survey-creator-js-presets": path.resolve(__dirname, "./entries/presets.ts") + }, + resolve: { + extensions: [".ts", ".js", ".tsx", ".scss"], + plugins: [new TsconfigPathsPlugin({ configFile: "./tsconfig.json" })], + alias: { + tslib: path.join(__dirname, "./src/entries/helpers.ts") + } + }, + optimization: { + minimize: isProductionBuild + }, + module: { + rules: [ + { + test: /\.(ts|tsx)$/, + loader: "ts-loader", + options: { + configFile: options.tsConfigFile || "tsconfig.json", + compilerOptions + } + }, + { + test: /\.s(c|a)ss$/, + use: [ + MiniCssExtractPlugin.loader, + { + loader: "css-loader", + options: { + sourceMap: options.buildType !== "prod" + } + }, + { + loader: "sass-loader", + options: { + sourceMap: options.buildType !== "prod" + } + } + ] + }, + { + test: /\.html$/, + exclude: [/node_modules/, require.resolve("./index.html")], + loader: "html-loader" + }, + { + test: /\.(svg|png)$/, + use: { + loader: "url-loader", + options: {} + } + } + ] + }, + output: { + path: buildPath, + filename: "[name]" + (isProductionBuild ? ".min" : "") + ".js", + library: { + root: options.libraryName || "SurveyCreatorPresets", + amd: "[dashedname]", + commonjs: "[dashedname]", + }, + libraryTarget: "umd", + globalObject: "this", + umdNamedDefine: true + }, + externals: { + react: { + root: "React", + commonjs2: "react", + commonjs: "react", + amd: "react" + }, + "react-dom": { + root: "ReactDOM", + commonjs2: "react-dom", + commonjs: "react-dom", + amd: "react-dom" + }, + "survey-core": { + root: "Survey", + commonjs2: "survey-core", + commonjs: "survey-core", + amd: "survey-core" + }, + "survey-js-ui": { + root: "SurveyReact", + commonjs2: "survey-js-ui", + commonjs: "survey-js-ui", + amd: "survey-js-ui" + }, + "survey-creator-core": { + root: "SurveyCreatorCore", + commonjs2: "survey-creator-core", + commonjs: "survey-creator-core", + amd: "survey-creator-core" + }, + "survey-creator-core-presets": { + root: "SurveyCreatorCorePresets", + commonjs2: "survey-creator-core-presets", + commonjs: "survey-creator-core-presets", + amd: "survey-creator-core-presets" + }, + "survey-creator-js": { + root: "SurveyCreator", + commonjs2: "survey-creator-js", + commonjs: "survey-creator-js", + amd: "survey-creator-js" + } + + }, + plugins: [ + new DashedNamePlugin(), + new webpack.DefinePlugin({ + "process.env.ENVIRONMENT": JSON.stringify(options.buildType), + "process.env.VERSION": JSON.stringify(packageJson.version) + }), + new MiniCssExtractPlugin({ + filename: isProductionBuild ? "[name].min.css" : "[name].css" + }), + new webpack.BannerPlugin({ + banner: banner + }) + ] + }; + + if (isProductionBuild) { + config.plugins.push = config.plugins.concat([]); + } else { + config.devtool = "source-map"; + config.plugins = config.plugins.concat([ + new webpack.LoaderOptionsPlugin({ debug: true }), + new HtmlWebpackPlugin({ + filename: "index.html", + inject: "body", + template: "index.html" + }), + ]); + config.devServer = { + static: { + directory: path.join(__dirname, "."), + }, + //host: "0.0.0.0", + compress: false, + port: 8082 + }; + } + + return config; +}; From 4cb5a55f54d353d08f3282784edaa17fa8df2a18 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Mon, 20 Oct 2025 15:26:52 +0300 Subject: [PATCH 208/240] #7004 - fix vue build --- packages/survey-creator-vue/example/src/components/Example.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-vue/example/src/components/Example.vue b/packages/survey-creator-vue/example/src/components/Example.vue index e60ed08438..a5932decab 100644 --- a/packages/survey-creator-vue/example/src/components/Example.vue +++ b/packages/survey-creator-vue/example/src/components/Example.vue @@ -1,7 +1,7 @@ + + + + + + + + + + + + + +

+ + + + \ No newline at end of file diff --git a/packages/survey-creator-react/testCafe/presets.html b/packages/survey-creator-react/testCafe/presets.html index 6f29a5977d..ecc48478d4 100644 --- a/packages/survey-creator-react/testCafe/presets.html +++ b/packages/survey-creator-react/testCafe/presets.html @@ -24,7 +24,7 @@ - + From d70c13c2f6c99d6be370eb6d07b32c8e41d849d0 Mon Sep 17 00:00:00 2001 From: Aleksey Novikov Date: Thu, 23 Oct 2025 16:41:28 +0300 Subject: [PATCH 219/240] #7004 - try to fix vue --- packages/survey-creator-vue/example/src/components/Example.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/survey-creator-vue/example/src/components/Example.vue b/packages/survey-creator-vue/example/src/components/Example.vue index a5932decab..e60ed08438 100644 --- a/packages/survey-creator-vue/example/src/components/Example.vue +++ b/packages/survey-creator-vue/example/src/components/Example.vue @@ -1,7 +1,7 @@ + - - + + P8~h=FoA!>FnS+9)tb9-;9^6rSCC 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 UJSY$BSpZ!(xp}qH$nDX80r&#A2mk;8 diff --git a/screenshotTests/presets.spec.ts-snapshots/presets-tabs.png b/screenshotTests/presets.spec.ts-snapshots/presets-tabs.png index bd006846505fa2b33a81e945be926fbedb2fa3e9..1c3db48980642b000a21970ec845a3b1a0402878 100644 GIT binary patch literal 42347 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 PK49>4^>bP0l+XkKGq`bz literal 45222 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�~uova?^9+gLFC+Y+q z$vL&xrXSLz*J=kmcqV0QbgZu~uPL|7GJ$~!+AgS-)UXHx$H9D_caF(*OMj9p47F$u z*RLX?f(rNp5J2-8`L0V@F)@oJ{liN^hJ$?nSjN`;Te`mzPiog=`&)Rh1@*UGz z*p!m5?qzkYi}d1vs0+^BA^rGR{{FpL&*gj>I4k9)TQ%>tVD_IaOdlVMktZl9{!i{u z`X9QrxYW^KZgq8;K@k26?LoRY*^-i!q$FX_XfmTJ?5|w85|zuF@s?U#G zNqTy<4Gj%HfBwOGVLWuAQ}}RE2hoL23>3n#g)yVD#G{Eu_qD+D{Qw^y9|eV1m1L-I z{_RAWVYT`BB17v*m%x!9F^ELKumzqh9BoX9&H3n*>X$n;EQA$0u}}!tJ&PVCCop75 zWqqHH(hQkkshJtXAijJ9xRg-)~-!X<@i8r$15)g@=yaV(Mt zmAA<<1mFMLR*yI`Q*E8m#78muEB&z?)Px__qDambzNR<~CdX|i$ycvl1poj?XY~A_ z(qhzAirAt``Lcl(JG4Z;=hjrLi2(Vz{Lra#<9a6+xv1+dM4QPQK>YTMe)(6UT03}Z zGC4W^bD_o#UZPj}SjppBgNCqKC^`Fb<;u`{5Si$P?iwew#N(f7JxjKmVHB@J?DKCB zCp2YO*0N!^DP!g$3GxGk3yqy&BC@1yO|iv)M-XXNi%g9hV!YO5V6< zi5ui8b@V+7oAJ31 z-ze{)m*eu^)ZA zO}csKj>EbU`H~CAjXQUmU4j|AC`_u!OP6j2(JI>h=cRvWzo|A}G3j7>B3C+l*<9!X zwwWqRD=AS&-=eVLqGHWad;6BD>9XU}MEvB8a-M1GA$9G)C9d;Kum3-{DK_3^uQ`Ot zSm|^gO{y9C`Q~c~WdN?X9*=~TU87J~&fe`&PF0`qGVLE%YFm3k-m)f>1sWuSO;O;P z{0hj_zFQ$xU0%jRb$^w+9znpB`V4sJg!;}ChOayEkrf*>EABNu@%-z$a9cD&Ti@Z;ED}!I|4SvSs0R0xR_$;i$jrZj`j9z6OUS2ht

?ha|r+A?u|F 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 OUj5PGG6s6{m;VIL(oWF; literal 51734 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

A_{wzRD|4BQt z)^#Ka9r;spK4^UUv#|JnEzO_w?#CLtP_%&2*8-mkyV*PKTEC}V3{#nf)0Ckb9e(8u z_GMU%?&);n<~>v{jXN2eU}~lNWIpQbD(#zw)_KyBU%_Z171Lu%4@+r=tXnErTK;ed zDdW>6REfe-;qftprH=ePGZC#BxUljQr;7wSzK~H?Tar^qSN)Ma4ttGd@xpMJ&f7=v zHh%ujc6%w86-%ZJA{X?E;j@={#xJ$h#SLz{SKS zbV*qd_V{oZT9Yv*w(vV_ltM;s_xskPLlvVRfs5W&S5~jGh0^}$NO}xoAluX0#?)t_ zxPbHNFm*$`~Z0DUaIJCLsUq4 zB%}RQ$lkWxKz*C8fys7$JTM?J5`t+H+%iR(e`Wk-(0<-wg2_qE@fy@$(Zu4oHo4ue zLjWsdv$?Mg&wJjpQ1x}YW~PmdCLcGzp&HN#NRa7cnQ)uwElfvjDsiyfEK{U zOL89i0lh9BOv*D1)XR@T8F@v)gT792ZArMFY!D5fqSU%gimgC{!!?&kyDZpsMqoG) z<=(>o=%B2o9Qi*1q7qP%k3|L`mhia2=;Y!nBx3x|ig&Dx_-s5;qay>;v*GhE_sVy_ z%74@c+i!jGdz36ce{^st$u6 zVauz6@cvSn4 zPd&d+rSg#y;01gch>6rNR`-Qys0Mrya#DHQu84i-Xv;WQ36MY5b&O;oeYpBOBG>*E zWQ3Z>vIf-QL zOLC4s!Y5?LC$=Ib;LJVGAz^{5na_~bawnPH9UCEA z%wi40K8;7i8$`;W@V;Hz&+Jx`x?Ex%tOVNHPAk7ow>(aj;UsFUavi?2ke}FTQu>kq zr`8Cw<L&cRPmw1Zi)PkO|#4={^(Hax$LUD_R zYcDepHp zqrN9>miPPrG#ffew>=06u0EA=Qu z8$ULTwZSgT>7lXM#uaG6Bf~U_hrPrBhm=IE6JphGeht&3btke#rmHT~GeP*=gwK!A z67^J7WshIf^i-+WnMv79W|%V8GU*jJMn&7VuC{r!bP%YPrdrELFr99GoNO0LcNfDhc zPm!g+4zs5VaMN1Hk}k|umr<$m`ngu8XR}yk4;s~wg9$4n*t3-;>JPr1TQ*u|o>Ys`0} zR9ZVe3J)A_Kn}>IW3xJP2yg6=NJyiK8FA8>Zm&-?xr6Xp?&D$&ROBl%+EmyWz)@ue zoS$Qn35+_m#(T7}Rx@OWyB(~SCXSgI+kAUU5jg_!^M{NO5dAt&aKPizVwaP$vikWa zVhh`;>hkpaFhteX@A6nuJA5s9_4OkUqtaEGp&Yf)Zo4ggG17nwyKs%sajPj4w8OXX z5&l)TD7v<-cwu+*lt4)Cs;N^9hhRJ&nJ#Zbi+g6jxT&5A#22dYy;5ivDG*3H6ZOmC z2w(sCrRihaTugSeNl9x7&y%dJD0k+UtSFxm(7t=4UHRXKq&dagw{HpLkM8!v8i&+N z~t0&|LGVrwn?SJ?NdnZ5+aRny1Mv}49ET10Yuz9!hI2AH2_C?fTFHt<34G)<-T4T85 ziWI1fEv-C4zs|=`XN-JZWcwT6yr$~X2}7-g<```0ceA|pj8B&qC}ZZl8lR-o=;l0_ zU|3IJ)^L|Ks`;lPR0{)Wu(4Px|2}y>eX*Qx{bL08#eeiMd<6U&kF0=2Z-lfhx1HJ* z}~H^#&L*-c?|&o^0yzV;aX| zT{BfY`_J-*8BZRSPYrV{t;5z&O4`WQ`hB3NCrV@FU7IT#*2KDD8|QoYK70rEBNHQ& zt{4%P;HLcgtQAYr@)s^TdNb!@xwiv|fg!GkkJc8>TQR!7DJAZL)BFD42*3|8!OU+@ zb>qjE1Z`_}kd14fiuKpXFKLG`4lG-Qv=lrj(*!z&G7eonxSyNRP_6hfZ%&t;cy)+-BVm0eWKmL@u|0n*q? z+$GX9hEzTV*urtgE9M6TRq=k#mysDF{lWK!>}WmLdvcyKf9u|D^u8WNA~4iEG<^1M z|BlUXZf&`Hw2n;}d{34Jtv|_NtG1aPN;&JrlcXwLIo$mH9DJHS*k)Cw+&WNCYzRZq zF-HqKu`Tlm<$$+G_*0TcgZ_8)!hVy;p0KiHG!hWaMW;1k$Sg z1pNe4#?#}m&SQ&bTdm!S?nfLxet!0MllgL~2@$9WtI?Y~JNGv?)lP8NEpp%Y>7IP_ z92XbY#KeRzy-cU+ikX@5x4_bb{R@FNnmkJ$e^)!w`CWbPk8~56bp!+&KXgCG>6zQi zS6iH4OezRJUQ99$!cO3HE@$;ZLqam#^L2vINi#h5ixMKxe}Sy}on)Z1i3!UI(s_&w zHXZ)~AjIMA4K!*!ua7-ibaTe*8=Q?bYV-VFnzv|L7lkd<*_}U}EH%0Is{QjXD~x0t z-C)=7+jUNi2&HO+xmuc~2__4kZf-oh1{T0)e)Pt~#>NH(y&bHbwX9(xMg7b${c{`vyws>SA_7VTuZ57J)*C^}@8TrdgE;mUP~*&AK1?!u!bR+%{LIYbRXz<|%?aCdV`96DR)^Z}tXbYr6QEe2U!!m`hC!w!im z%2MyK0w6 zKgQ@2Y{Blje48Ksyd68tWNyW$srS6?-&+FwCQ6%JFLfH7>}7SH35+Q+F2tx0px~KU=MVogmqrW3ArzTsHGOznGt!n~OZp-Ab#s zSU^_Zs~6_DB+<5n@7`p6-TfZ&{QOrpa=;hA7w|Md-j7R-zE7@ZW@c|yp3x};rjfb1 zTbOrA!i&%7(sgby*FXc3ub9tIs(Atp%6TZhM;lErkzxGH4SW!(wwMguxlM?8`3v+7 z9^I#*vG-l`x$>|0_9OD|(SCS8pA7&6gqs|Z|Fyu*|B;7y+ACMbW@@h#iK+D@2LwJX zh%jpvG`e$Rlu+Hz3F?-=n)+&1HG5Fqc~oGP66-VkkRGH)))4J|J(oGrmLwRdL3}j_@dz z{o%@M+uJajHH}x+N%7x%VbogkfsZFR*5lj6m`(oM(h}Y9!BI8bgK>8Ap#jarl{+$X z^iksRVZT_9W}LsvwV~T0>Vb8H_u_Lias^REmGf z)VC#Zd=n8y#4pr&JzG+Gf{4CgdP{g9%8-Ng(MfjdkH`}JSz8*`U1FFXF{InMJ;WKa z%*l9!R$?Iddt0s zBZxS-70=JY{*}v zG6^{++Zf2xc&pET8d0O9+j*?gS3HEy`}8N}7BH@ki>55i3%^Ug!llRsEtzmS72JiH zX}etQe4by_3Ixt_iJ>Q@dsSWEKP@)zO-kNTT#Y_%r`C+uuuygiw@q99`Ex32lFQp{ zI5EcEnV*)}$}41P{N3s{&&EhtNJ#{!V*hueFCds`E;mn$+wRUuJgTa3u_1mK84=;T z>G(b^wkF7a_k1g{?{>-8qy)Ypq+Gk1qOQ3Hq;=stKYVCkS`^11W!|g?f(2{qb34dDW9LFS+1uy4|s-1Sm#IS+?oH9EP5dH~*Eg3j~ku zj|uV}_qhs>jlFMlmXYi7_o`l9dLL-sHHPe1^1PHsLVG=(4uX^=z}meLB`_8ZKI>|X zXuyUxVl>T0Zs14rL!`;4A5%Wvva=`ZAEXp7Z zQru{jhT&Zq2rv@!2P{b%uMwU4Jt=K!tVjeG= z(J%Iu9U>saV9~(a_ZB$r^F7epvRA4Pf}ITl248M=ii2P+>M(e?L5xaan4Hr`NVZ?x z#{)yTl8G#6iW2+I)d&#S@#sO!V3<4F_8ItQ!?wk*tBY247rRA(LQiX4-vq8QsN9Am z4BP-QLMuhb!d4-6(R;$2_O$j(;VG$j(w+ki+b3+~gw&9M6AsnTIB=iyZkKEK+d7Nj zH?m;yN<@TV>&=mQ$U|PQBrP>}GbG?3o=NK@E)jdYTW+#o>dwq>ZY5o3ft&Rrg^f`= zT&L(K$HF|^QvT1m0AQ+1E=x}5Oa_RlOKF13fq0znK}1%xCK&#n)h28{8oL%bj@9%E z4A-Jo$AX{W5xZ1})~nOgXw(x>DnWkteo5N_YqVfG| zJUDGn=8HzeTYrKj8EfL$6PAiJNJJfvh%lY^Ka_8!_}VP2m)7-9Pshvqv_7mcPltU6 zcd?^S+hzx8o@Lk{3DR+G%#YHxrJNQ+xQx1Ur!_FJ;g&|VL!@it)&f5mjGn9ZNZzf- z@3l&#_*qiV3~)O5Ln-^AdIO~3kVr1YFS{wQ3bI4(HpzHcQ=8QD<#CSz>mD6V!pD(2 z$7f|ib~_})+v@T@o_0tN?2n3|3D!ILkbM>w<~2FmydEU0Ro8kq{}nLYQSD`khf(}w zdTGgcg$7UD{zSa(gS=@Z%w0qZ~*g^#3$|u08 z*HrZ`H{X&{8jrgY`>x*G)SC!Bi_ztgIA6H3m*3A)8Mo0KLV&0lWoj_wtS?Kc6A;~Q zASJJ6Yt0Vxyt?4cEbEnvVURFUjFJSyG4i%2 zQPVjd+i4(HR3bMUG)+ir{u*BziQR7E#*_0*m?^~exozEE!ksN^GdddD4Q$DINmX$ zrjTB@Mmjba9)!f(?{Eh8l=Y0f65@}&=r50$ML(ARY`9Q&`S&POP6S+Q~mlp^J=cx&?Nc;zau0&gC1K_2ymO zzdaL0L^SE@?|rPTTR4L`>p-u^D$framuHFL~to z+380}{P54S`!4hT-)S-J)Zl+74Xk33rR%iELrP2GV1NSJewn30bQ4tXl z5D<6(0qN4EtAHp-@4ZRyy$2QPO?oHv&;rtXQ6NYSz4sP+=p{fhJDzi9zV|!x&b%|f zcjmkQQRB|uciZ>6*0rv+a!1n54G2YTkC!+swi1b*3_ zb`VLFD!q6}BYLqMObh%`FPFr58Z0U*ngdirv70%$M1V0nh8W;}tnBQ&yWZIT&ehMc z*!!K&d#u7Dn|8{Ydi(kU0s?eJ?Akx$0-nEGky^CaS@OKSgJg%aY777N6*<+;;G+IP z^UReOIgN(P%v(A)mSMeooXJFyE@*=b0vIx;e_)_x*W@W{ zg7wY>6ru=LP*ilV*{NNJo2j|IPOwv}5z2dTiJXOeLW8P!Y?`Jl@&4lm4Pki#-XD^M~^FG9Bl<9eG z^rr~$Atju8mHK`mc%$8odVqk2@5cJ$f&LtL;>U=C(-UkXq!M(|j>Y72xg_qgGzi@O zGoRM>Bz0&Muynv=d2ggxaEe!hZcyQ?i6I}8UoK}Se=-2leMmBKt7KxTb&r8dbmB+y$V;hi%CmEG;QS5h5Ckk8mRS772XM_YdI3s6t zb6YLePV@(QB`R!C9bX7}N%8NTQav3*7P-~Jd?>aSs{%{zL#*gEHH5;*I_L70eTaN_ zN=BwVtR4#pVARrQM|uItvV!_j-zkn9ztEb z=7+5#+UOA<^Q{W&*@|s5Nhv97L2**yo<|kgrQ693qHJTy*9Rv#D3gy4k;!_G>qlIx zXWXlI_lEq(&`u|bEBveD^d^1JxE*s?_+0$+x6*n?N|j8V-ygp|Jw->w^FY#Nt>C*@i&}5Q$$b1rSYe z{bh(bo~f}(1LqD~M$y#g4l zvVp-bL?tagQnTKP%U|d1OKR1j6!qVWP*My8K3BDfcCpuKXwi_0O5Cr!#8{aWj!1S& zQt-N^PgIxu0L^~~5~^4k$jl%?MG3O`D%7csAdpf|Ngp9$Wv%Z=e9@k`=+ZbW_`x7d}m{0qd>Z+Lc5$C ztZ$=;fGZts!TU75CHUQ$<W!p#E_hM?n)(SP37Iu3JCu}I z_k*(CW`ObhjP9w|lldnqHa1>gx^jb5ApW*es`vM(9<$~fQa64IP+!jil!O?~?U*~dnF9LS&c80;v?GBzmawt5 zPDQ4?H2#$-=5w|?ojVFtFVMe%1L5KUc*V3WYeF&gJfL%GG>ItnLqp4@tI;z-^JG;; zhuK9aNOl2P$XIB|i(fPkN;p_+LgV*)&wcr7>nzkhDt&lUq?#VY6KA3H86lnFd8!m% zQ9N$;Xy+MhfZ#FBv!`kpDUA_;eXU7mH%X;k&`N-L^m4}dhlF_I2eZnjiL-i)g^mdw zB|+={5~s{1Bd*XXe%`L>7fSS|NYwv}6nyHN(rkBAu~c5Iqfe1A9hyh(PeCk4Nd0)Z zVH?2b)|i@S{a)?}R?HNocs$bT5Af4)&sS94xjVW6iEn#AvJwx?>f zMj#e7W~0<+C&Xv0p_GQuZ=9&@>*6Sm&?m&vS%PQ*)duf8f5pf~1l}=Rv_C>A9p`(g zJc~^wxIQCW-|1swuVo$zdiuxQ_RW>PXt1tce6Fa4Db#(t|Jwp0DA^WD6z~BK+{X&U zW~RP3V?t3o;#xZ6URuewv$Yg-`K6UEJB*>}ep+D5OpZR8w4)J01f9zV{P>9U@X%Qoc=$JJOMk&tdM>YEODJZpTR=w zcLg1at=UNFL&8qt?;j|9tI9z+X~mtE%uv7FNG z6;eMQKH^oNdBa-?^Rff)VwUFI^3@TP>^f~lg&I=SkJuA)a#({^)1!(rxD@qAPv#Oe ziE5rrSIn>*3TsYGHu1m{%-H(N8|NqM0?(O(KYB4#`??>k zJWlJ_a-EVTkM^k%wMEA-$$_57n8JkI`~B+pEUypb1|+dIb?CRV;7KYdN;y~BF!EB;bTXP}_u{mjxE@-A8<|L!N@o4sX>U)+r-5bB4NL{N~ z82?Mx^I#!s>JA#)2bw>*JE&`FKM!S*jYNfnypS~HVm06$uRDQu2mf_?@7^}=r~U}) zcf`c-Z~1H_AiZZ!(O^^=e!;$vN-_lphuBqiwD$cwbsQZU-?X-T9PY z=Y72*(?3Wq?42`Z`z9K8R^K0rUF+?eK})^`F9c&jjN4~qo5VJ9kvp8tcCl4VT)fo+ zs0QG^TaRqL(h)@*!zE~ioYyedaLg`XFM)^=^+@?_1(cfNu=OnRTqVc*IxQsR+Vdb1 z!UTF&y}udzn@vw`=tKi-T+p!L)}b5z9f$K1Pm1t%IW0~-d0fxhwnOq~T}Q|;2Qh`X z?*$M&fu{=rhZiiG)=*9DWT(7sf)<64z@&h|m?_ifz@Q*B`n-*coxRz(DlvouFrGh> z3>51X_q?JU`hn!2t}RCctGIk!9-Cko5#66yj@>$_T+thVg3-@}j*j}cEX>Wz4BHH{ zmF57r2aFC{TrBK!W(&l;3KYTU8JqHXV6$iFTQQ>q*Y{K^om#k^^**c6xhZtlcaN~ka@8GiL`9p4CCYOR%Ku&T}=v4`{>3FgFF#^8W;9_BB zwmzIIFgQh?4M#ySJhc+~*vQzybVrxTud44|d5uQ;`As@YA{7f5c!N$vgkJUH?G# z96#**y|%4YsT5o*z9PmK;N1`laBx&!tv%f165afRNmX$#>$3q{qQzACv=(UxoxSlRg$qoiXBzA=Y+$Uy+ZxW z7xFq4fk_V?jc*}( zIuT8FJv4?+qyU~c9-5IDbCR0BQ;=-9D1|GizitkXdIH@%&V>OD{oFKhI31*e{ZY#QHO!41jx1)Tby;^>w`@AAw^=c^YYGOhO zQ|c?{=*TVi&gqZj?3Q;3^Uu=Kr>|8Y&}pQZJvub#Mn+S{TLSEFAeJB1I0Mr?^Rs-@ zBTb6)S{Lj7?Z2lMmfB3Kr1m(siJ67}ZAi$4 z;!U;l{QH;~8{6(;yKZ*{pbkcDKQSJ2>RaA(&D7Q+_JRBSOu^4>Z8@B34D4K@s8_G# zIq$vaLc#P-PY0*Nx;n@OM4-0&Hw+qmav~*B8k&Bo?0xT|8XO0W`r62eE7*N~W9Z!` zC(UPLD&-mMj%kI?t-{CbDMbJjZ!)iGK3jLiOZ)O;gm=TiN7H~NCh z5<-7*2x0JHBc;hXc#y&ER`~QI88I;n%M2q!T=%(JNJ!3kJR(S>j+|m<+Us&eQ!W5e zooG9KhIOu7kTuMe2%uvV^K^r1PR32B|!H?pt!w zQl$cEIhX)ru_yHR^C1pv$wL}6HY!nu6+GE>D$ChQXEeO4+J?HyR(=gWR#^wY?=(u%Sm0xw^(D9bpmZV?8{XiA!v!h;3A3>VZ`I9qmL_K4QsV{ca)W?Xe zH?Tl$yBo&a19}+eLY<=TL5fXzXgn5O@g}~_$kMTwSbqZ;iqJxXkc-UfyaG_=3ol#1qvKE8Z;lu9Mc1D=cFD!VT5^ zjxR75z+Nh-@$4XZyC43mFB2dTNQlmSuJLTH6%L#2#nUbngdPIrENwh#{~)FHel#d2 z{4LsPA0de^Yc>^N94WZK@M>(-xX|{apyX=si&+DAo8n%%j20x3%|xt4rxJA3=+#WC zbsBH#N1g-pQh{NL@T=+yJkt+Fol<;}g5Gz6y#be^78;rzX`iSAEXh%{Ffno3&!t^4 zzRE3f;yI73_@@zsv#ox3sURx@F)6<70{6!1A{(4~tsTtdUpVb9&4(6C;8j9t}uW*<-V1ZJ}3Msj_eBhBEh{AQ6OjW&AU9sZ3FI`G^!u%3KO8uIF2CE?Xvi=#0&q1}!k6 zozWfoQ0w)Mx@39h&L`U~OU*3|X~p)E(>O!+*H*XyPb93m@G#B9(b0yY{Q$MJOpDLe zJ58~uTU2P6N4GUc2k+J_D|sp)KIhOF@*?1IrMUK!;R4q&snwE%p-@9V*HfERHt%;I z^(eUyIdqqQA-bcVo_XA~QnbuEP77I|&ga~{ska6xr75(HRQgr7#;Tgdh14>a^(mJi z$-*0C^NM*FO@&(Ibnyhl{fhv38r` zNy9|kgLXw6rAOAx6!DU51HcDbJT2Ea7;it5lU@M<0RGI`KzDdhEoR5#AMhW)OdX;m zGbj&UwyDydb#&(S3kXODlTz%=IBu)Q13qW*tICoCsnN`T`2lCOV^XuK9A@hSAhwzy z7<04e*Q+~1_X%`$j8<7M?gX;Rp8sh7`?F01Koi!Zg)pGTS_Abh)Fs1PdbF*gR+E!S ziQ)M;?oSgI)?(*ZU0a1Smq%m#1DUg|vvG@EljqSuVr5CNPSoy{y>r;;vSXO%H}T_2 z|K<3YQ4fuAO|vU+&5bknZoJjA@k_(mX9~oS4vimlO|sB4D?@_JT*&k5df)!~amHE~ zTE!mJKp+(AH@s2lH)hQ;6=S#)&->6KDIa8SZ|e?L-0vksGV2WL+b3yv_wiDHi*k1;yc32Yj<6TMiLK^+0t~wDGj4->%7(+|_+%kGb3r z?S$}8JPjx+rX?~hRy-U>2A27X53seiC&Se*G7+Qq@W|m;F%|$pKpoxl4d*je57eM{ zhC1!Ob%q-~y+ZInJ^E7n_Vza|7#%Kf2@r>9k9=;qk;$HdLK!VS4-N_WrAj4wy|=>1 z{n7gtPCX75xSAe56LuLLO3Bc_4dC~G>KGkEZTK3^cn(eeu;YS>Hc#rb?o+fAhWL*H zMp1*Zb@710Mhkb2y zuII$-wt5ffa`_ra8EA*n``1#6L)CYd{&^H zfi5B%UwXYZ3R@WFrmoJiP23Rj8!ZrKse_3!PnpeQIsG<{KhcWg(>=F~17btNMPL*i zMPM=ay{!vEGq#*~gu7RlybkeX_PRlSrC07k1+1J+mwQbw)WG0FI6+5^Qvj^>Wj*S~ zGmrqqw=Ll$n@2#2ogDkS_M(mJdwXJ^-p9+1=XMRazp8NR(XiP4)y8KICA(HB@#mO< z%jByRsr~Gs2r_4oRj^q&36ca27hTH7;h(~b)CS%KKQjw|LfP{#Er1OboI=-*Z&*`KTfv@Aw3$#ZbscXJiO` z`Z$!47WyiCTK?4o8?a6N?MO~kplHd{q=&;&TvdG&71$-CjCWF7vxH@#XgNJrRleth z_5Vn&QVkkgOlI=-&TJ_ws)NDb%A7T{_?x1#50$xX>k0aXn(|j)RK}KTx)(R2tWK(*3ei0 zGg)ZjWa;gO5RPLrkN3MHS2bif5}YbwtgV>*mXqqUPKse@C zg$FENyyWPYqq|@JqgrS+W16i_|H-6+&feoJJC;Px7gC*;4c9m^el92-3zdmtDLcU! z`yehY@~;bnOSIhy;#m)%_S^od6% z5JN4kDi)AI43SMnmm!T92GtmVPxzRM0%Y7I)5h*@O&euv-DHSyWD)W#?4sY+nVZ!J ze)vRA?~|u#@$N9!T;HWxpn4~>0A2e_5#jwB+uRl?0d?&%%(Md~NUiQlT;$MXVQZ3Q ztnqQKdB6@y2z19$jy-{{uEaNQyN$!mxd^w6lS7feT8AAPA)J9s9)B?-wI_YW5zKCq zLSCHev9NFvZgX-N+iYF(TUviyNP0%)>$u4i?r3#8F^BS61*uMp6?+%0v)IXzT(_e8 zm`>6X^3Jp7{t+s>1}Eu0Fa(~b=W@|4x6wih^?5^l&>2=LXyT_=F@(RAxxKwTm?@^K zsd)|@Pwwsn4NrY@;XW57rEwGx`XssAma83^^3&o#05O}tmlfqI&@Q_5f_KuFj>EAsYA8> z+hTiuXL=?oDCWUS8|g@=^K=8$+E9ED^Jp0grn{E?;3=;~cs5M$WjEw+ul6dT2xr_= z5c(2qSu@6{%6nza-r3<@%97cLlCZsIBz zB9gY_m}i}c57N|WtA(5H<5+6@ZEo+f;+(I-oUk+Z=upJq8ZG;d$0 zE9=ZtOU31H^}G7EagerRJ~@B@Assrg=rvo(3#w60Z_*#|)$&fZ2}b5}Ak=Ij7e38HnTI# zSnv2vrlrIA6XHYVtKa)}Uha@|r&nCRt?XJ3!>3NCcfvRz8T2cncKup$%&D^uZP)mO z*RUI4G2GlV&p$H(4wSw=wW;1~p9ZJ7?ce!4z9e<=`v#(GpUzx{@qilB3gj7;c?Yh# zWhb)zWxwwaF$Z5-@qzG|Hj#d9CVeCv>{DgWDsy%_o_815;{ulp8jay2coN{9^Q6e` znT3c6Ak>p#KXkzuoY!^k&+^sqD#v8>xtVeA-x&&!QNoZEFH55d@&x&EbF%Wz(l&)y zw_G=!1g51J53!Mcq@d4(Qr)qY$~nGryB=fU_K+PaK^w>o(Y%yYXR;V0OmQ_=#p>qW zx+mugJ>o?`gMDQ?k^Uq0Q^q^Da}p{=Jtak5hiemiD(bc+aPE! zD1m_g>N8aQ_X^Y|p&8O(d%Yh=IH~88b)R7y5dBZ7zum6yx;JyWk>=34YsD1TGrsr| zw{8g*-tXyyZFRMmRFDXr3a^>Z$rZWRXZxVD6;dMHdJ?ocH;&*hFngB%oF~t6Bbu~vd1aa7vn zTNlE<)VG5`84vqUhl3FE3DCTflwY6(AKNMyJ}6cd6_|@Gmk>JKs|0iI65xO&|BN!u z%%_&oT51>i__4@a0f*T|*EL9U5`96!e2bB8(emr9i6>o0p?#?X0;0`)hdmz=U=4rw zA;&CBE6?dsuJxLcfShno7{`Up;TOpSeD`MOV01!JpH50m^7%?fA1LKuITH_GVln0P z_hB8_Qw)hfF-X{^iS7n=EVG?Gd-dsJEn}z`D4g1gu^#n=QZv-bz*#VFV4FRR?bxxG=n1ysl9pir1E^1C08eU;&%fQ45{aY z6?nQ8wHB*|-!Fu(3eI2tih`dffKUkhQmWY1I}(Z0Vs17+e^$aPVLgoyN`gC|7yrge zdiGpiabY~?4yMwi*IK{ji5xkf5az0N*Fh&16HjJ#h^!jf8r|C%K5gg38$>4Es9gWt zUM1?+dMUo95tw7+v3KBM5N=gN1WrCY1bMh3S@j#wC=*1{wX4A#7P{iRf3LS#(Rp0U zXiA@ppcFquk>212goMPG8z{Li_Is$J7AMr7)SZEk-mXmV?Hqv~H6XuOPPeszgqNl( z#msIDKZXjc>uE?Vn3b`|6~3X{Ly3Z>YJHEVxd|3RCtoy%yyf+sh`)NsHLo=7dHp4x z^aCBxiG`b}!mT1Y=k2IaWWh;WZqv$!?he61-AHpG(Sz0VML*_L z1Mz`}3+}T}sOw5KnS)LPDxh*(l^HHJGggwo+m&k*-qd#GP^Hx`iHCMxSa?NDEdAaS zqng$i1(~xO_IKCqC)C!2h@(wcistFuj(iImv5$Y|N_!MBZYJ&wg9-X44V*bdz0NRJ5=pKkU zaa$)uGRmU4wRHDFaj;5)noC#Er>fy_D=#ezY92X>_q4>c-*Zq2o z2%>P~*sGG*Qgbo3o{IaK3Kw8MJ`13-|3>bJtmJTdM{G~f9ny7A+Lu3Rup6tSKIXq- zCL$o*rxo7!>mJ=9d&i$a{)z$7!VJ<8ur^v;LKBy7UbR(t=M?0FzN#!Jp0XwL)H@h~ zTcaIfKBUOeG<%NEtw;US{%-#!Npn3M}&}gN~=Aqmw>kl2Kf2+{w=-dKl&D=-62wh*Irk zD}0Ir@&Q@!Q6ihGAaYk1=&M{b8qK+P3#UwyDXxga{{|Z?HjHz|$uhlOCi1V}75W!i zXy5#g>cn0#{mKEo=Hv<@JoX@o@iey8az~0&XL_xa8U*66<1yZO%#eFYbNc^8cU2mz=R?OQK52Fq?a@&cFFb6#JyVMI*zaLRN6-N?_q`?1~MN$~Ad_y6luT;IM zs#Y9-OS5`TfjNvfGyLqhs7-s|bN9wNwVOd78p=2=6d1faSt$qHWogEFwO(EQbPpKd z(O%tRP5rbxDPm3Gm~?M!4mR){$p$UO@;^5T26NmGs`!)cx()W8Y%UE`KyuNsSJK$F z9Ax3W9VdyWdjA<`$?wdYDX)71zRL0g1yWo|r`Y5~SK;VE&ZXW<)S0mFMM!zMLwK4U zVqG1RfuXJQ44GS*{^7MAfl^F=?3ECyXLb*~=h~a4@o<7-BU0O%x+Z&f{)O2M4Oe-d zv`+{BZ~(0B)l@9$;=pav43-|Yn3v>yKuI?oy*j{u?3Y$I7aj$-7A38CC+2cC0)d z-fzmKZ6<`jjv83~)*-AWK|E(Us;ryk8U=|#_#IFU#WyA@#|nJA(8pMY~3Vk1& z{N!c5^Fu<^IOMgNMtMeWiQXz8RdaaC$YU)j543@W4`N)S0cOit-R{BVuZ+rSlg~L% zELW5OmBhEqwbmxA>^TknyT3Lst0ks3JYLd zId>fEsu*JsWq%h&^vt>gVFCv^zpmuAmc)`$(i82HJ;X&QUVs+yp!u*se&BB9CNE!e zX|$iN{L?znvx}o_N>GMvMkxOe*@S$jKa^helK<1i1M>v141fba zrb3Zqw3yyHkrH3Ssyr*7mnLu+S-sSIqHYHKK7|O!4r$j&=+--k*;c13Vyv{foozc; zZsbTkREH}+Crw3!$*!_oy{+8p8!S8H41MAVmS9crA7d)(l~vhH^7X7)6=YVNVthSo z!mjKY@{}V9nPt1xAG;(`{(<0JCFB>IFDm`H#aZ#5J8{KKX&5?Y`A--(Nx=G}Csl#@ zj9_crjRPDM&;M>GUyZe;I<%xRHr-}aP!O6+e7zlPWh~xne?MPXbg#j)hl`VpSjekV z=hhu*tAzW9N-xH7L%DJHuCRl}(FES@ab-C(y8I3TlcNVBFP{12lwAyID?E#vt~@7PITZ|Tc`N?LHp zH6Xb4H6gk6pelFOpif|?e5(@3ApkTG^-gm~0EIj%ub;}5Fzj2!pvCdd%JY7S!HJ4b z)vL8^`P4`DV%CKI_Rj63~~i}KGkD0-J{o$tgnP}O9|zuX{soteag>NATM+-J^h&W1<3PGdGlp< z_)_VLCOtWPfDSE<0NbMhRP=zBRzg`cLD!|V1un2g4EQUTUCZ3chJzqRI6qq<=3>=r zPk{EKafm{OO789^71M^|2{Wg#lBQlP*YXXr#r8^E2l|bptbWPG%9CDhnAduwsi~x- zZR(MS^TNUAMs!Y1{~ubb%ymd%3;YUEPRb9Pck$kelT>vc)H4>rPEN4PYP}ob$sW}% z`$hkh^KYk33&`4Bljr3Xn?~nae)Dc@yBXI_k2uW+v|hvdJFFa{6`L2NzDFV>fJSW;ivYWfl)!_ORJ%fb^Y= z?RS2bOZz`~uT$~20Xwq|z%^m#M8*DDUD;0+3Io$j#cQXnLT27DJ1i$uryDkDwzEf1 zAN5sJrFNn2VqS_%8OC`ncX75BzlS&qj-HWmcj&7US&vv%Syi^ndRZWGX?+JY z4S!y){#@LJ^Wo(QRbh4Md$@o|x|>3)#~L|4Q|!{cwXMQ^&!lyrzedgidO-#g%XjMrE-~8 z7uZEbPmrZi4+_WdK3q*DI+F5fLXi4nWx=oU|13*l?{|CU@IL3!=32&JEJ;-6Fjty! zCgDorwARAIjcAqbBiVs)vaV`2ljr*j{*m=vB57TmOD^}O zno|DtiHeta-7fs6o!7I$|CzR0j`iTfQs0_u9`AAw2SvEfoeN8jZ_Z_IZf-=HrvZ^M zwYYERA|?}ssNtM)^`D6NjXRy&YU!=kul@{$cnjN)no+7<`6Wn;S1$};NK*eBoF$Y6 zPm10RA&Db_W^Z&Q_uciW;b<0cfO4tDD*bp^1&(_fdUpC!08Xv0`YwF1$}Y23Ir^5Gdg}SG3r2+ z0re4BwFtV>4^P`$eUZsO#I>() zbHUaCNL$s^d}Bl;hDSTR`qUFG;WX4K#&)Ac;vX9LHzvQ9S4sjm!I>obH%Pj-JO-y} zI&-}asw7qJb!lo|VS=qr>pbOp9`x zSN}sW5dL%^jVCehxRMH*XD}-duL&ZDd$Z`SY26XO%`)mu6(C7O52<3Mmi=8{5f7 z7XtDAm>^h%+NysBnJ5D}h=ZKQxDe?qguZ{1~&4G?-G zsp=47f&%k%&JZE^Uj>t5=XGI#B$HhCoi?JYCE29_9U^wsgWCfuBqSZ@A1BquBVv@v z+lKRzHf{HGAKj24p@oH7WF@cSj!ou7yW<)*wo@s?y^xK0FKEFJuQ#!iuJ;uiRnuWz z{S>M0i;%JxAuzyCwdl!ofk!w3H!u&WdPHpUAYNyeeg ze=GWAhIxd^OFPosqR-;a;N?LA7QQ`^1s`m|yX6cHaRIrWu5i`!3%Je5ua+k{2lv6^ z%snYB);^{vUabJ}IUX_Do%Qv6wfB1;!vB(bXPt0A2B3M`JEz*uK%&_0mVN(c5b$vn zWmv|{5A*;N1|;lhc4 zE`_$>TuR7C?~@%7r7$8I>#4J_XhKWt{Qo1w_s&PR1p7V=aRZnIaIG4*3OEOndM#V0 z-TxKxgFY)mJB0sb>0?lQTRM&WnG?;pg(x|cpv*tny1iM${Bc-_tCg2?ZkMf zOKJSA7(>eFMdv=RJ{Hu+UVbDfAAAV4%y>s4CI*+?#6GT!RL~%0XcpU=Y6famvC%pM z=hr5>dQwWqhC0*cLafS3ANA~<>3wW1w-+Jy(=A+cCAv4UPw^^er-Pz3*o@;?(W#r` zL2=SjqVc$<8@3d@-NrgsDEzrVT!;dj8S|q0aePVVj<)jIt z@2?W2`ZDWZT7ZePLlwWu^`3C-BZO1`v9lyQ*$xM~mie~=P*L)5ew{xtFP5I3DSJQ+ zv}EP*jmlgi#lXbvRmMYICzNW{17m`MK)u%aS#=$5hdyp0KpOw5ORhvcB>TtEeklne zbR|L}KdHL$#CPXc<_Cf?$OHKS-ao*_o`1u9Em=osx(sfhX)Cn%gcxCE3QH9oo&)(@ zU14)29B*S?lr|YN0g(DFO<6_sQ z{jMG}U(nziwoD)(N+%a&sg~M)f=5qhrE7ujd&HaplgXzz`_la5^hR0pB@}LGEU*hKh>W=a{sKG{@+LL z{C^52Rwnq(<}*`ct#)@=XONZ(+f@{>#z9UjZgXS<3-rgb9|DG-h`uPkVW*9!@1kTz74NjN&aGQ&@hY5gD4vcP-)lnECEqQ zYmgZBjM#?*Di8JXx;8YbuWk`ExneHjby*0V79x)nNtrC;xw!DGfkswpry@?0#2Nok zMV$h*lkJ(jbf1P?TTm&4K5T#vsdcL5Mem_~x}jcBmsx1vOI;U(U(f363(VzwcK%3( z9D%O;`uWVes*?Xhfwa|KNOySFzq@jb7r`iqSi2}(s*QX{aSDD_UWk;d^5?8>6BU3qXBtS z&*k}#&gav~{#lm_tF_Sz;^OSP%_NFXut#bMcmk12)lxV`M{lAhEJf1N&#Bv83|J;> zC75zdE=7PEi#Nn<@2?C%)ExFUBD6p!js|Rf3yuu!h!AvAT0>+`qusY_sqb+Te%PJFrYlaUDb4t z)FVt&7uQ~S&~|F-cGxa4^CHE~iaX?ed-d0C!d$6$c7;Vin-(duxS5_%R}@b~)_FQe zOLtXH9aA1=%O#ApQ!3R8%;bsce-!fuJ+A6}7i6ecKH2_L$Ko(aX4cWh ztmf~MaSX2z7i_>qG{vT@tf(USyi6|a=#Us=)l?$b8Qxi5 zf_*ki`kIUJ2h`Y5JtL1DmbxmN5|dBt4CGsXN8I=8P4wPFL#K8u=<#ljUqHq)bRHJ`}D#Uosj z$keu#o|r#X-_SaNl649s)iRfto-naC_fo#IaYmoN<+cM*cD7!XZq_`S`_OO8p6}y zsP}56)YK`l%9ag{BG`juE&#C45A|7d4cbGPeUHRv%*ma|d}GP4KgKRfL(&Dz+XTFo z4jLeJF#8tQfVw&7zI-H|l}hrsH=pkeFEoz_KI_+cv^dT|UF;%jgJ(EEUGp@5`Aw-e zx7^-Jydj`yQYrH~XS<1TkOpX=%`LBqzF^LhaUe-j?reLw_sLJd$7gGs`u_JU(}R(d z5ymzTyU9u{qg^J1-4KnyhM4I_=W$G5^xV6ujXwIiO55tVek|NkI2howp-$!Tn z9!Za!r5^K(>Tmp;Rw;=i!fm(}76MQ?7MiRiwej#{`HHGUXvlz~ z7h_vj`#P`5+j^Jz=7?f~@*B)_6Xu|J8}BEEHdfC5F5Ub4Z_1vgS=$yEMTTq8^yF%= zR^`}s)ih2uPW1BXOskiS=11v6+zNCGa@9rLe;AgcvUr5c>Lt6Nl-JzZC6?|=9en&X zmfy18n1+1#9hi1-!|;Om?qADsvc1G#=cqB?Kn<-*S_5!XDwpSD5m#1tw@ch!!mg{G@)8F1?tc0>X^^I zvx~37W?Kz)FbaOOWOr~rXItMzOyGi98NNMwJ3L(lQNvgppK7}d&Yl*xg2BEjg}N0v zWsKA#9BzGWf)2)`QTXA}><<;iYMZ&KXLL}G_9}AgfPhwPf5QL5T=_+^S09`$(Llgq zYyWG>W}3hMPSL4ghSQ82(d3w*0MI6&T8@WBrw7h@fp6F2~{X4L;1uH33L_{N@BUQ|v=qYWskWPlL0et+uWAw~gx=y;n4aY~s!cZ6csVk`d20mz{RS1md@Mvp3VjS>GlL*=*PkzGh85COYr8 zLZ^)ad^Te@yd>QTuDZC$eOr1fA>2N_*4f_c!#2G2aww>!G=IHk2O*AH*G0}5u-ry0 zxJ{-c9HX!714=vxC7|ADi_ygf(}^*l1jNzNXlo6h*LdZOnPxmlltFqpFr4Nx+!2|6 z6uS~z>4JQ)Sgt>|`l5S{qOMFwz<;i?VP26-;yj3%ifBh1Qn~>~&qnkx0`@HL`nsEG z?)sX`f?4uz_DQPYyjBIaPsM9(;?>7Ag`M%>QXO~sdQ;e1Z0txSg~vCWL@2696Lpkt zXK+|`3`tDLQ(-iNEGT)PS0Jr*le}=C*x+3%4OLZ_G36!++|AcsS9^6#@~N)vhVJu? zZa}RSS|)jv%K4>^$h@fKjni_3s>6K=Uvv>$&HV@NHWQ_xhqFXR2f9_}^1F)3FQ4yv z=R@dBS2{yUm=$*SHs0(cv(enF_g1o546x|~Q*;|o45*`;r73w~^h;9XXM+caxCDF4 z+I0p3=n2l9IJ#z!oktokZw6o$=l`qRwG-g&8BrQ@h{w1OPkyRNT}qs4tfehVz7e&uQP zrXU|3tvL2=<x0brzi#MwlaMnGyWjH+D z#rKrZVxVzrITdyi)wF{)RBznf-2(4@e+L-0zp;lFaEoEPBdZpU#oAI5A4%|IO3LEiggY)J)@FE}{}`Q4bhfw>0ui1gv* zajRH9>VIqROT(JVx^!dlDT)JHmZBo0C@m;OKtyB=DWNP>CXsmxq5>iigfIsZ6$AwZ zWfYl2WhRV5Ado~sM5Z8Pm=Pib2qX*{Ac5p=>g&GU_qk8^kAC_NKkEDl960A>?{(H* zd$0ArYwe19DZTfVQ*TiG&=B0iE2+u^*FamrI9e_##bjT#nI-bEt||DsuhNZm0Uz?) zcFILw^XD#{>L=UVh7V+{avdF>B^xoziaf7I@9!~D-;E{eCOw5h_1EUrHDsN`n}U!9 zCEi}(D8V@r+5*6E`*!X8|8B9}{CtcCHhQt?s&yxmuO=sfT>i-PY|-?>?VWPwq0O|e z348uZ!_n!j!+q=;XB-m;-1;L4QT=^=#{(=!3)?^t6?Y|3US=uP36C5DHCdvsB$E2V zNdu-D+jfk;Qun;M!4*5Q0V*^c6daV_v&&%ZTnjL48JfN~eKde2+A*+S?nQ} ze`bs>VZU2jrxb`mG$Ys6#K-tF1-TcOy+&$qP-~F(bAP19+u;}0NEN1p_%+e@fhA-4 zUP;9tAU8g^o=f}V=GyP^KkRrU{DRBKm;^}2KW{P0@72=s+pQ0uwnie6C=?1_vJ-ND z8+CLvBRyT`>)ZPmbKri8X&v64o+$od$cKwQ;7h>K`fl{$SM0%$^yz0_o}P^CfNhYo z*M^6OS62Sq$Nud``E35^G4<2fO+II{3b^|_+V~uX;j=dAtoer<-DY*km-j$be<`c3 zuEtu6Lw*-|dV9;L{?he6a_Nb%{)e&I?za;m^vu%IQjEh12xK#_xR{X{G=3Bo%KlyQ zA3I(M+i?pE3#zvyq>mlrdq0Cf*y&MGQQ*9)s!BZc=d+L5&d5jmLG8DCLJa`GIrOXB zAdhjtpDFfqz>unHzFF|q@%lR-J$jUWq1tQsePK3rH{|z|>7X|C`@-Dv@_Vnve~2)} z(ye#8jMn;^m_UbHwnOgizq7Rt<=+E;5`*nO@^r_~ctUJ(b+tE`-`prbA>M#OJOelf z>hN%0^=l2WM29iML-Id1iI$?_FJ)vQHvlKwd$S2De13UP&>p#ki#H+E% z@+7Hc&e%@}44)p?@*6C75z~}~K)B%5ZV8(~Ed$b0N!D)EjVyN;OLG{jYLYs9*zMd~ zy^Zn^AmbB;ak>lTO$n{He|hm70f9t(1ZBp~r5OX>H8?yy+uNnJKwyG;E{b&IpHp-; zbk@Zy)ilW8-`{JfQay3#RqO4Hq3w{f<&~9{KR)^67gb#a_h4}Ixip=xCm!b9zRyE0 zo=jt_0kd}eeIv#JTzTW3vagL5}zQ z2aUM)-CDki^ETcdL{32?F&JTi`P;vG{e?o2oz2<0b*skwR?o*9LV!A>02~H7f7cT8 zi)z^G=p6QKPNitnx_wIPjDO-3k5V!NWwBsQ118CwCSkY!w6zA6G zpJwQEN%rd-OUKGbfz}KY0@}?DWs*}R#nInW9p=ZPq z-13r)l9B^MP0{Y*T(X`Gc8z(0ao2`KCXtB0qV9z!|JYO+vnrAI3^w)fiL1ru;A0lVqrRuGlar>g40yF4OIPv20$;4KStrX1DRl8k^~5{s}8+>akH1<##% zlbXT_U*Fi+h>HssCNy3wg!_56r{GTf`E+*cZb6x=XQ&Z1M?IC7Qc6j|&5=~#pha0D zwoud`5fqd(gH9GYLZxI?Z+=Qqa%;c;6&To7uYi+skUhH`>IwTYH|=5G%nq-``QBEW zekch&yFi`y0PQb=hv8L>y)LLR#76EVrDy%<&xoM!0_8q{ffz zJ~Qgr50I$H2tNu>Z=O~|#p6Fg+kX!D%||Ef0$5|;fF8e1r4B1ZuhcZTpZIrc@t0@! zb8QR_4MDnupQycqI6g0rCUmv9eOHU6uys9%K0`FfMuHXrHyE$!M8CTM+GxTm~H9vM2F6DxJ<3_em2Mb>@V2OBCqxiOSwaR7phybP7($cq&1LUK0cscBoxeE7?P#6 zwYBMA2L^)yodcs7^agwe-TzYp^5Mggn{*`1R>aDO^S)wg21-*(u{1VaHndzgA-T}* zR}Qkk?%uic<@Px+q+s7#gwr!KAo6@6vGx4<^R;(&K|VackmSdpz^$>OYIh!|_M_hX zXw9Oa42Gsdi*Ge(il>2Ej2b#R^{-$5Jbqe2LIMbN0#q6b26pV{8o5LV$pMkT%+vWP zF(rF|bO$PhuJNUPc4>;5rqf#x=D_5ZyEI)ujvhgSAju!+&iic%AKD;v6qPW<%iugW z2b8G9GdiE1dwumZI;4E1$a21DT=w{<;UZS;N?zMuG1ybFBI4Eoo5$d?Knn=ewV^CM z%L%OrQv#p9iVP+A@+3*sOYi$Uc2CT+R6okiM@V&{XGjMTr82X=5O)99m#1kp8VJ3g zTlQmkvj<68+B02$KHDp|A$-dd1vNoM%bnN}k2H$+2og=3t~b@J;-wa5q!NPX@>!=h zCu6&u?HWWUbPLWCxg9h~Z^FXoxq~}GPl}s@3ByNFEei~<6e8FKkYnW{6A}_E%wQal zFEt@j2S!~(LxbhxRg?g73@~Lt&Wx zCEK809}%x{n~ZF^DC&bsgT}}!9v1oZ?TQ35YlZGCOQiMoq#8Em|BAn$^Er&h-_V&NQXq@&+Q>=2u$SbFXK zSB)XpxAIA@(fhSU?CvNlXhRsKh^>~t5#6nAr0mVpsOy(u|P&#T3VRq7tu6K(}RMqmtzfr8t&n{X{KaZcxX^Nh32u zh1GiIHa0=+O85m)D0rc0cvkt{^(LiWEZDl`Xzmu<*3dL7WE!VIIrihS^J<4rj~FZp z@gC<$s-%kdk{uBJWp5wkAU}27B5|n-n8h-)ja7k}V7~du{$bJkjiv{(eXo0xk#iE; zvvpjSUx;%9;&nXw9)w@~R(0fuIu5WxEV^PC(96IP`!SL(VYc2d``!&}{y<~z_0<#& zE9JF6L$-Je*QZmJO2#YbB^C3jt8PiDUf5ab-9>uU7E13tS()goSHMMwQoA-?1KN?+ zz%5iNK1|6>0QVIp6cUvOt`nCk3&%W9pHflDzK+n#-N=*r%Nf1giPm=FG3ut93oYlT za>t^T&vR^rNp&!BV*5HAc&nE)x$S&2A$B}bDH;CC+&Tk1@>h3?!*#*3`)n5d{lc{3 z!DHDC$Up72S{c($Fmw>&&R6{`_|Lxni zRP)8@p*ezc*XEjo4vnCI&bpse>Rdx>*P{vArPbuZ{N!C`Xt~y7*AlKeZLBGHSXRB( z4fq&Qul1tPwI6uu^O!ozp+XI-T!Wo+gccvdx4y-olngDOIjF%-xstkDf3`l=Io8x; z1l;-40iPQeCm4D2k5ZF;uqa+wG@FlMhAZk}s8)Fl<|3xkh$#@cZM`1+@D3r{kCxu_ncLF*@|2W(8f;#ICMU4bHm4 zVGXbGihFs5mHciCMV8KFn!vQcQ8%B!jBs+kM~g*e)v+SovkUo8^K19*vs<)cRYyM8 z*qkl1W>;QbK9H|07#@v6&8TOn`7Az-J)9i3TQ2g&bbQB4>OIP#c2e!;(FFGL+qB7~iiBs=;;r5qKGj1C;Y30W$z^fgkRtdN zw>wbxCw*IOo{FC>EB9Zy0Cy<@juG(VRFv!9OjGQtFctNZ%f-mGwmN*YXnA9pA60GU zEW^wQ5S9hv64*VgPD0`I3Y~i4{P~jb`N}t+pYiC$ zN@eP8LyOw_l-JBsak_Ih)qBBF?2|q)V9Ul~F>?=$#792bJJfhxIT@%YX{Sq1 zzZuR+S0{3arvWDU^ZwA6sfDD;ExD|BQPt1)!2$wm!v`LX$-U3#p~@VVm#xP)aXz|s zfsECy+Sbh(qR=5WJ0jj{am@o4vhb0AYC^k=u7kTXfGc*ctvH`FzE%(1=cp*1d|ueS znJydhT2s%pKw9jU?Dp2n?iyPA)@-4I4d;s$Q!kV_g?F*3Dmom(Au#ieb%}aMrQ|^+ z?STvDOK{RU;T6G60Fs~`Q6Mj8Sh6`aEE~}ncI}3+&*rb#K7Wam?>JS}i z(qCrdy-Q9MtAX(dvQT{{nxCS@rzh+Qc;<6vY>A0}qN+w-;~0|m>yONn!%$8}U$R!# z%MhyPBA4BrV0tS4;cJ7eY~1LuBw^J1r4NbNd#Y@7jny$|r>TQ=u zc=G&A(MxPU`x@BU`^{BEXgf}=Jq9dsV)C6TWc+x2``6gRPPVU% zBfqPnkV2@%U1S|PHTIDeZ1wibO{vtwATrxZC z$eq^<6C{i($~K@)J} z0)kjsddIDq9%OGqGk`lMkZyOMu(AG03dBH@tuxf?biTxN5pPnKo42>_|1*VB$BlUt z1f1(eq`F?iw{doEEHleO`&{IUT$C_Sm}Db0O1vA-qQktJ1N%9m$p?lcIPrZ!LBY>y zx~mOobJ1C0b2M@1@S9g?Nvjm?`z;9TiRGrEQ&_==4UbE$&(FNNAo^_7VH4$-ss5vcTE<4-4V$){s zag`}4xV6thMK`p^F0o4}@YRy@+Mw>0i!7fuD@Gbce}8F_oyMhO!>6c7z3IjllJ2ra z*)T$2BjSoq>#UY#ZqN;g)%sxO69N{9N%TUiA%+v&B`%dc8{nfxB97z6h)elnFP)u^M=i6$$_=noE`_u=%e zT9eDaT3xzvf6s%_7(Xi-@n{WxdyU8nQ*UNkC@GhOS?rU|e)}U)b}{+5-Tq??^dHR~ z9tx~l^Ls1rd#+jFk@*TlMD@82-CHdcJ1$wAj_FY$Zb_RVoDuXAZTM|ht|R!+&vnSp-s@VBNfF@bi3`DFh77)8pNB2b%IM!z8Z zrU#9EP^F~cva<8C2w-w|FS)K{l$nfs>`Ajh6bk!vP`p3mWo70k7}MDsROcdzD$1bh z@Gb?bpK_fM#1@0Ay!VI3V%)kGR0m&Fk;AXl@~9(0#nz(L#?NYGRQI+FtyNrVaZj#$ zb_FdQ)6;s$Wm>T;`kF5@|0HEc`d(LK?kM0F*PI=AFIy9Sc{@lWd#Lld$NO@Q%USO z!#J4l?ZBOxbCcLWoAtDy=Q`XT5caoQ8&(A-^0^T2 zZRKc#pYfk(o(^`|tZf>ySd1UCN8*#^(dkT8um)W+k;AXkNl4lB8dLc7VA7}fs?r!lZ(l7$OLW0Ao&Us(r53RYUFcc2^ ztq8yOj9$f?*MY6!#r8np9_x!i{U%v3RJqKRBl;l7#hjlXo}&OK3I_MwGAA}RHi29w zJTvTA?s0=-=xnhBF zm7-$3sN}gWZNLVL4>k?O3<8STM%T*t3IR zu%4E#CRa5JSy6B%;|Bq`$H_`GtEeUykBNcJG#j_Q`ewPva z;HG@eD1HEUhXRZ3LURb9SC&P$2Uci@VQ2;$K{q|4tjzGn_93gi?(+K4sK;Q8z3f7TrHVALWbuXvpryi~QflU}%TRN!Dvb4Hj-J$E6 zs-I@7tJOy&wWk*>e~it?Fe;{?dYtPfe|3n3T!1lRW83vtblL+kDB#2A^H#I)H}RyE zMa4Kr;b8Av`Furmk6M@B>iw*XR(@U{1+@VjQ)yot-kfu5ml=7Al0Q%y?z>#VLuvgyzOS;NRGMUFlm5jFA_6d9Cqfot{VmAVtQ$0Gv!uw zVKMcm=|`m$|1Vi#->GFs3O-j)%vt)+VlhXDzbD(()uD%eI?_uFF|@GJL!FNwZw!S-;^9k7vndWA$OK z%?nIVLDow395~)COX{J(|zam#Mt=ZF*W&d z`+;ybYRn^OU{uBvYKEh*uqFD}9kdCR$!q8S;m26mWyli6ZpCND4pTkTkExUi7u{{= z^4;aVMg?(&_r8BWXfRfl9H2D!99ifPIM#sH+mx!iz4C-n=71PUpuCf|QC=I6ELL#F zt|w(Wzngu->huscuS;!I7LmYalvX@F+d4*+6|7p<&RQFjDhMi`ZCp>42hoG|1VWxa z0hi01tV6NP5d2N8F=$bIy7d8Ba`?x#&;IgbE2jMqS)=8>9miW=ZJ!|I7Lk6<1g-E} zA4Mmkl;J^8_ie%XD^K8Y@S5A@U41F3srZpyLmOyRULX_i0KDxgz{T||~TvxgU?sNWCgT-4$)OSs#lJcjO z$r!)sWVKQUYbtRsr%c&-E!bpd&dl0j9xioCGx>*IjVWXrI_ewZg(c=6P@S{{Hi1iUDd8H%X zIm~}vQHOPaqBZX+x(5DNjpeY!yU*WTEyFfn z#E8NepAghtf2acm1@Z7sy{W;?uoobJD5Q~vs}mc-pfc~fqrW9M)AUAZ#kfwjVNWhEUKnqSbJ)ELC=?nz;OpW92NewE$>00dCe ziR9^P0yYbx=&%|VD%-Cb865;L$BW;Tl!)Mz*|194b&wk*8xL1bC9I$Gik%CPW1fGdn%c>AvQ`x+S?k}sY}A8%MopX90;0iK#lum?T= zu&CLhn3c9pQBosde>bcD&ZQavKk+q1@kK5H(H(7$TO&%dRgXtK>rTf<>QF7LyfDH%!P`Z{ujFuU6SHc z|AKp?wR^)v#7(XPfPaRwZGx+C>i}H=kRLShCpSrH?&zGoDpH|=v6G9VTTYDVkVDTq-KbwR&AJFIT9QmMSGEX3yJVwWWQl{O_`K! ztR>VLnISgjjAX;N=xsw?LEjXHM@BS|qnd#W2xX;v5TZyZ0NZ&n0$2lbKQ{`ri0p&} zXez9l&mYS_aeQi=F(}w3Encx)hZZHe%xeU3+HH3ff|wx3wE}FV^+_1H%b;=pV0}L^ zf|1{nISyy==X~=e=LRI?EMcURj={7IwX3l;ilu9mjF@td-fz0uYq)8il}(3eL@P0V zBe=m;jf_T`558|VcZ~QQfLq`&GJ-FLdIIZ?xFsq<-qT)U(f3Mj^5>?ss;Un|_K$)1 z$o@u+STZ}Jvao`>0zN0s2(LpAAMe|zc;-%6*p=xhru`Lsg9VCZMYWODqA!S5MbLk5 zmxk$CDutB0p`EI$`*5|B!_MbTvti-)vf9;=qqW{6HPtmWT$iEEp5b8vIP<0LOYv+A zvld_4%s?9DJKQ~t2(aL!t&$nGdXS$?TA1)%rPf8Y-3 zzgz+Ah)1Hprc=L4<%58)on>fG9iF(>p4J?(TJLn;y}L4wfepqC#RHE;&ivYW4}O0< z6~Rybs0DM`DR&&RHVL*9K^hquUA$OwvF81IK*LyEYLbj+^9{Z{K*OmMXklMEVsC4i zBXL2hN}M&a8-Un*o}uuep+KJiFohrppNVlEj-hTjq8F|hY#z}MMM1j8<~_jc28iSO z`g(YFE>Q*GG4>7)0RCH`{;(qwh368$E}ZNE-pP|v}ctL$7=rfSOzrmaKcb1PnmDVT)*cw>0fv70JsuUCyUR=KI8lEEN zUr!*MOX~n=DuFJi`-%P;Y!QEF4{>xpko~2pRNJl1s)aqdqJMnl=ECs&04)B}UjVFN zrZXMyHPkaSw0;z!prfM$9;l%a#GdUI4|F~Xfr#BHm^r*h7JT2aU6A`ud(+akQh}om z|4;Jdp!gG)Xl6^kLCDBt)v}rxWZ`-EPHYyFRwG51A*3>OlJGKm>B6<-SINnop*&A9 z2;Yw4PI%q?F(-aR&wJs(zo5$CtKlQb=HI^cLgBl%u;^BHQw-$(=J{XHYrjjnd|>;I zsJyg2j6D-!3B|(_TTlL&M~?dHQ>U(*Y0CTOmAZ(%U*K{H@5!MQ>NM`C5v)b`BH8V5J)zqK%UEN$xKcCjodHWnli%%Pk zCQEOFh!xxj_WOgo)S2mk_YVj_GLFqo9uFRBs`RU@{PVUXi>4Y`Z+{QiFXJ=l+fIvZ z01LW%^p$2T4>H^L^G^X9R7l7Pz;kJdhfctY z#UR{?rIM0KJE0{(0Z=DMW~cmqyMshh0Eq^$!9Kppo|!$aewtiZ*y_Io$g33;3I%XY z%-^nTaYt;~7RXL1!(>r2}K{(ofe@5lft8yjj3D16l00o2^U z5{(vsijG75)h3=7efV?dTI#{>j9%W};eh81ctjvapHXrZkmKJ}Re{v~37@-nkE!K- zUAHe67fW#%Q*(cMMD=EGo{3Mx@}Dj)lP=LRDaHhU805pZ5B1{Ts{bFRIkPV_B{J)u5Su?8i5L zJNi={=gIAJ)ULB2we8-Kmw%1ueWCxIr0D;Uh`jy(0Ym%m#{4%?-TxNk--7%Tgm-S)%A18mY~Tzl%Fftt z)#Ci1zr{{HOaK~Q{&g!+?9o>K*cpG2l5`_y>!t4oL|2II-x{z~2)1 de