From 402951cbe05410fdb80cf690dde4d5a382af5ec3 Mon Sep 17 00:00:00 2001 From: Kerim Date: Sun, 18 Jun 2023 17:28:15 +0500 Subject: [PATCH] builder settings --- composer.json | 2 +- plugins/rainlab/builder/LICENCE.md | 20 +- plugins/rainlab/builder/Plugin.php | 165 +- plugins/rainlab/builder/README.md | 204 +-- .../rainlab/builder/assets/css/builder-v1.css | 14 + .../rainlab/builder/assets/css/builder.css | 1198 ++++++++++++- .../assets/images/loader-transparent.svg | 20 - .../builder/assets/images/tab-dark.png | Bin 5001 -> 0 bytes .../rainlab/builder/assets/js/build-min.js | 835 ++++++++- plugins/rainlab/builder/assets/js/build.js | 20 + .../builder/assets/js/builder.codelist.js | 197 --- .../assets/js/builder.index.entity.code.js | 124 -- .../js/builder.index.entity.controller.js | 34 +- .../js/builder.index.entity.databasetable.js | 14 +- .../assets/js/builder.index.entity.imports.js | 112 -- .../assets/js/builder.index.entity.menus.js | 10 +- .../js/builder.index.entity.modelform.js | 6 +- .../builder/assets/js/builder.index.js | 117 +- .../builder/assets/less/behaviors.less | 26 +- .../rainlab/builder/assets/less/builder.less | 17 +- .../builder/assets/less/buildingarea.less | 63 +- .../rainlab/builder/assets/less/codelist.less | 249 --- .../rainlab/builder/assets/less/imports.less | 186 -- .../rainlab/builder/assets/less/menus.less | 23 +- plugins/rainlab/builder/assets/less/tabs.less | 91 +- .../builder/behaviors/IndexCodeOperations.php | 135 -- .../behaviors/IndexControllerOperations.php | 48 +- .../builder/behaviors/IndexDataRegistry.php | 20 +- .../IndexDatabaseTableOperations.php | 10 +- .../behaviors/IndexImportsOperations.php | 192 -- .../behaviors/IndexLocalizationOperations.php | 4 +- .../behaviors/IndexMenusOperations.php | 38 +- .../behaviors/IndexModelFormOperations.php | 101 +- .../behaviors/IndexModelListOperations.php | 69 +- .../behaviors/IndexModelOperations.php | 21 +- .../behaviors/IndexPermissionsOperations.php | 4 +- .../behaviors/IndexPluginOperations.php | 8 +- .../behaviors/IndexVersionsOperations.php | 4 +- .../indexcodeoperations/partials/_tab.php | 10 - .../indexcodeoperations/partials/_toolbar.php | 10 - ....php => _create-controller-popup-form.htm} | 4 +- .../partials/{_tab.php => _tab.htm} | 0 .../partials/{_toolbar.php => _toolbar.htm} | 0 ...pup-form.php => _migration-popup-form.htm} | 4 +- .../partials/{_tab.php => _tab.htm} | 0 .../partials/{_toolbar.php => _toolbar.htm} | 0 .../_import-blueprints-popup-form.php | 26 - .../indeximportsoperations/partials/_tab.php | 15 - .../partials/_toolbar.php | 17 - ...-form.php => _copy-strings-popup-form.htm} | 4 +- ...string-popup.php => _new-string-popup.htm} | 4 +- .../partials/{_tab.php => _tab.htm} | 0 .../partials/{_toolbar.php => _toolbar.htm} | 0 .../partials/{_tab.php => _tab.htm} | 0 .../partials/{_toolbar.php => _toolbar.htm} | 0 ...hp => _add-database-fields-popup-form.htm} | 4 +- .../partials/{_tab.php => _tab.htm} | 0 .../partials/{_toolbar.php => _toolbar.htm} | 0 .../partials/{_tab.php => _tab.htm} | 0 .../partials/{_toolbar.php => _toolbar.htm} | 0 ...l-popup-form.php => _model-popup-form.htm} | 4 +- .../partials/{_tab.php => _tab.htm} | 0 .../partials/{_toolbar.php => _toolbar.htm} | 0 ...-popup-form.php => _plugin-popup-form.htm} | 4 +- ...pdate-hint.php => _plugin-update-hint.htm} | 0 .../partials/{_tab.php => _tab.htm} | 14 +- .../partials/{_toolbar.php => _toolbar.htm} | 0 ...hint-block.php => _version-hint-block.htm} | 4 +- .../builder/{models => classes}/BaseModel.php | 34 +- .../BehaviorDesignTimeProviderBase.php | 2 +- .../BlueprintDesignTimeProviderBase.php | 30 - .../builder/classes/BlueprintGenerator.php | 323 ---- .../builder/classes/ComponentHelper.php | 19 +- .../builder/classes/ControlLibrary.php | 28 +- .../classes/ControllerBehaviorLibrary.php | 6 - .../builder/classes/ControllerFileParser.php | 27 +- .../builder/classes/ControllerGenerator.php | 107 +- .../{models => classes}/ControllerModel.php | 208 +-- .../DatabaseTableModel.php | 59 +- .../classes/DatabaseTableSchemaCreator.php | 1 - .../classes/IndexOperationsBehaviorBase.php | 15 +- .../{models => classes}/LocalizationModel.php | 6 +- .../{models => classes}/MenusModel.php | 42 +- .../builder/classes/MigrationColumnType.php | 26 +- .../{models => classes}/MigrationModel.php | 102 +- .../{models => classes}/ModelFormModel.php | 43 +- .../{models => classes}/ModelListModel.php | 48 +- .../{models => classes}/ModelModel.php | 231 +-- .../{models => classes}/ModelYamlModel.php | 55 +- .../{models => classes}/PermissionsModel.php | 42 +- .../builder/classes/PhpSourceStream.php | 36 +- .../{models => classes}/PluginBaseModel.php | 7 +- .../rainlab/builder/classes/PluginCode.php | 61 +- .../rainlab/builder/classes/PluginVector.php | 11 +- .../rainlab/builder/classes/PluginVersion.php | 1 - .../{models => classes}/PluginYamlModel.php | 23 +- .../classes/StandardBehaviorsRegistry.php | 224 +-- .../classes/StandardBlueprintsRegistry.php | 204 --- .../classes/StandardControlsRegistry.php | 1269 ++++++++++++- .../classes/TableMigrationCodeGenerator.php | 18 +- .../classes/TailorBlueprintLibrary.php | 154 -- .../builder/{models => classes}/YamlModel.php | 2 +- .../blueprintgenerator/ContainerUtils.php | 71 - .../ExpandoModelContainer.php | 56 - .../FilterElementContainer.php | 77 - .../FormElementContainer.php | 135 -- .../blueprintgenerator/HasControllers.php | 71 - .../blueprintgenerator/HasExpandoModels.php | 203 --- .../blueprintgenerator/HasMigrations.php | 230 --- .../classes/blueprintgenerator/HasModels.php | 224 --- .../blueprintgenerator/HasNavigation.php | 152 -- .../blueprintgenerator/HasPermissions.php | 61 - .../blueprintgenerator/HasVersionFile.php | 77 - .../ListElementContainer.php | 103 -- .../blueprintgenerator/ModelContainer.php | 269 --- .../templates/migration-join.php.tpl | 24 - .../templates/migration-repeater.php.tpl | 25 - .../templates/migration.php.tpl | 35 - .../templates/controller-no-list.php.tpl | 12 - .../templates/controller.php.tpl | 12 +- .../controllermodel/fields.yaml | 4 +- .../new-controller-fields.yaml} | 0 .../databasetablemodel/fields.yaml | 2 +- .../templates/full-migration-code.php.tpl | 0 .../templates/migration-code.php.tpl | 0 .../localizationmodel/fields.yaml | 2 +- .../localizationmodel/templates/lang.php | 0 .../menusmodel/fields.yaml | 2 +- .../migrationmodel/fields.yaml | 0 .../migrationmodel/management-fields.yaml | 2 +- .../templates/migration.php.tpl | 0 .../migrationmodel/templates/seeder.php.tpl | 0 .../modelformmodel/fields.yaml | 4 +- .../modellistmodel/fields.yaml | 20 +- .../modelmodel/fields.yaml | 0 .../modelmodel/templates/model.php.tpl | 23 + .../templates/no-timestamps.php.tpl | 6 +- .../modelmodel/templates/soft-delete.php.tpl | 4 + .../permissionsmodel/fields.yaml | 2 +- .../pluginbasemodel/fields.yaml | 2 +- .../pluginbasemodel/templates/lang.php.tpl | 0 .../pluginbasemodel/templates/plugin.php.tpl | 14 + .../templates/version.yaml.tpl | 2 + .../{create.php.tpl => create.htm.tpl} | 4 +- .../{preview.php.tpl => preview.htm.tpl} | 2 +- .../{update.php.tpl => update.htm.tpl} | 2 +- .../templates/export.php.tpl | 18 - .../templates/import.php.tpl | 18 - .../templates/_list_toolbar.htm.tpl | 23 + .../templates/_list_toolbar.php.tpl | 26 - .../{index.php.tpl => index.htm.tpl} | 0 .../templates/_reorder_toolbar.htm.tpl | 3 + .../templates/reorder.htm.tpl | 8 + .../HasFormFields.php | 347 ---- .../standardcontrolsregistry/HasFormUi.php | 166 -- .../HasFormWidgets.php | 1269 ------------- plugins/rainlab/builder/composer.json | 3 +- plugins/rainlab/builder/controllers/Index.php | 65 +- ...ugin-selector.php => _plugin-selector.htm} | 0 .../index/{_sidepanel.php => _sidepanel.htm} | 14 +- .../index/{index.php => index.htm} | 0 .../builder/formwidgets/BlueprintBuilder.php | 320 ---- .../builder/formwidgets/ControllerBuilder.php | 15 - .../builder/formwidgets/FormBuilder.php | 85 +- .../builder/formwidgets/MenuEditor.php | 13 +- .../assets/js/blueprintbuilder.js | 145 -- .../blueprintbuilder/partials/_blueprint.php | 18 - .../blueprintbuilder/partials/_body.php | 11 - .../partials/_buildingarea.php | 24 - .../partials/_select_blueprint_form.php | 36 - .../partials/{_behavior.php => _behavior.htm} | 0 .../partials/{_body.php => _body.htm} | 0 .../{_buildingarea.php => _buildingarea.htm} | 0 .../js/formbuilder.domtopropertyjson.js | 58 +- .../formbuilder/assets/js/formbuilder.js | 16 +- .../formbuilder/assets/js/formbuilder.tabs.js | 6 +- .../partials/{_body.php => _body.htm} | 0 .../{_buildingarea.php => _buildingarea.htm} | 0 .../{_controlbody.php => _controlbody.htm} | 0 ...rolcontainer.php => _controlcontainer.htm} | 0 .../{_controllist.php => _controllist.htm} | 6 +- ...controlpalette.php => _controlpalette.htm} | 0 ...controlwrapper.php => _controlwrapper.htm} | 0 .../partials/{_tab.php => _tab.htm} | 0 .../partials/{_tabpanel.php => _tabpanel.htm} | 0 .../partials/{_tabs.php => _tabs.htm} | 29 +- .../partials/{_body.php => _body.htm} | 0 .../{_mainmenuitem.php => _mainmenuitem.htm} | 0 ...{_mainmenuitems.php => _mainmenuitems.htm} | 0 .../{_submenuitem.php => _submenuitem.htm} | 0 .../{_submenuitems.php => _submenuitems.htm} | 0 plugins/rainlab/builder/lang/cs.json | 4 - plugins/rainlab/builder/lang/cs/lang.php | 1252 ++++++------- plugins/rainlab/builder/lang/en.json | 6 - plugins/rainlab/builder/lang/en/lang.php | 1570 ++++++++--------- plugins/rainlab/builder/lang/es.json | 4 - plugins/rainlab/builder/lang/es/lang.php | 1294 +++++++------- plugins/rainlab/builder/lang/fa.json | 4 - plugins/rainlab/builder/lang/fa/lang.php | 1254 ++++++------- plugins/rainlab/builder/lang/nl.json | 4 - plugins/rainlab/builder/lang/nl/lang.php | 1287 +++++++------- plugins/rainlab/builder/lang/pl.json | 3 - plugins/rainlab/builder/lang/pl/lang.php | 1384 +++++++-------- plugins/rainlab/builder/lang/pt-br.json | 4 - plugins/rainlab/builder/lang/pt-br/lang.php | 1347 +++++++------- plugins/rainlab/builder/lang/zh-cn.json | 4 - plugins/rainlab/builder/lang/zh-cn/lang.php | 1479 ++++++++-------- .../rainlab/builder/models/CodeFileModel.php | 282 --- .../rainlab/builder/models/ImportsModel.php | 270 --- .../builder/models/ModelFilterModel.php | 213 --- .../builder/models/codefilemodel/fields.yaml | 21 - .../builder/models/importsmodel/fields.yaml | 17 - .../models/importsmodel/fields_import.yaml | 36 - .../models/importsmodel/fields_select.yaml | 14 - .../models/modelmodel/templates/model.php.tpl | 18 - .../templates/multisite-definitions.php.tpl | 25 - .../templates/relation-definitions.php.tpl | 18 - .../modelmodel/templates/settingmodel.php.tpl | 23 - .../modelmodel/templates/soft-delete.php.tpl | 5 - .../templates/validation-definitions.php.tpl | 44 - .../rainlab/builder/rainlab-builder.mix.js | 36 - .../tests/unit/classes/ModelModelTest.php | 2 +- plugins/rainlab/builder/updates/version.yaml | 4 - plugins/rainlab/builder/widgets/CodeList.php | 821 --------- .../builder/widgets/ControllerList.php | 48 +- .../builder/widgets/DatabaseTableList.php | 2 +- .../DefaultBehaviorDesignTimeProvider.php | 78 +- .../DefaultBlueprintDesignTimeProvider.php | 123 -- .../DefaultControlDesignTimeProvider.php | 45 +- .../rainlab/builder/widgets/LanguageList.php | 2 +- plugins/rainlab/builder/widgets/ModelList.php | 6 +- .../rainlab/builder/widgets/PluginList.php | 54 +- .../rainlab/builder/widgets/VersionList.php | 30 +- .../widgets/codelist/partials/_body.php | 3 - .../widgets/codelist/partials/_files.php | 7 - .../widgets/codelist/partials/_items.php | 54 - .../widgets/codelist/partials/_move_form.php | 40 - .../codelist/partials/_new_dir_form.php | 45 - .../codelist/partials/_rename_form.php | 46 - .../widgets/codelist/partials/_toolbar.php | 74 - .../codelist/partials/_widget-contents.php | 27 - .../partials/{_body.php => _body.htm} | 0 ...ntroller-list.php => _controller-list.htm} | 0 .../partials/{_items.php => _items.htm} | 8 +- .../partials/{_toolbar.php => _toolbar.htm} | 0 ...dget-contents.php => _widget-contents.htm} | 0 .../partials/{_body.php => _body.htm} | 0 .../partials/{_items.php => _items.htm} | 0 .../{_table-list.php => _table-list.htm} | 0 .../partials/{_toolbar.php => _toolbar.htm} | 0 ...dget-contents.php => _widget-contents.htm} | 0 ...ller.php => _behavior-form-controller.htm} | 0 .../_behavior-import-export-controller.php | 19 - .../partials/_behavior-list-controller.htm | 41 + .../partials/_behavior-list-controller.php | 41 - .../partials/_behavior-reorder-controller.htm | 19 + ...vior-unknown.php => _behavior-unknown.htm} | 0 .../partials/_blueprint-entry.php | 51 - .../partials/_blueprint-global.php | 51 - .../partials/_blueprint-unknown.php | 1 - ...ctor.php => _control-balloon-selector.htm} | 0 ...rol-checkbox.php => _control-checkbox.htm} | 0 ...kboxlist.php => _control-checkboxlist.htm} | 0 ...codeeditor.php => _control-codeeditor.htm} | 0 ...lorpicker.php => _control-colorpicker.htm} | 0 .../partials/_control-datatable.php | 3 - ...datepicker.php => _control-datepicker.htm} | 0 ...rol-dropdown.php => _control-dropdown.htm} | 0 .../partials/_control-email.php | 3 - ...fileupload.php => _control-fileupload.htm} | 0 .../{_control-hint.php => _control-hint.htm} | 0 ...rol-markdown.php => _control-markdown.htm} | 0 ...diafinder.php => _control-mediafinder.htm} | 0 .../partials/_control-nestedform.php | 1 - ...control-number.php => _control-number.htm} | 0 .../partials/_control-pagefinder.php | 3 - ...ntrol-partial.php => _control-partial.htm} | 2 +- ...rol-password.php => _control-password.htm} | 0 ...{_control-radio.php => _control-radio.htm} | 0 ...rdfinder.php => _control-recordfinder.htm} | 0 ...rol-relation.php => _control-relation.htm} | 0 .../partials/_control-repeater-static.php | 11 - ...rol-repeater.php => _control-repeater.htm} | 0 ...richeditor.php => _control-richeditor.htm} | 0 .../partials/_control-ruler.php | 1 - ...ntrol-section.php => _control-section.htm} | 0 .../partials/_control-sensitive.php | 3 - ...tatic.php => _control-static-repeater.htm} | 0 ...control-switch.php => _control-switch.htm} | 0 ...ntrol-taglist.php => _control-taglist.htm} | 0 .../{_control-text.php => _control-text.htm} | 0 ...rol-textarea.php => _control-textarea.htm} | 0 ...ontrol.php => _control-unknowncontrol.htm} | 0 .../partials/{_body.php => _body.htm} | 0 .../partials/{_items.php => _items.htm} | 0 ...{_language-list.php => _language-list.htm} | 0 .../partials/{_toolbar.php => _toolbar.htm} | 0 ...dget-contents.php => _widget-contents.htm} | 0 .../partials/{_body.php => _body.htm} | 0 .../partials/{_items.php => _items.htm} | 0 .../{_model-list.php => _model-list.htm} | 0 .../partials/{_toolbar.php => _toolbar.htm} | 0 ...dget-contents.php => _widget-contents.htm} | 0 .../partials/{_body.php => _body.htm} | 0 .../partials/{_items.php => _items.htm} | 0 .../{_plugin-list.php => _plugin-list.htm} | 0 ...olbar-buttons.php => _toolbar-buttons.htm} | 0 .../partials/{_toolbar.php => _toolbar.htm} | 0 .../partials/{_body.php => _body.htm} | 0 .../partials/{_items.php => _items.htm} | 0 .../partials/{_sort.php => _sort.htm} | 0 .../partials/{_toolbar.php => _toolbar.htm} | 0 .../{_version-list.php => _version-list.htm} | 0 ...dget-contents.php => _widget-contents.htm} | 0 .../bagisto/Plugin.php} | 3 +- plugins/romanah/bagisto/lang/en/lang.php | 6 + plugins/romanah/bagisto/plugin.yaml | 6 + .../bagisto/updates/version.yaml} | 0 318 files changed, 9747 insertions(+), 16624 deletions(-) create mode 100644 plugins/rainlab/builder/assets/css/builder-v1.css delete mode 100644 plugins/rainlab/builder/assets/images/loader-transparent.svg delete mode 100644 plugins/rainlab/builder/assets/images/tab-dark.png create mode 100644 plugins/rainlab/builder/assets/js/build.js delete mode 100644 plugins/rainlab/builder/assets/js/builder.codelist.js delete mode 100644 plugins/rainlab/builder/assets/js/builder.index.entity.code.js delete mode 100644 plugins/rainlab/builder/assets/js/builder.index.entity.imports.js delete mode 100644 plugins/rainlab/builder/assets/less/codelist.less delete mode 100644 plugins/rainlab/builder/assets/less/imports.less delete mode 100644 plugins/rainlab/builder/behaviors/IndexCodeOperations.php delete mode 100644 plugins/rainlab/builder/behaviors/IndexImportsOperations.php delete mode 100644 plugins/rainlab/builder/behaviors/indexcodeoperations/partials/_tab.php delete mode 100644 plugins/rainlab/builder/behaviors/indexcodeoperations/partials/_toolbar.php rename plugins/rainlab/builder/behaviors/indexcontrolleroperations/partials/{_create-controller-popup-form.php => _create-controller-popup-form.htm} (85%) rename plugins/rainlab/builder/behaviors/indexcontrolleroperations/partials/{_tab.php => _tab.htm} (100%) rename plugins/rainlab/builder/behaviors/indexcontrolleroperations/partials/{_toolbar.php => _toolbar.htm} (100%) rename plugins/rainlab/builder/behaviors/indexdatabasetableoperations/partials/{_migration-popup-form.php => _migration-popup-form.htm} (91%) rename plugins/rainlab/builder/behaviors/indexdatabasetableoperations/partials/{_tab.php => _tab.htm} (100%) rename plugins/rainlab/builder/behaviors/indexdatabasetableoperations/partials/{_toolbar.php => _toolbar.htm} (100%) delete mode 100644 plugins/rainlab/builder/behaviors/indeximportsoperations/partials/_import-blueprints-popup-form.php delete mode 100644 plugins/rainlab/builder/behaviors/indeximportsoperations/partials/_tab.php delete mode 100644 plugins/rainlab/builder/behaviors/indeximportsoperations/partials/_toolbar.php rename plugins/rainlab/builder/behaviors/indexlocalizationoperations/partials/{_copy-strings-popup-form.php => _copy-strings-popup-form.htm} (92%) rename plugins/rainlab/builder/behaviors/indexlocalizationoperations/partials/{_new-string-popup.php => _new-string-popup.htm} (92%) rename plugins/rainlab/builder/behaviors/indexlocalizationoperations/partials/{_tab.php => _tab.htm} (100%) rename plugins/rainlab/builder/behaviors/indexlocalizationoperations/partials/{_toolbar.php => _toolbar.htm} (100%) rename plugins/rainlab/builder/behaviors/indexmenusoperations/partials/{_tab.php => _tab.htm} (100%) rename plugins/rainlab/builder/behaviors/indexmenusoperations/partials/{_toolbar.php => _toolbar.htm} (100%) rename plugins/rainlab/builder/behaviors/indexmodelformoperations/partials/{_add-database-fields-popup-form.php => _add-database-fields-popup-form.htm} (83%) rename plugins/rainlab/builder/behaviors/indexmodelformoperations/partials/{_tab.php => _tab.htm} (100%) rename plugins/rainlab/builder/behaviors/indexmodelformoperations/partials/{_toolbar.php => _toolbar.htm} (100%) rename plugins/rainlab/builder/behaviors/indexmodellistoperations/partials/{_tab.php => _tab.htm} (100%) rename plugins/rainlab/builder/behaviors/indexmodellistoperations/partials/{_toolbar.php => _toolbar.htm} (100%) rename plugins/rainlab/builder/behaviors/indexmodeloperations/partials/{_model-popup-form.php => _model-popup-form.htm} (86%) rename plugins/rainlab/builder/behaviors/indexpermissionsoperations/partials/{_tab.php => _tab.htm} (100%) rename plugins/rainlab/builder/behaviors/indexpermissionsoperations/partials/{_toolbar.php => _toolbar.htm} (100%) rename plugins/rainlab/builder/behaviors/indexpluginoperations/partials/{_plugin-popup-form.php => _plugin-popup-form.htm} (86%) rename plugins/rainlab/builder/behaviors/indexpluginoperations/partials/{_plugin-update-hint.php => _plugin-update-hint.htm} (100%) rename plugins/rainlab/builder/behaviors/indexversionsoperations/partials/{_tab.php => _tab.htm} (90%) rename plugins/rainlab/builder/behaviors/indexversionsoperations/partials/{_toolbar.php => _toolbar.htm} (100%) rename plugins/rainlab/builder/behaviors/indexversionsoperations/partials/{_version-hint-block.php => _version-hint-block.htm} (90%) rename plugins/rainlab/builder/{models => classes}/BaseModel.php (85%) delete mode 100644 plugins/rainlab/builder/classes/BlueprintDesignTimeProviderBase.php delete mode 100644 plugins/rainlab/builder/classes/BlueprintGenerator.php rename plugins/rainlab/builder/{models => classes}/ControllerModel.php (68%) rename plugins/rainlab/builder/{models => classes}/DatabaseTableModel.php (92%) rename plugins/rainlab/builder/{models => classes}/LocalizationModel.php (98%) rename plugins/rainlab/builder/{models => classes}/MenusModel.php (88%) rename plugins/rainlab/builder/{models => classes}/MigrationModel.php (89%) rename plugins/rainlab/builder/{models => classes}/ModelFormModel.php (70%) rename plugins/rainlab/builder/{models => classes}/ModelListModel.php (85%) rename plugins/rainlab/builder/{models => classes}/ModelModel.php (60%) rename plugins/rainlab/builder/{models => classes}/ModelYamlModel.php (82%) rename plugins/rainlab/builder/{models => classes}/PermissionsModel.php (86%) rename plugins/rainlab/builder/{models => classes}/PluginBaseModel.php (96%) rename plugins/rainlab/builder/{models => classes}/PluginYamlModel.php (77%) delete mode 100644 plugins/rainlab/builder/classes/StandardBlueprintsRegistry.php delete mode 100644 plugins/rainlab/builder/classes/TailorBlueprintLibrary.php rename plugins/rainlab/builder/{models => classes}/YamlModel.php (99%) delete mode 100644 plugins/rainlab/builder/classes/blueprintgenerator/ContainerUtils.php delete mode 100644 plugins/rainlab/builder/classes/blueprintgenerator/ExpandoModelContainer.php delete mode 100644 plugins/rainlab/builder/classes/blueprintgenerator/FilterElementContainer.php delete mode 100644 plugins/rainlab/builder/classes/blueprintgenerator/FormElementContainer.php delete mode 100644 plugins/rainlab/builder/classes/blueprintgenerator/HasControllers.php delete mode 100644 plugins/rainlab/builder/classes/blueprintgenerator/HasExpandoModels.php delete mode 100644 plugins/rainlab/builder/classes/blueprintgenerator/HasMigrations.php delete mode 100644 plugins/rainlab/builder/classes/blueprintgenerator/HasModels.php delete mode 100644 plugins/rainlab/builder/classes/blueprintgenerator/HasNavigation.php delete mode 100644 plugins/rainlab/builder/classes/blueprintgenerator/HasPermissions.php delete mode 100644 plugins/rainlab/builder/classes/blueprintgenerator/HasVersionFile.php delete mode 100644 plugins/rainlab/builder/classes/blueprintgenerator/ListElementContainer.php delete mode 100644 plugins/rainlab/builder/classes/blueprintgenerator/ModelContainer.php delete mode 100644 plugins/rainlab/builder/classes/blueprintgenerator/templates/migration-join.php.tpl delete mode 100644 plugins/rainlab/builder/classes/blueprintgenerator/templates/migration-repeater.php.tpl delete mode 100644 plugins/rainlab/builder/classes/blueprintgenerator/templates/migration.php.tpl delete mode 100644 plugins/rainlab/builder/classes/controllergenerator/templates/controller-no-list.php.tpl rename plugins/rainlab/builder/{models => classes}/controllermodel/fields.yaml (92%) rename plugins/rainlab/builder/{models/controllermodel/fields_new_controller.yaml => classes/controllermodel/new-controller-fields.yaml} (100%) rename plugins/rainlab/builder/{models => classes}/databasetablemodel/fields.yaml (99%) rename plugins/rainlab/builder/{models => classes}/databasetablemodel/templates/full-migration-code.php.tpl (100%) rename plugins/rainlab/builder/{models => classes}/databasetablemodel/templates/migration-code.php.tpl (100%) rename plugins/rainlab/builder/{models => classes}/localizationmodel/fields.yaml (95%) rename plugins/rainlab/builder/{models => classes}/localizationmodel/templates/lang.php (100%) rename plugins/rainlab/builder/{models => classes}/menusmodel/fields.yaml (83%) rename plugins/rainlab/builder/{models => classes}/migrationmodel/fields.yaml (100%) rename plugins/rainlab/builder/{models => classes}/migrationmodel/management-fields.yaml (97%) rename plugins/rainlab/builder/{models => classes}/migrationmodel/templates/migration.php.tpl (100%) rename plugins/rainlab/builder/{models => classes}/migrationmodel/templates/seeder.php.tpl (100%) rename plugins/rainlab/builder/{models => classes}/modelformmodel/fields.yaml (92%) rename plugins/rainlab/builder/{models => classes}/modellistmodel/fields.yaml (92%) rename plugins/rainlab/builder/{models => classes}/modelmodel/fields.yaml (100%) create mode 100644 plugins/rainlab/builder/classes/modelmodel/templates/model.php.tpl rename plugins/rainlab/builder/{models => classes}/modelmodel/templates/no-timestamps.php.tpl (50%) create mode 100644 plugins/rainlab/builder/classes/modelmodel/templates/soft-delete.php.tpl rename plugins/rainlab/builder/{models => classes}/permissionsmodel/fields.yaml (97%) rename plugins/rainlab/builder/{models => classes}/pluginbasemodel/fields.yaml (95%) rename plugins/rainlab/builder/{models => classes}/pluginbasemodel/templates/lang.php.tpl (100%) create mode 100644 plugins/rainlab/builder/classes/pluginbasemodel/templates/plugin.php.tpl create mode 100644 plugins/rainlab/builder/classes/pluginbasemodel/templates/version.yaml.tpl rename plugins/rainlab/builder/classes/standardbehaviorsregistry/formcontroller/templates/{create.php.tpl => create.htm.tpl} (96%) rename plugins/rainlab/builder/classes/standardbehaviorsregistry/formcontroller/templates/{preview.php.tpl => preview.htm.tpl} (94%) rename plugins/rainlab/builder/classes/standardbehaviorsregistry/formcontroller/templates/{update.php.tpl => update.htm.tpl} (98%) delete mode 100644 plugins/rainlab/builder/classes/standardbehaviorsregistry/importexportcontroller/templates/export.php.tpl delete mode 100644 plugins/rainlab/builder/classes/standardbehaviorsregistry/importexportcontroller/templates/import.php.tpl create mode 100644 plugins/rainlab/builder/classes/standardbehaviorsregistry/listcontroller/templates/_list_toolbar.htm.tpl delete mode 100644 plugins/rainlab/builder/classes/standardbehaviorsregistry/listcontroller/templates/_list_toolbar.php.tpl rename plugins/rainlab/builder/classes/standardbehaviorsregistry/listcontroller/templates/{index.php.tpl => index.htm.tpl} (100%) create mode 100644 plugins/rainlab/builder/classes/standardbehaviorsregistry/reordercontroller/templates/_reorder_toolbar.htm.tpl create mode 100644 plugins/rainlab/builder/classes/standardbehaviorsregistry/reordercontroller/templates/reorder.htm.tpl delete mode 100644 plugins/rainlab/builder/classes/standardcontrolsregistry/HasFormFields.php delete mode 100644 plugins/rainlab/builder/classes/standardcontrolsregistry/HasFormUi.php delete mode 100644 plugins/rainlab/builder/classes/standardcontrolsregistry/HasFormWidgets.php rename plugins/rainlab/builder/controllers/index/{_plugin-selector.php => _plugin-selector.htm} (100%) rename plugins/rainlab/builder/controllers/index/{_sidepanel.php => _sidepanel.htm} (80%) rename plugins/rainlab/builder/controllers/index/{index.php => index.htm} (100%) delete mode 100644 plugins/rainlab/builder/formwidgets/BlueprintBuilder.php delete mode 100644 plugins/rainlab/builder/formwidgets/blueprintbuilder/assets/js/blueprintbuilder.js delete mode 100644 plugins/rainlab/builder/formwidgets/blueprintbuilder/partials/_blueprint.php delete mode 100644 plugins/rainlab/builder/formwidgets/blueprintbuilder/partials/_body.php delete mode 100644 plugins/rainlab/builder/formwidgets/blueprintbuilder/partials/_buildingarea.php delete mode 100644 plugins/rainlab/builder/formwidgets/blueprintbuilder/partials/_select_blueprint_form.php rename plugins/rainlab/builder/formwidgets/controllerbuilder/partials/{_behavior.php => _behavior.htm} (100%) rename plugins/rainlab/builder/formwidgets/controllerbuilder/partials/{_body.php => _body.htm} (100%) rename plugins/rainlab/builder/formwidgets/controllerbuilder/partials/{_buildingarea.php => _buildingarea.htm} (100%) rename plugins/rainlab/builder/formwidgets/formbuilder/partials/{_body.php => _body.htm} (100%) rename plugins/rainlab/builder/formwidgets/formbuilder/partials/{_buildingarea.php => _buildingarea.htm} (100%) rename plugins/rainlab/builder/formwidgets/formbuilder/partials/{_controlbody.php => _controlbody.htm} (100%) rename plugins/rainlab/builder/formwidgets/formbuilder/partials/{_controlcontainer.php => _controlcontainer.htm} (100%) rename plugins/rainlab/builder/formwidgets/formbuilder/partials/{_controllist.php => _controllist.htm} (93%) rename plugins/rainlab/builder/formwidgets/formbuilder/partials/{_controlpalette.php => _controlpalette.htm} (100%) rename plugins/rainlab/builder/formwidgets/formbuilder/partials/{_controlwrapper.php => _controlwrapper.htm} (100%) rename plugins/rainlab/builder/formwidgets/formbuilder/partials/{_tab.php => _tab.htm} (100%) rename plugins/rainlab/builder/formwidgets/formbuilder/partials/{_tabpanel.php => _tabpanel.htm} (100%) rename plugins/rainlab/builder/formwidgets/formbuilder/partials/{_tabs.php => _tabs.htm} (85%) rename plugins/rainlab/builder/formwidgets/menueditor/partials/{_body.php => _body.htm} (100%) rename plugins/rainlab/builder/formwidgets/menueditor/partials/{_mainmenuitem.php => _mainmenuitem.htm} (100%) rename plugins/rainlab/builder/formwidgets/menueditor/partials/{_mainmenuitems.php => _mainmenuitems.htm} (100%) rename plugins/rainlab/builder/formwidgets/menueditor/partials/{_submenuitem.php => _submenuitem.htm} (100%) rename plugins/rainlab/builder/formwidgets/menueditor/partials/{_submenuitems.php => _submenuitems.htm} (100%) delete mode 100644 plugins/rainlab/builder/lang/cs.json delete mode 100644 plugins/rainlab/builder/lang/en.json delete mode 100644 plugins/rainlab/builder/lang/es.json delete mode 100644 plugins/rainlab/builder/lang/fa.json delete mode 100644 plugins/rainlab/builder/lang/nl.json delete mode 100644 plugins/rainlab/builder/lang/pl.json delete mode 100644 plugins/rainlab/builder/lang/pt-br.json delete mode 100644 plugins/rainlab/builder/lang/zh-cn.json delete mode 100644 plugins/rainlab/builder/models/CodeFileModel.php delete mode 100644 plugins/rainlab/builder/models/ImportsModel.php delete mode 100644 plugins/rainlab/builder/models/ModelFilterModel.php delete mode 100644 plugins/rainlab/builder/models/codefilemodel/fields.yaml delete mode 100644 plugins/rainlab/builder/models/importsmodel/fields.yaml delete mode 100644 plugins/rainlab/builder/models/importsmodel/fields_import.yaml delete mode 100644 plugins/rainlab/builder/models/importsmodel/fields_select.yaml delete mode 100644 plugins/rainlab/builder/models/modelmodel/templates/model.php.tpl delete mode 100644 plugins/rainlab/builder/models/modelmodel/templates/multisite-definitions.php.tpl delete mode 100644 plugins/rainlab/builder/models/modelmodel/templates/relation-definitions.php.tpl delete mode 100644 plugins/rainlab/builder/models/modelmodel/templates/settingmodel.php.tpl delete mode 100644 plugins/rainlab/builder/models/modelmodel/templates/soft-delete.php.tpl delete mode 100644 plugins/rainlab/builder/models/modelmodel/templates/validation-definitions.php.tpl delete mode 100644 plugins/rainlab/builder/rainlab-builder.mix.js delete mode 100644 plugins/rainlab/builder/widgets/CodeList.php delete mode 100644 plugins/rainlab/builder/widgets/DefaultBlueprintDesignTimeProvider.php delete mode 100644 plugins/rainlab/builder/widgets/codelist/partials/_body.php delete mode 100644 plugins/rainlab/builder/widgets/codelist/partials/_files.php delete mode 100644 plugins/rainlab/builder/widgets/codelist/partials/_items.php delete mode 100644 plugins/rainlab/builder/widgets/codelist/partials/_move_form.php delete mode 100644 plugins/rainlab/builder/widgets/codelist/partials/_new_dir_form.php delete mode 100644 plugins/rainlab/builder/widgets/codelist/partials/_rename_form.php delete mode 100644 plugins/rainlab/builder/widgets/codelist/partials/_toolbar.php delete mode 100644 plugins/rainlab/builder/widgets/codelist/partials/_widget-contents.php rename plugins/rainlab/builder/widgets/controllerlist/partials/{_body.php => _body.htm} (100%) rename plugins/rainlab/builder/widgets/controllerlist/partials/{_controller-list.php => _controller-list.htm} (100%) rename plugins/rainlab/builder/widgets/controllerlist/partials/{_items.php => _items.htm} (86%) rename plugins/rainlab/builder/widgets/controllerlist/partials/{_toolbar.php => _toolbar.htm} (100%) rename plugins/rainlab/builder/widgets/controllerlist/partials/{_widget-contents.php => _widget-contents.htm} (100%) rename plugins/rainlab/builder/widgets/databasetablelist/partials/{_body.php => _body.htm} (100%) rename plugins/rainlab/builder/widgets/databasetablelist/partials/{_items.php => _items.htm} (100%) rename plugins/rainlab/builder/widgets/databasetablelist/partials/{_table-list.php => _table-list.htm} (100%) rename plugins/rainlab/builder/widgets/databasetablelist/partials/{_toolbar.php => _toolbar.htm} (100%) rename plugins/rainlab/builder/widgets/databasetablelist/partials/{_widget-contents.php => _widget-contents.htm} (100%) rename plugins/rainlab/builder/widgets/defaultbehaviordesigntimeprovider/partials/{_behavior-form-controller.php => _behavior-form-controller.htm} (100%) delete mode 100644 plugins/rainlab/builder/widgets/defaultbehaviordesigntimeprovider/partials/_behavior-import-export-controller.php create mode 100644 plugins/rainlab/builder/widgets/defaultbehaviordesigntimeprovider/partials/_behavior-list-controller.htm delete mode 100644 plugins/rainlab/builder/widgets/defaultbehaviordesigntimeprovider/partials/_behavior-list-controller.php create mode 100644 plugins/rainlab/builder/widgets/defaultbehaviordesigntimeprovider/partials/_behavior-reorder-controller.htm rename plugins/rainlab/builder/widgets/defaultbehaviordesigntimeprovider/partials/{_behavior-unknown.php => _behavior-unknown.htm} (100%) delete mode 100644 plugins/rainlab/builder/widgets/defaultblueprintdesigntimeprovider/partials/_blueprint-entry.php delete mode 100644 plugins/rainlab/builder/widgets/defaultblueprintdesigntimeprovider/partials/_blueprint-global.php delete mode 100644 plugins/rainlab/builder/widgets/defaultblueprintdesigntimeprovider/partials/_blueprint-unknown.php rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-balloon-selector.php => _control-balloon-selector.htm} (100%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-checkbox.php => _control-checkbox.htm} (100%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-checkboxlist.php => _control-checkboxlist.htm} (100%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-codeeditor.php => _control-codeeditor.htm} (100%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-colorpicker.php => _control-colorpicker.htm} (100%) delete mode 100644 plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/_control-datatable.php rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-datepicker.php => _control-datepicker.htm} (100%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-dropdown.php => _control-dropdown.htm} (100%) delete mode 100644 plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/_control-email.php rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-fileupload.php => _control-fileupload.htm} (100%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-hint.php => _control-hint.htm} (100%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-markdown.php => _control-markdown.htm} (100%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-mediafinder.php => _control-mediafinder.htm} (100%) delete mode 100644 plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/_control-nestedform.php rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-number.php => _control-number.htm} (100%) delete mode 100644 plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/_control-pagefinder.php rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-partial.php => _control-partial.htm} (93%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-password.php => _control-password.htm} (100%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-radio.php => _control-radio.htm} (100%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-recordfinder.php => _control-recordfinder.htm} (100%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-relation.php => _control-relation.htm} (100%) delete mode 100644 plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/_control-repeater-static.php rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-repeater.php => _control-repeater.htm} (100%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-richeditor.php => _control-richeditor.htm} (100%) delete mode 100644 plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/_control-ruler.php rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-section.php => _control-section.htm} (100%) delete mode 100644 plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/_control-sensitive.php rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-nestedform-static.php => _control-static-repeater.htm} (100%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-switch.php => _control-switch.htm} (100%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-taglist.php => _control-taglist.htm} (100%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-text.php => _control-text.htm} (100%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-textarea.php => _control-textarea.htm} (100%) rename plugins/rainlab/builder/widgets/defaultcontroldesigntimeprovider/partials/{_control-unknowncontrol.php => _control-unknowncontrol.htm} (100%) rename plugins/rainlab/builder/widgets/languagelist/partials/{_body.php => _body.htm} (100%) rename plugins/rainlab/builder/widgets/languagelist/partials/{_items.php => _items.htm} (100%) rename plugins/rainlab/builder/widgets/languagelist/partials/{_language-list.php => _language-list.htm} (100%) rename plugins/rainlab/builder/widgets/languagelist/partials/{_toolbar.php => _toolbar.htm} (100%) rename plugins/rainlab/builder/widgets/languagelist/partials/{_widget-contents.php => _widget-contents.htm} (100%) rename plugins/rainlab/builder/widgets/modellist/partials/{_body.php => _body.htm} (100%) rename plugins/rainlab/builder/widgets/modellist/partials/{_items.php => _items.htm} (100%) rename plugins/rainlab/builder/widgets/modellist/partials/{_model-list.php => _model-list.htm} (100%) rename plugins/rainlab/builder/widgets/modellist/partials/{_toolbar.php => _toolbar.htm} (100%) rename plugins/rainlab/builder/widgets/modellist/partials/{_widget-contents.php => _widget-contents.htm} (100%) rename plugins/rainlab/builder/widgets/pluginlist/partials/{_body.php => _body.htm} (100%) rename plugins/rainlab/builder/widgets/pluginlist/partials/{_items.php => _items.htm} (100%) rename plugins/rainlab/builder/widgets/pluginlist/partials/{_plugin-list.php => _plugin-list.htm} (100%) rename plugins/rainlab/builder/widgets/pluginlist/partials/{_toolbar-buttons.php => _toolbar-buttons.htm} (100%) rename plugins/rainlab/builder/widgets/pluginlist/partials/{_toolbar.php => _toolbar.htm} (100%) rename plugins/rainlab/builder/widgets/versionlist/partials/{_body.php => _body.htm} (100%) rename plugins/rainlab/builder/widgets/versionlist/partials/{_items.php => _items.htm} (100%) rename plugins/rainlab/builder/widgets/versionlist/partials/{_sort.php => _sort.htm} (100%) rename plugins/rainlab/builder/widgets/versionlist/partials/{_toolbar.php => _toolbar.htm} (100%) rename plugins/rainlab/builder/widgets/versionlist/partials/{_version-list.php => _version-list.htm} (100%) rename plugins/rainlab/builder/widgets/versionlist/partials/{_widget-contents.php => _widget-contents.htm} (100%) rename plugins/{rainlab/builder/models/pluginbasemodel/templates/plugin.php.tpl => romanah/bagisto/Plugin.php} (91%) mode change 100644 => 100755 create mode 100755 plugins/romanah/bagisto/lang/en/lang.php create mode 100755 plugins/romanah/bagisto/plugin.yaml rename plugins/{rainlab/builder/models/pluginbasemodel/templates/version.yaml.tpl => romanah/bagisto/updates/version.yaml} (100%) mode change 100644 => 100755 diff --git a/composer.json b/composer.json index 7683ad3..7291b5f 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,7 @@ "laravel/framework": "^9.0", "october/all": "^3.3", "rainlab/pages-plugin": "^1.5", - "rainlab/builder-plugin": "^2.0", + "rainlab/builder-plugin": "^1.2.5", "blakejones/magicforms-plugin": "^1.6", "rainlab/translate-plugin": "^1.0" }, diff --git a/plugins/rainlab/builder/LICENCE.md b/plugins/rainlab/builder/LICENCE.md index b93dc79..d68943e 100644 --- a/plugins/rainlab/builder/LICENCE.md +++ b/plugins/rainlab/builder/LICENCE.md @@ -1,3 +1,19 @@ -# License +# MIT license -See End User License Agreement at https://octobercms.com/eula +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/plugins/rainlab/builder/Plugin.php b/plugins/rainlab/builder/Plugin.php index c9d5f95..7c62bdc 100644 --- a/plugins/rainlab/builder/Plugin.php +++ b/plugins/rainlab/builder/Plugin.php @@ -1,135 +1,106 @@ "Builder", - 'description' => "Provides visual tools for building October plugins.", - 'author' => 'Alexey Bobkov, Samuel Georges', - 'icon' => 'icon-wrench', - 'homepage' => 'https://github.com/rainlab/builder-plugin' + 'name' => 'rainlab.builder::lang.plugin.name', + 'description' => 'rainlab.builder::lang.plugin.description', + 'author' => 'Alexey Bobkov, Samuel Georges', + 'icon' => 'icon-wrench', + 'homepage' => 'https://github.com/rainlab/builder-plugin' ]; } - /** - * registerComponents - */ public function registerComponents() { return [ - \RainLab\Builder\Components\RecordList::class => 'builderList', - \RainLab\Builder\Components\RecordDetails::class => 'builderDetails' + 'RainLab\Builder\Components\RecordList' => 'builderList', + 'RainLab\Builder\Components\RecordDetails' => 'builderDetails' ]; } - /** - * registerPermissions - */ public function registerPermissions() { return [ 'rainlab.builder.manage_plugins' => [ - 'tab' => "Builder", - 'label' => 'rainlab.builder::lang.plugin.manage_plugins' - ] + 'tab' => 'rainlab.builder::lang.plugin.name', + 'label' => 'rainlab.builder::lang.plugin.manage_plugins'] ]; } - /** - * registerNavigation - */ public function registerNavigation() { return [ 'builder' => [ - 'label' => "Builder", - 'url' => Backend::url('rainlab/builder'), - 'icon' => 'icon-wrench', - 'iconSvg' => 'plugins/rainlab/builder/assets/images/builder-icon.svg', + 'label' => 'rainlab.builder::lang.plugin.name', + 'url' => Backend::url('rainlab/builder'), + 'icon' => 'icon-wrench', + 'iconSvg' => 'plugins/rainlab/builder/assets/images/builder-icon.svg', 'permissions' => ['rainlab.builder.manage_plugins'], - 'order' => 400, + 'order' => 400, 'useDropdown' => false, 'sideMenu' => [ 'database' => [ - 'label' => 'rainlab.builder::lang.database.menu_label', - 'icon' => 'icon-hdd-o', - 'url' => 'javascript:;', - 'attributes' => ['data-menu-item' => 'database'], + 'label' => 'rainlab.builder::lang.database.menu_label', + 'icon' => 'icon-hdd-o', + 'url' => 'javascript:;', + 'attributes' => ['data-menu-item'=>'database'], 'permissions' => ['rainlab.builder.manage_plugins'] ], 'models' => [ - 'label' => 'rainlab.builder::lang.model.menu_label', - 'icon' => 'icon-random', - 'url' => 'javascript:;', - 'attributes' => ['data-menu-item' => 'models'], + 'label' => 'rainlab.builder::lang.model.menu_label', + 'icon' => 'icon-random', + 'url' => 'javascript:;', + 'attributes' => ['data-menu-item'=>'models'], 'permissions' => ['rainlab.builder.manage_plugins'] ], 'permissions' => [ - 'label' => 'rainlab.builder::lang.permission.menu_label', - 'icon' => 'icon-unlock-alt', - 'url' => 'javascript:;', - 'attributes' => ['data-no-side-panel' => 'true', 'data-builder-command' => 'permission:cmdOpenPermissions', 'data-menu-item' => 'permissions'], + 'label' => 'rainlab.builder::lang.permission.menu_label', + 'icon' => 'icon-unlock-alt', + 'url' => '#', + 'attributes' => ['data-no-side-panel'=>'true', 'data-builder-command'=>'permission:cmdOpenPermissions', 'data-menu-item'=>'permissions'], 'permissions' => ['rainlab.builder.manage_plugins'] ], 'menus' => [ - 'label' => 'rainlab.builder::lang.menu.menu_label', - 'icon' => 'icon-location-arrow', - 'url' => 'javascript:;', - 'attributes' => ['data-no-side-panel' => 'true', 'data-builder-command' => 'menus:cmdOpenMenus', 'data-menu-item' => 'menus'], + 'label' => 'rainlab.builder::lang.menu.menu_label', + 'icon' => 'icon-location-arrow', + 'url' => 'javascript:;', + 'attributes' => ['data-no-side-panel'=>'true', 'data-builder-command'=>'menus:cmdOpenMenus', 'data-menu-item'=>'menus'], 'permissions' => ['rainlab.builder.manage_plugins'] ], 'controllers' => [ - 'label' => 'rainlab.builder::lang.controller.menu_label', - 'icon' => 'icon-asterisk', - 'url' => 'javascript:;', - 'attributes' => ['data-menu-item' => 'controllers'], + 'label' => 'rainlab.builder::lang.controller.menu_label', + 'icon' => 'icon-asterisk', + 'url' => 'javascript:;', + 'attributes' => ['data-menu-item'=>'controllers'], 'permissions' => ['rainlab.builder.manage_plugins'] ], 'versions' => [ - 'label' => 'rainlab.builder::lang.version.menu_label', - 'icon' => 'icon-code-fork', - 'url' => 'javascript:;', - 'attributes' => ['data-menu-item' => 'version'], + 'label' => 'rainlab.builder::lang.version.menu_label', + 'icon' => 'icon-code-fork', + 'url' => 'javascript:;', + 'attributes' => ['data-menu-item'=>'version'], 'permissions' => ['rainlab.builder.manage_plugins'] ], 'localization' => [ - 'label' => 'rainlab.builder::lang.localization.menu_label', - 'icon' => 'icon-globe', - 'url' => 'javascript:;', - 'attributes' => ['data-menu-item' => 'localization'], - 'permissions' => ['rainlab.builder.manage_plugins'] - ], - 'code' => [ - 'label' => 'Code', - 'icon' => 'icon-file-code-o', - 'url' => 'javascript:;', - 'attributes' => ['data-menu-item' => 'code'], - 'permissions' => ['rainlab.builder.manage_plugins'] - ], - 'imports' => [ - 'label' => 'Import', - 'icon' => 'icon-arrow-circle-down', - 'url' => 'javascript:;', - 'attributes' => ['data-no-side-panel' => 'true', 'data-builder-command' => 'imports:cmdOpenImports', 'data-menu-item' => 'imports'], + 'label' => 'rainlab.builder::lang.localization.menu_label', + 'icon' => 'icon-globe', + 'url' => 'javascript:;', + 'attributes' => ['data-menu-item'=>'localization'], 'permissions' => ['rainlab.builder.manage_plugins'] ] ] @@ -138,19 +109,16 @@ class Plugin extends PluginBase ]; } - /** - * registerSettings - */ public function registerSettings() { return [ 'config' => [ - 'label' => 'Builder', - 'icon' => 'icon-wrench', + 'label' => 'Builder', + 'icon' => 'icon-wrench', 'description' => 'Set your author name and namespace for plugin creation.', - 'class' => 'RainLab\Builder\Models\Settings', + 'class' => 'RainLab\Builder\Models\Settings', 'permissions' => ['rainlab.builder.manage_plugins'], - 'order' => 600 + 'order' => 600 ] ]; } @@ -168,10 +136,6 @@ class Plugin extends PluginBase new StandardBehaviorsRegistry($behaviorLibrary); }); - Event::listen('pages.builder.registerTailorBlueprints', function ($blueprintLibrary) { - new StandardBlueprintsRegistry($blueprintLibrary); - }); - // Register reserved keyword validation Event::listen('translator.beforeResolve', function ($key, $replaces, $locale) { if ($key === 'validation.reserved') { @@ -179,17 +143,40 @@ class Plugin extends PluginBase } }); - $this->callAfterResolving('validator', function ($validator) { - $validator->extend('reserved', Reserved::class); - $validator->replacer('reserved', function ($message, $attribute, $rule, $parameters) { + // Compatibility with v1 legacy + if (!class_exists('System')) { + Validator::extend('reserved', Reserved::class); + Validator::replacer('reserved', function ($message, $attribute, $rule, $parameters) { // Fixes lowercase attribute names in the new plugin modal form return ucfirst($message); }); - }); + } + else { + $this->callAfterResolving('validator', function ($validator) { + $validator->extend('reserved', Reserved::class); + $validator->replacer('reserved', function ($message, $attribute, $rule, $parameters) { + // Fixes lowercase attribute names in the new plugin modal form + return ucfirst($message); + }); + }); + } // Register doctrine types if (!DoctrineType::hasType('timestamp')) { DoctrineType::addType('timestamp', \RainLab\Builder\Classes\Doctrine\TimestampType::class); } } + + /** + * register + */ + public function register() + { + /* + * Register asset bundles + */ + CombineAssets::registerCallback(function ($combiner) { + $combiner->registerBundle('$/rainlab/builder/assets/js/build.js'); + }); + } } diff --git a/plugins/rainlab/builder/README.md b/plugins/rainlab/builder/README.md index 7596674..b84b387 100644 --- a/plugins/rainlab/builder/README.md +++ b/plugins/rainlab/builder/README.md @@ -1,76 +1,48 @@ Builder is a visual development tool. It shortens plugin development time by automating common development tasks and makes programming fun again. With Builder you can create a fully functional plugin scaffold in a matter of minutes. -Builder makes the learning curve less steep by providing a visual interface that naturally incorporates October's design patterns and documentation. Here’s an example, instead of looking into the documentation for a list of supported form controls and their features, you can just open the Form Builder, find a suitable control in the Control Palette, add the control to the form and explore its properties with the visual inspector. +Builder makes the learning curve less steep by providing a visual interface that naturally incorporates October’s design patterns and documentation. Here’s an example, instead of looking into the documentation for a list of supported form controls and their features, you can just open the Form Builder, find a suitable control in the Control Palette, add the control to the form and explore its properties with the visual inspector. Builder implements a Rapid Application Development process that automates the boring activities without sacrificing complete control. With this tool you can spend more time implementing the plugin's business logic in your favorite code editor rather than dealing with the more mundane tasks, like building forms or managing plugin versions. Plugins created with the help of Builder are no different to plugins that you would usually create by hand. That means that you can continue to use your usual “hands on” workflow for updating your servers, managing the code versions and sharing work with your teammates. -**What's New!** Builder has been revamped to support October CMS v3, including dark mode, updated specifications, a Tailor import tool, and a new inline code editor. - -## Requirements - -- October CMS 3.3 or above - -### Installation - -Run the following to install this plugin: - -```bash -php artisan plugin:install RainLab.Builder -``` - -To uninstall this plugin: - -```bash -php artisan plugin:remove RainLab.Builder -``` - -If you are using October CMS v1 or v2, install v1.2 with the following commands: - -```bash -composer require rainlab/builder-plugin "^1.2" -``` - -## Video Tutorial +## Video tutorial We also recorded a video tutorial showing how to use the plugin to build a simple library plugin: [watch the video](https://vimeo.com/154415433). -## What You Can Do with Builder +## What you can do with Builder This tool includes multiple features that cover almost all aspects of creating a plugin. -- Initializing a new plugin - this creates the plugin directory along with any necessary files. -- Creating and editing plugin database tables. All schema changes are saved as regular migration files, so you can easily update the plugin on other servers using your regular workflow. -- Creating model classes. -- Creating backend forms with the visual Form Builder. -- Creating backend lists. -- Managing a list of user permissions provided by the plugin. -- Creating plugin backend navigation - in the form of main menu items and sidebar items. -- Creating backend controllers and configuring their behaviors with a visual tool. -- Managing plugin versions and updates. -- Managing plugin localization files. -- A set of universal components - used for displaying data from the plugin on the front-end in form of lists and single record details. -- Managing raw code files directly in the backend (**New in v2**). -- Converting [Tailor blueprints](https://docs.octobercms.com/3.x/cms/tailor/blueprints.html) to plugin files (**New in v2**). +* Initializing a new plugin - this creates the plugin directory along with any necessary files. +* Creating and editing plugin database tables. All schema changes are saved as regular migration files, so you can easily update the plugin on other servers using your regular workflow. +* Creating model classes. +* Creating back-end forms with the visual Form Builder. +* Creating back-end lists. +* Managing a list of user permissions provided by the plugin. +* Creating plugin back-end navigation - in the form of main menu items and sidebar items. +* Creating back-end controllers and configuring their behaviors with a visual tool. +* Managing plugin versions and updates. +* Managing plugin localization files. +* A set of universal components - used for displaying data from the plugin on the front-end in form of lists and single record details. -Put simply, you can create a multilingual plugin, that installs database tables, has backend lists and forms protected with user permissions, and adds CMS pages for displaying data managed with the plugin. After learning how Builder works, this process takes just a few minutes. +Put simply, you can create a multilingual plugin, that installs database tables, has back-end lists and forms protected with user permissions, and adds CMS pages for displaying data managed with the plugin. After learning how Builder works, this process takes just a few minutes. Builder is a productivity tool, it doesn't completely replace coding by hand and doesn't include a code editor for editing PHP files (the only exception is the version management interface). Builder never overwrites or deletes plugin PHP files, so you can rest assured knowing that the code you write never gets touched by Builder. However, Builder can create new PHP files, like models and controllers. -Most of the visual editors in Builder work with YAML configuration files, which are a native concept in October CMS. For example, after creating a model class in Builder, you can choose to add a form to the model. This operation creates a YAML file in the model's directory. +Most of the visual editors in Builder work with YAML configuration files, which are a native concept in OctoberCMS. For example, after creating a model class in Builder, you can choose to add a form to the model. This operation creates a YAML file in the model's directory. There are currently some limitations when using Builder. Some of them are missing features which will be added later. Others are ideas intentionally omitted to keep the things simple. As mentioned above, Builder doesn't want to replace coding, while at the same time, it doesn't go too far with visual programming either. The limitations are explained and described in the corresponding sections of the plugin documentation. Those limitations don't mean you can't create any plugin you want - the good old approach to writing the code manually is always applicable for plugins developed with Builder. Builder’s aim is to be a modest, yet powerful tool that is used to accelerate your development cycle. -## Getting Started +## Getting started -Before you create your first plugin with Builder you should configure it. Open the Settings page in October CMS backend and find Builder in the side menu. Enter your author name and namespace. The author name and namespace are required fields and should not change if you wish to publish your plugins on October CMS Marketplace. +Before you create your first plugin with Builder you should configure it. Open the Settings page in OctoberCMS back-end and find Builder in the side menu. Enter your author name and namespace. The author name and namespace are required fields and should not change if you wish to publish your plugins on OctoberCMS Marketplace. If you already have a Marketplace account, use your existing author name and namespace. -## Initializing a New Plugin +## Initializing a new plugin -On the Builder page in October CMS backend click the small arrow icon in the sidebar to expose the plugin list. After clicking the "Create plugin" button, enter the plugin name and namespace. The default author name and namespace can be pre-filled from the plugin settings. Select the plugin icon, enter the description text and plugin homepage URL (optional). +On the Builder page in OctoberCMS back-end click the small arrow icon in the sidebar to expose the plugin list. After clicking the "Create plugin" button, enter the plugin name and namespace. The default author name and namespace can be pre-filled from the plugin settings. Select the plugin icon, enter the description text and plugin homepage URL (optional). Please note that you cannot change the namespaces after you create the plugin. @@ -89,13 +61,13 @@ authornamespace plugin.yaml ``` -The file **plugin.yaml** contains the basic plugin information - name, description, permissions and backend navigation. This file is managed by the Builder user interface. +The file **plugin.yaml** contains the basic plugin information - name, description, permissions and back-end navigation. This file is managed by the Builder user interface. The initial contents of the **lang.php** localization file is the plugin name and description. The localization file is created in the default locale of your October installation. When a new plugin is created, it's automatically selected as the current plugin that Builder works with. You can select another plugin in the plugin list if you need. -## Managing Plugin Database Tables +## Managing plugin database tables Tables are managed on the Database tab of Builder. You can create tables, update their structure and delete tables with the visual interface. @@ -103,13 +75,13 @@ Click Add button to open the Create Table tab. Builder automatically generates p Every time when you save changes in a table, Builder shows a popup window with the automatically generated migration PHP code. You can't edit the code in the popup, but you can inspect it or copy to the clipboard. After reviewing the migration, click Save & Apply button. Builder executes the migration immediately and saves the migration file to the plugin's **updates** directory. Afterwards you can find all plugin migrations on the Versions tab of Builder. -> **Important**: Although Builder generates migration files automatically, it can't prevent data loss in some cases when you significantly change the table structure. In some cases it's possible - for example, when you alter length of a string column. Always check the migration PHP code generated by Builder before applying the migration and consider possible consequences of running the migration in a production database. +> **Note:** Although Builder generates migration files automatically, it can't prevent the data loss in some cases when you significantly change the table structure. In some cases it's possible - for example, when you alter length of a string column. Always check the migration PHP code generated by Builder before applying the migration and consider possible consequences of running the migration in a production database. Currently Builder doesn't allow to manage table indexes with the visual user interface. Unique column management is not supported yet as well. Please use the Version Management feature to manually create migration files. Please note that the `enum` data type is not currently supported by the Builder due to limitations in the underlying Doctrine classes. -## Managing Models +## Managing models You can edit models on the Models tab of Builder. Click the Add button, enter the model class name and select a database table from the drop-down list. @@ -117,15 +89,15 @@ The model class name should not contain the namespace. Some examples: Post, Prod Please note that you cannot delete model files with builder because it would contradict the idea of not deleting or overwriting PHP files with the visual tool. If you need to delete a model, remove its files manually. -## Managing Backend Forms +## Managing back-end forms -In October CMS forms belong to models. For every model you can create as many backend forms as you need, but in most cases there is a single form per model. +In OctoberCMS forms belong to models. For every model you can create as many back-end forms as you need, but in most cases there is a single form per model. -> **Note**: When you create a form, it's not displayed in October CMS backend until you create a backend controller which uses the form. Read more about controllers below. +> **Note:** when you create a form, it's not displayed in OctoberCMS back-end until you create a back-end controller which uses the form. Read about controllers below. On the Models tab in Builder find a model you want to create a form for. Expand the model if needed, hover the **Forms** section and click the plus sign. -Forms in October CMS are defined with YAML files. The default form file name is **fields.yaml**. In the Form Builder, click a placeholder and select a control from the popup list. After that you can click the control and edit it parameters in Inspector. +Forms in OctoberCMS are defined with YAML files. The default form file name is **fields.yaml**. In the Form Builder, click a placeholder and select a control from the popup list. After that you can click the control and edit it parameters in Inspector. Almost all form controls have these common properties: @@ -134,63 +106,66 @@ Almost all form controls have these common properties: * Comment - the comment text - fixed text or localization string key. * Span - position of the control on the form - left, right, full or automatic placement. -Most of the properties have descriptive names or have a description in Inspector. If you need more information about control properties please refer to the [Documentation](https://docs.octobercms.com/3.x/element/form-fields.html). +Most of the properties have descriptive names or have a description in Inspector. If you need more information about control properties please refer to the [Documentation](http://octobercms.com/docs/backend/forms). -You can drag controls in the Form Builder to rearrange them or to move them to/from form tabs. A form tab should have at least one control, otherwise it will be ignored when Form Builder saves the YAML file. +You can drag controls in the Form Builder to rearrange them or to move them to/from form tabs. -Some form controls, for example the file upload control, require a relation to be created in the model class manually. The relation name should be entered in the Field name property. Please read the [Forms Documentation](https://docs.octobercms.com/3.x/element/form-fields.html) for details about specific form controls. +> **Note:** a form tab should have at least one control, otherwise it will be ignored when Form Builder saves the YAML file. -## Managing Backend Lists -Similarly to forms, backend lists in October CMS belong to models. +> **Note:** some form controls, for example the file upload control, require a relation to be created in the model class manually. The relation name should be entered in the Field name property. Please read the [Forms Documentation](http://octobercms.com/docs/backend/forms) for details about specific form controls. -> **Note**: When you create a list, it's not displayed in October CMS backend until you create a backend controller which uses the list. Read about controllers below. +## Managing back-end lists + +Similarly to forms, back-end lists in OctoberCMS belong to models. + +> **Note:** when you create a list, it's not displayed in OctoberCMS back-end until you create a back-end controller which uses the list. Read about controllers below. On the Models tab in Builder find a model you want to create a list for. Expand the model if needed, hover the **Lists** section and click the plus sign. -Lists in October CMS are defined with YAML files. The default list file name is **columns.yaml**. The grid in the list editor contains list column definitions. Column property names are self descriptive, although some of them require some explanations. Refer to the [Lists documentation](https://docs.octobercms.com/3.x/element/list-columns.html) for details about each property. +Lists in OctoberCMS are defined with YAML files. The default list file name is **columns.yaml**. The grid in the list editor contains list column definitions. Column property names are self descriptive, although some of them require some explanations. Refer to the [Lists documentation](http://octobercms.com/docs/backend/lists#column-options) for details about each property. For the Label property you can either enter a static string or create a new localization string. The Field property column has an autocompletion feature attached. It allows you to select columns from the database table that is bound to the model. At the moment it doesn't show relation properties, but you can still type them in manually. -## Managing Plugin Permissions +## Managing plugin permissions -[Plugin permissions](https://docs.octobercms.com/3.x/extend/backend/users.html) define the features and backend plugin pages a user can access. You can manage permissions on the Permissions tab in Builder. For each permission you should specify a unique permission code, permission tab title and permission label. The tab title and label are displayed in the user management interface on the System page in October backend. +[Plugin permissions](http://octobercms.com/docs/backend/users) define what features and back-end plugin pages a user can access. You can manage permissions on the Permissions tab in Builder. For each permission you should specify a unique permission code, permission tab title and permission label. The tab title and label are displayed in the user management interface on the System page in October back-end. For the tab title and label you can either enter a static string or create a new localization string. Later, when you create controllers and menu items, you can select what permissions users should have in order to access or see those objects. -## Managing Backend Menus +## Managing back-end menus -The [plugin navigation](https://docs.octobercms.com/3.x/extend/backend/navigation.html) is managed on the Backend Menus tab of the Builder. The user interface allows to create top level menu items and sidebar items. +The [plugin navigation](http://octobercms.com/docs/plugin/registration#navigation-menus) is managed on the Backend Menus tab of the Builder. The user interface allows to create top level menu items and sidebar items. To create a menu item click the placeholder rectangle and then click the new item to open Inspector. In the inspector you can enter the item label, select icon and assign user permissions. The **code** property is required for referring menu items from the controllers code (for marking menu items active). -> **Note**: When you create menu items for backend pages which don't exist yet in the plugin, it makes sense to leave the **URL** property empty until you create the plugin controllers. This property supports autocompletion, so you can just select your controller URLs from the drop-down list. +> **Note:** when you create menu items for back-end pages which don't exist yet in the plugin, it makes sense to leave the **URL** property empty until you create the plugin controllers. This property supports autocompletion, so you can just select your controller URLs from the drop-down list. -## Managing Backend Controllers, Forms and Lists +## Managing back-end controllers, forms and lists -Back-end pages in October CMS are provided with backend controllers. Usually backend pages contain lists and forms for managing plugin records, although you can create any custom controller. +Back-end pages in OctoberCMS are provided with back-end controllers. Usually back-end pages contain lists and forms for managing plugin records, although you can create any custom controller. -Please refer to the [backend forms](https://docs.octobercms.com/3.x/extend/forms/form-controller.html) and [lists](https://docs.octobercms.com/3.x/extend/lists/list-controller.html) documentation pages for more information about controller behaviors. Currently only List and Form behaviors can be configured with the Builder. If your controller contains other behaviors they won't be removed by the Builder, you just won't be able to edit them with the visual interface. +Please refer to the [back-end forms](http://octobercms.com/docs/backend/forms), [lists](http://octobercms.com/docs/backend/lists) and [reorder controller](http://octobercms.com/docs/backend/reorder) documentation pages for more information about controller behaviors. Currently only List, Form and Reorder Controller behaviors can be configured with the Builder. If your controller contains other behaviors they won't be removed by the Builder, you just won't be able to edit them with the visual interface. Builder also allows you to create empty controller classes which don't implement any behaviors and customize them manually. -> **Note**: Some behaviors require specific model features to be implemented. For example, the Reorder Controller behavior requires the model to implement Sortable or NestedTree traits. Always refer to the specific behavior documentation for the implementation details. +> **Note:** Some behaviors require specific model features to be implemented. For example, the Reorder Controller behavior requires the model to implement Sortable or NestedTree traits. Always refer to the specific behavior documentation for the implementation details. To create a controller, click the Add button list on the Controllers tab. Enter the controller class name, for example Posts. -If the controller is going to provide backend lists or forms, select a base model in the drop-down list and select behaviors you want to add. You can also select a top and sidebar menu items that should be active on the controller pages. If needed, choose permissions that users must have to access the controller pages. +If the controller is going to provide back-end lists or forms, select a base model in the drop-down list and select behaviors you want to add. You can also select a top and sidebar menu items that should be active on the controller pages. If needed, choose permissions that users must have to access the controller pages. > Please note that the settings you enter in the Create Controller popup cannot be changed with Builder. However you can update them manually by editing controller classes. After creating a controller you can configure its behaviors. Click the controller in list and then click a behavior you want to configure. When Builder creates a controller it tries to apply default configuration to the behaviors, however you might want to change it. Inspector lists displays all supported behavior properties. URL properties (like the list records URLs) are autocomplete fields and populated with URLs of the existing plugin controllers. -## Managing Plugin Versions +## Managing plugin versions -Please read the [Version History](https://docs.octobercms.com/3.x/extend/system/plugins.html#version-history) documentation page to understand how versioning works in October CMS. +Please read the [Version History](http://octobercms.com/docs/plugin/updates) documentation page to understand how versioning works in OctoberCMS. Basically there are 3 types of version updates: @@ -206,19 +181,19 @@ For every version you should specify the new version number and description. Bui When a version file is saved, Builder doesn't apply it immediately. You should click the "Apply version" button in the toolbar in order to apply the version and execute the update code (if applicable). You can also rollback already applied version updates, change their code and apply again. This allows you to edit database schema updates generated by Builder if you don't like the default code. -> **Note**: Your migration files should provide correct rollback code in the `down` method in order to use the rollback feature. +> Note that your migration files should provide correct rollback code in the `down` method in order to use the rollback feature. -When you rollback a version, it automatically rolls back all newer versions. When you apply a version, it automatically applies all pending older versions. Please remember that when a user logs into the backend, October automatically applies all pending updates. Never edit versions on a production server or on a server with multiple backend users - it could cause unpredictable consequences. +When you rollback a version, it automatically rolls back all newer versions. When you apply a version, it automatically applies all pending older versions. Please remember that when a user logs into the back-end, October automatically applies all pending updates. Never edit versions on a production server or on a server with multiple back-end users - it could cause unpredictable consequences. Migrations that contain multiple scripts are not supported. They can't be created or edited with Builder. -## Managing Localization +## Managing localization -Localization files are managed on the Localization tab of the Builder. When a new plugin is initialized, a single language file is created. This file is created in the default system locale specified in October CMS configuration scripts. +Localization files are managed on the Localization tab of the Builder. When a new plugin is initialized, a single language file is created. This file is created in the default system locale specified in OctoberCMS configuration scripts. -You can create as many language files as you want. Builder UI always displays strings in the October CMS locale, so you might want to update your configuration files to see your plugin in another language. +You can create as many language files as you want. Builder UI always displays strings in the OctoberCMS locale, so you might want to update your configuration files to see your plugin in another language. -Please note that although [localization files in October CMS](https://docs.octobercms.com/3.x/extend/system/localization.html) are PHP scripts, they are translated to YAML to simplify the editing in the Builder user interface. When language files are saved, they are translated back to PHP again. +Please note that although [localization files in OctoberCMS](http://octobercms.com/docs/plugin/localization) are PHP scripts, they are translated to YAML to simplify the editing in the Builder user interface. When language files are saved, they are translated back to PHP again. Builder tries to keep the user interface synchronized with your default language file. This means that when you save the language file, Builder automatically updates all localized strings in all editors. In some cases you might need to close and open Inspector in order to re-initialize the autocomplete fields. @@ -232,45 +207,17 @@ plugin: If you create a new localization string from the Inspector or other editor while you have the default language file tab open in the Builder, it will try to update the tab contents or merge the updated file contents from the server. It's a good idea to keep the default localization file always saved in the Builder to avoid possible content conflicts when you edit localization from another place. -> **Tip**: In YAML a single quote is escaped with two single quotes (http://yaml.org/spec/current.html#id2534365). +> Protip: In YAML a single quote is escaped with two single quotes (http://yaml.org/spec/current.html#id2534365). -## Editing Code Files (New in v2) - -Raw code and other files can be managed directly in the Code tab of the Builder. You can navigate to any file within the context of the selected plugin. - -Use this to make code adjustments without the need for a code editor, which includes creating, moving, renaming and deleting files. - -## Importing Tailor Blueprints (New in v2) - -The Import tab of the Builder can generate scaffold files using [Tailor blueprints](https://docs.octobercms.com/3.x/cms/tailor/blueprints.html) as a source. In combination, Tailor and Builder work together to create a super-scaffolding tool since it can generate multiple files in one process. First, design your fields and preview them using Tailor, and then when you are ready, import them in to Builder to start working directly with the files. - -It important to note that importing blueprints is a one-way function, and in some cases it is better to leave content within Tailor for the benefits that come with its dynamic models, especially for content. This design decision is up to you. - -When visiting the Import tab, use the **Add Blueprint** button to select the Tailor blueprints you wish to import. You can select multiple blueprints and it is recommended to include related blueprints so the relationships between blueprints are preserved. - -Once added, each blueprint can be customized, which includes the Controller Class, Model Class, Table Name, Permission Code and Menu Code names. When these fields are modified, they will adjust the filenames of the generated files. - -Clicking the Import button will begin the conversion process. Some import options are shown to control how the import should proceed. - -- **Migrate Database** performs a database migration after the import is finished. This optional and you can migrate the database later. - -- **Disable Blueprints** will rename the blueprint files to use a backup extension (.bak) to disable them. - -- **Delete Blueprint Data** will delete any existing data and tables for the selected blueprints found within Tailor. - -Before clicking **Import**, be sure to double check the selected blueprints. The import process creates multiple scaffold files for the selected plugin. This process can be difficult to undo, so it is a good idea to practice on a test plugin first, without migrating the database or disabling the blueprints. - -When everything is done, you should see the controller, model and migration files generated for your selected plugin. - -## Displaying Plugin Records on CMS Pages +## Displaying plugin records on the front-end pages Builder provides universal CMS components that you can use for displaying records from your plugins on the front-end website pages. The components provide only basic functionality, for example they don't support a record search feature. -Please read the [CMS documentation](https://docs.octobercms.com/3.x/cms/themes/components.html) to learn more about the CMS components concept. +Please read the [CMS documentation](http://octobercms.com/docs/cms/components) to learn more about the CMS components concept. -### Record List Component +### Record list component -The Record list component outputs a list of records provided by a plugin's model. The component supports the following optional features: pagination, links to the record details page, using a [model scope](https://docs.octobercms.com/3.x/extend/database/model.html#query-scopes) for the list filtering. The list can be sorted by any column, but the sorting cannot be changed by website visitors - it's set in the component configuration. +The Record list component outputs a list of records provided by a plugin's model. The component supports the following optional features: pagination, links to the record details page, using a [model scope](https://octobercms.com/docs/database/model#query-scopes) for the list filtering. The list can be sorted by any column, but the sorting cannot be changed by website visitors - it's set in the component configuration. Add this component to a CMS page by dragging it to the page code from the component list and click it to configure its properties: @@ -286,11 +233,9 @@ Add this component to a CMS page by dragging it to the page code from the compon * `Sorting` - select a database column name to use for sorting the list. * `Direction` - select whether the sorting should be ascending or descending. -After configuring the component save and preview the page. Most likely you will want to customize the [default component markup](https://docs.octobercms.com/3.x/cms/themes/components.html#customizing-default-markup) to output more details about each record. +After configuring the component save and preview the page. Most likely you will want to customize the [default component markup](https://octobercms.com/docs/cms/components#customizing-default-markup) to output more details about each record. -> **Tip**: In the CMS editor, you can right-click on the `{% component %}` tag and select "Expand Markup". - -## Record Details Component +## Record details component The Record details component loads a model from the database and outputs its details on a page. If the requested record cannot be found, the component outputs the "record not found" message. @@ -302,27 +247,26 @@ Add this component to a CMS page by dragging it to the page code from the compon * `Display column` - enter a name of the database table column to display on the details page. The value is used in the default component partial, you can customize the component by providing custom markup instead of the default partial. * `Not found message` - a message to display if the record is not found. Used in the default partial. -After configuring the component save and preview the page. You will likely want to customize the [default component markup](https://docs.octobercms.com/3.x/cms/themes/components.html#customizing-default-markup) to output more details from the loaded model. +After configuring the component save and preview the page. You will likely want to customize the [default component markup](http://octobercms.com/docs/cms/components#customizing-default-markup) to output more details from the loaded model. -## Notes About Autocompletion +## Notes about the autocompletion Builder updates the Inspector autocompletion fields every time when the underlying data is updated. For example, the “Field name” property of the Form Builder controls is populated with the database table column names. If you update the table structure with Builder, the autocompletion cache updates automatically. However you may need to reopen Inspector so that it can update its editors. If you edit your plugin files or database structure with an external editor, Builder won’t be able to pick up those changes automatically. You might want to reload the Builder page after you add a database column with an external tool in order to refresh the autocompletion features. -## Editing Other Plugins +## Editing other plugins Although Builder allows you to edit plugins created by other authors, remember that you do it at your own risk. Plugins could be updated by their authors, which will eliminate your changes or break the plugin. In many cases, if you make updates to plugins developed by another author, you lose any technical support provided by the author. -## Adding Support for a Custom Form Widget +## Adding support for a custom FormWidget -To add a custom widget to the Builder plugin, you must first [register a backend form widget](https://docs.octobercms.com/3.x/extend/forms/form-widgets.html#form-widget-registration) for your plugin. +To add a custom widget to the Builder plugin, you must first [register a backend form widget](https://octobercms.com/docs/backend/widgets#form-widget-registration) for your plugin. -Once it is registered, define a list of [inspector properties](https://docs.octobercms.com/3.x/element/inspector-types.html) within your plugin in the Plugin registration class `boot()` method and register the custom control. For example: +Once it is registered, define a list of properties within your plugin in the Plugin registration class `boot()` method and register the custom control. For example: ```php -public function boot() -{ +public function boot() { $properties = [ 'max_value' => [ 'title' => 'The maximum allowed', @@ -358,12 +302,12 @@ public function boot() } ``` -> **Note**: See the `getStandardProperties()` method in the `rainlab/builder/classes/ControlLibrary.php` file for more examples. +> Note: See the `getStandardProperties()` method in the `rainlab/builder/classes/ControlLibrary.php` file for more examples. Now, we need the `ControlDesignTimeProvider` class referenced above. Save the following as `classes/ControlDesignTimeProvider.php` within your plugin's directory (replacing `'yourwidgetname'` with what you used in your Plugin registration class `boot()` method). ```php -namespace Acme\Blog\Classes; +li.control{cursor:pointer;margin-bottom:20px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.builder-building-area ul.builder-control-list>li.control[data-unknown]{cursor:default}.builder-building-area ul.builder-control-list>li.control.loading-control,.builder-building-area ul.builder-control-list>li.control.oc-placeholder{border:2px dotted var(--bs-border-color,#dae0e0);border-radius:4px;color:var(--bs-emphasis-color,#dae0e0);margin-top:20px;padding:10px 12px;position:relative;text-align:center}.builder-building-area ul.builder-control-list>li.control.loading-control i,.builder-building-area ul.builder-control-list>li.control.oc-placeholder i{margin-right:8px}.builder-building-area ul.builder-control-list>li.control.loading-control{background:var(--oc-secondary-bg)}.builder-building-area ul.builder-control-list>li.control.clear-row{display:none;margin-bottom:0}.builder-building-area ul.builder-control-list>li.control.loading-control{border-color:#bdc3c7;text-align:left}.builder-building-area ul.builder-control-list>li.control.loading-control:before,.builder-building-area ul.builder-control-list>li.control.updating-control:after{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite;background-image:url(../images/loader-transparent.svg);background-position:50% 50%;background-size:15px 15px;content:" ";display:inline-block;height:15px;margin-right:13px;position:relative;top:2px;width:15px}.builder-building-area ul.builder-control-list>li.control.loading-control:after{content:attr(data-builder-loading-text);display:inline-block}.builder-building-area ul.builder-control-list>li.control.updating-control:after{position:absolute;right:-8px;top:5px}.builder-building-area ul.builder-control-list>li.control.updating-control:before{background:hsla(0,0%,50%,.1);border-radius:4px;content:"";height:25px;position:absolute;right:0;top:0;width:25px}.builder-building-area ul.builder-control-list>li.control.drag-over{border-color:var(--oc-selection);color:var(--oc-selection)}.builder-building-area ul.builder-control-list>li.control.span-full{float:left;width:100%}.builder-building-area ul.builder-control-list>li.control.span-left{clear:left;float:left;width:48.5%}.builder-building-area ul.builder-control-list>li.control.span-right{clear:right;float:right;width:48.5%}.builder-building-area ul.builder-control-list>li.control.span-right+li.clear-row{clear:both;display:block}.builder-building-area ul.builder-control-list>li.control>div.remove-control{display:none}.builder-building-area ul.builder-control-list>li.control:not(.oc-placeholder):not(.loading-control):not(.updating-control):hover>div.remove-control{background:var(--oc-toolbar-border,#ecf0f1);border-radius:20px;color:var(--oc-toolbar-color,#95a5a6)!important;cursor:pointer;display:block;font-family:sans-serif;font-size:16px;font-weight:700;height:21px;line-height:21px;padding-left:6px;position:absolute;right:0;top:0;width:21px}.builder-building-area ul.builder-control-list>li.control:not(.oc-placeholder):not(.loading-control):not(.updating-control):hover>div.remove-control:hover{background:#c03f31;color:#fff!important}.builder-building-area ul.builder-control-list>li.control:not(.oc-placeholder):not(.loading-control):not(.updating-control):hover[data-control-type=hint]>div.remove-control,.builder-building-area ul.builder-control-list>li.control:not(.oc-placeholder):not(.loading-control):not(.updating-control):hover[data-control-type=partial]>div.remove-control{right:12px;top:12px}.builder-building-area ul.builder-control-list>li.control[data-control-type=hint].updating-control:before,.builder-building-area ul.builder-control-list>li.control[data-control-type=partial].updating-control:before{right:12px;top:7}.builder-building-area ul.builder-control-list>li.control[data-control-type=hint].updating-control:after,.builder-building-area ul.builder-control-list>li.control[data-control-type=partial].updating-control:after{right:4px;top:13px}.builder-building-area ul.builder-control-list>li.control>.control-static-contents,.builder-building-area ul.builder-control-list>li.control>.control-wrapper{position:relative;transition:margin .1s}.builder-building-area ul.builder-control-list>li.oc-placeholder.control-palette-open,.builder-building-area ul.builder-control-list>li.oc-placeholder.popover-highlight,.builder-building-area ul.builder-control-list>li.oc-placeholder:hover{background-color:var(--oc-selection)!important;border-color:var(--oc-selection);border-style:solid;color:#fff!important;opacity:1}.builder-building-area ul.builder-control-list>li.control.inspector-open:not(.oc-placeholder):not(.loading-control)>.control-wrapper *,.builder-building-area ul.builder-control-list>li.control:not(.oc-placeholder):not(.loading-control):not([data-unknown]):hover>.control-wrapper *{color:var(--oc-selection)!important}.builder-building-area ul.builder-control-list>li.control.drag-over:not(.oc-placeholder):before{background-color:var(--oc-selection);border-radius:5px;content:"";height:100%;left:0;position:absolute;top:0;width:10px}.builder-building-area ul.builder-control-list>li.control.drag-over:not(.oc-placeholder)>.control-static-contents,.builder-building-area ul.builder-control-list>li.control.drag-over:not(.oc-placeholder)>.control-wrapper{margin-left:20px;margin-right:-20px}.builder-building-area .control-body.field-disabled,.builder-building-area .control-body.field-hidden{opacity:.5}.builder-building-area .builder-control-label{color:var(--oc-builder-control-color);font-size:14px;font-weight:600;margin-bottom:10px}.builder-building-area .builder-control-label.required:after{content:" *";font-size:60%;vertical-align:super}.builder-building-area .builder-control-label:empty{margin-bottom:0}.builder-building-area .builder-control-comment-above{margin-bottom:8px;margin-top:-3px}.builder-building-area .builder-control-comment-below{margin-top:6px}.builder-building-area .builder-control-comment-above,.builder-building-area .builder-control-comment-below{color:#737373;font-size:12px}.builder-building-area .builder-control-comment-above:empty,.builder-building-area .builder-control-comment-below:empty{display:none}html.gecko.mac .builder-building-area div[data-root-control-wrapper]{margin-right:17px}[data-bs-theme=dark] .builder-building-area{background:var(--bs-body-bg)}.builder-building-area .builder-blueprint-control-dropdown,.builder-building-area .builder-blueprint-control-partial,.builder-building-area .builder-blueprint-control-text,.builder-building-area .builder-blueprint-control-textarea,.builder-building-area .builder-blueprint-control-unknown{border:2px solid var(--oc-document-ruler-tick,#bdc3c7);border-radius:4px;color:#95a5a6;padding:10px 12px}.builder-building-area .builder-blueprint-control-dropdown i,.builder-building-area .builder-blueprint-control-partial i,.builder-building-area .builder-blueprint-control-text i,.builder-building-area .builder-blueprint-control-textarea i,.builder-building-area .builder-blueprint-control-unknown i{margin-right:5px}.builder-building-area li.control:hover>.control-wrapper .builder-blueprint-control-dropdown,.builder-building-area li.control:hover>.control-wrapper .builder-blueprint-control-text,.builder-building-area li.control:hover>.control-wrapper .builder-blueprint-control-textarea,.builder-building-area li.inspector-open>.control-wrapper .builder-blueprint-control-dropdown,.builder-building-area li.inspector-open>.control-wrapper .builder-blueprint-control-text,.builder-building-area li.inspector-open>.control-wrapper .builder-blueprint-control-textarea{border-color:var(--oc-selection)}.builder-building-area li.control:hover>.control-wrapper .builder-blueprint-control-dropdown:before,.builder-building-area li.inspector-open>.control-wrapper .builder-blueprint-control-dropdown:before{background-color:var(--oc-selection)}.builder-building-area .builder-blueprint-control-textarea.size-tiny{min-height:50px}.builder-building-area .builder-blueprint-control-textarea.size-small{min-height:100px}.builder-building-area .builder-blueprint-control-textarea.size-large{min-height:200px}.builder-building-area .builder-blueprint-control-textarea.size-huge{min-height:250px}.builder-building-area .builder-blueprint-control-textarea.size-giant{min-height:350px}.builder-building-area .builder-blueprint-control-section{border-bottom:1px solid var(--oc-document-ruler-tick,#bdc3c7);padding-bottom:4px}.builder-building-area .builder-blueprint-control-section .builder-control-label{font-size:16px;margin-bottom:6px}.builder-building-area .builder-blueprint-control-partial,.builder-building-area .builder-blueprint-control-unknown{background:#eee;border-color:#eee}.builder-building-area .builder-blueprint-control-dropdown{position:relative}.builder-building-area .builder-blueprint-control-dropdown:after,.builder-building-area .builder-blueprint-control-dropdown:before{content:"";position:absolute}.builder-building-area .builder-blueprint-control-dropdown:before{background:var(--oc-document-ruler-tick,#bdc3c7);height:100%;right:40px;top:0;width:2px}.builder-building-area .builder-blueprint-control-dropdown:after{-webkit-font-smoothing:antialiased;color:inherit;content:"\f107";font-family:FontAwesome;font-size:20px;font-style:normal;font-weight:400;line-height:20px;right:15px;text-decoration:inherit;top:12px}.builder-building-area .builder-blueprint-control-checkbox:before{border:2px solid var(--oc-document-ruler-tick,#bdc3c7);border-radius:4px;content:" ";float:left;height:17px;position:relative;top:2px;width:17px}.builder-building-area .builder-blueprint-control-checkbox .builder-control-label{font-weight:400;margin-left:25px}.builder-building-area .builder-blueprint-control-checkbox .builder-control-comment-below{margin-left:25px}.builder-building-area li.control:hover>.control-wrapper .builder-blueprint-control-checkbox:before,.builder-building-area li.inspector-open>.control-wrapper .builder-blueprint-control-checkbox:before{border-color:var(--oc-selection)}.builder-building-area .builder-blueprint-control-switch{position:relative}.builder-building-area .builder-blueprint-control-switch:after,.builder-building-area .builder-blueprint-control-switch:before{border-radius:30px;content:" ";position:absolute}.builder-building-area .builder-blueprint-control-switch:before{background-color:var(--oc-document-ruler-tick,#bdc3c7);height:18px;left:2px;top:2px;width:34px}.builder-building-area .builder-blueprint-control-switch:after{background-color:#fff;height:14px;left:4px;margin-left:16px;top:4px;width:14px}.builder-building-area .builder-blueprint-control-switch .builder-control-label{font-weight:400;margin-left:45px}.builder-building-area .builder-blueprint-control-switch .builder-control-comment-below{margin-left:45px}.builder-building-area li.control:hover>.control-wrapper .builder-blueprint-control-switch:before,.builder-building-area li.inspector-open>.control-wrapper .builder-blueprint-control-switch:before{background-color:var(--oc-selection)}.builder-building-area .builder-blueprint-control-repeater-body>.repeater-button{background:var(--oc-document-ruler-tick,#bdc3c7);border-radius:2px;color:#fff;display:inline-block;margin-bottom:10px;padding:8px 13px}.builder-building-area ul.builder-control-list>li.control:hover>.control-wrapper>.control-body .builder-blueprint-control-repeater-body>.repeater-button,.builder-building-area ul.builder-control-list>li.inspector-open>.control-wrapper>.control-body .builder-blueprint-control-repeater-body>.repeater-button{background:var(--oc-selection);color:#fff!important}.builder-building-area ul.builder-control-list>li.control:hover>.control-wrapper>.control-body .builder-blueprint-control-repeater-body>.repeater-button span,.builder-building-area ul.builder-control-list>li.inspector-open>.control-wrapper>.control-body .builder-blueprint-control-repeater-body>.repeater-button span{color:#fff!important}.builder-building-area .builder-blueprint-control-repeater{position:relative}.builder-building-area .builder-blueprint-control-repeater:before{background:var(--oc-document-ruler-tick,#bdc3c7);content:"";height:100%;left:2px;position:absolute;top:0;width:2px}.builder-building-area .builder-blueprint-control-repeater:after{background:var(--oc-document-ruler-tick,#bdc3c7);border-radius:6px;content:"";height:6px;left:0;position:absolute;top:14px;width:6px}.builder-building-area .builder-blueprint-control-repeater>ul.builder-control-list{padding-bottom:0;padding-right:0;padding-top:10px}.builder-building-area li.control:hover>.builder-blueprint-control-repeater:after,.builder-building-area li.control:hover>.builder-blueprint-control-repeater:before,.builder-building-area li.inspector-open>.builder-blueprint-control-repeater:after,.builder-building-area li.inspector-open>.builder-blueprint-control-repeater:before{background-color:var(--oc-selection)}.builder-building-area .builder-blueprint-control-checkboxlist ul,.builder-building-area .builder-blueprint-control-radiolist ul{color:#95a5a6;list-style:none;padding:0}.builder-building-area .builder-blueprint-control-checkboxlist ul li,.builder-building-area .builder-blueprint-control-radiolist ul li{margin-bottom:3px}.builder-building-area .builder-blueprint-control-checkboxlist ul li:last-child,.builder-building-area .builder-blueprint-control-radiolist ul li:last-child{margin-bottom:0}.builder-building-area .builder-blueprint-control-checkboxlist ul li i,.builder-building-area .builder-blueprint-control-radiolist ul li i{margin-right:5px}.builder-building-area .builder-blueprint-control-text.fileupload.image{height:100px;text-align:center;width:100px}.builder-building-area .builder-blueprint-control-text.fileupload.image i{line-height:77px;margin-right:0}.builder-controllers-builder-area{background:var(--bs-body-bg,#fff)}.builder-controllers-builder-area ul.controller-behavior-list{list-style:none;margin-bottom:0;padding:20px}.builder-controllers-builder-area ul.controller-behavior-list:after,.builder-controllers-builder-area ul.controller-behavior-list:before{content:" ";display:table}.builder-controllers-builder-area ul.controller-behavior-list:after{clear:both}.builder-controllers-builder-area ul.controller-behavior-list li h4{border-bottom:1px dotted var(--oc-document-ruler-tick,#bdc3c7);margin:0 -20px 40px;text-align:center}.builder-controllers-builder-area ul.controller-behavior-list li h4 span{background:#72809d;border-radius:8px;color:#fff;display:inline-block;font-size:13px;line-height:100%;margin:0 auto;padding:7px 10px;position:relative;top:14px}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container{cursor:pointer;margin-bottom:40px}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container:after,.builder-controllers-builder-area ul.controller-behavior-list .behavior-container:before{content:" ";display:table}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container:after{clear:both}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .import-export-behavior,.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .list-behavior{border:2px solid var(--oc-document-ruler-tick,#bdc3c7);border-radius:4px;padding:25px 10px}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .import-export-behavior table,.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .list-behavior table{border-collapse:collapse;width:100%}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .import-export-behavior table td,.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .list-behavior table td{border-right:1px solid var(--oc-document-ruler-tick,#bdc3c7);padding:0 15px 15px}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .import-export-behavior table td:last-child,.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .list-behavior table td:last-child{border-right:none}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .import-export-behavior table .oc-placeholder,.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .list-behavior table .oc-placeholder{background:var(--oc-secondary-bg,#eef2f4);height:25px}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .import-export-behavior table tbody tr:last-child td,.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .list-behavior table tbody tr:last-child td{padding-bottom:0}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .import-export-behavior table .oc-placeholder,.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .import-export-behavior table i.icon-bars{float:left}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .import-export-behavior table i.icon-bars{color:#d6dde0;font-size:28px;line-height:28px;margin-right:15px;position:relative;top:-2px}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.form{border:2px solid var(--oc-document-ruler-tick,#bdc3c7);border-radius:4px;margin-bottom:20px;padding:25px 25px 0}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.form:after,.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.form:before{content:" ";display:table}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.form:after{clear:both}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.field.left{float:left;width:48%}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.field.right{float:right;width:45%}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.field div.label{background:var(--oc-secondary-bg,#eef2f4);height:25px;margin-bottom:10px}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.field div.label.size-3{width:100px}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.field div.label.size-5{width:150px}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.field div.label.size-2{width:60px}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.field div.control{background:var(--oc-secondary-bg,#eef2f4);height:35px;margin-bottom:25px}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.button{background:var(--oc-secondary-bg,#eef2f4);border-radius:4px;height:35px;margin-right:20px}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.button.size-5{width:100px}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.button.size-3{width:60px}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.button:first-child{margin-right:0}.builder-controllers-builder-area ul.controller-behavior-list .behavior-container.inspector-open *,.builder-controllers-builder-area ul.controller-behavior-list .behavior-container:hover *{border-color:var(--oc-selection)!important}html.gecko.mac .builder-controllers-builder-area ul.controller-behavior-list{padding-right:40px}.builder-tabs>.tabs{position:relative}.builder-tabs>.tabs .tab-control{display:block;position:absolute}.builder-tabs>.tabs .tab-control.inspector-trigger{cursor:pointer;font-size:14px;padding-left:5px;padding-right:5px}.builder-tabs>.tabs .tab-control.inspector-trigger span{background:#95a5a6;display:block;height:3px;margin-bottom:2px;width:3px}.builder-tabs>.tabs .tab-control.inspector-trigger span:last-child{margin-bottom:0}.builder-tabs>.tabs .tab-control.inspector-trigger.inspector-open span,.builder-tabs>.tabs .tab-control.inspector-trigger:hover span{background:var(--bs-link-color)}.builder-tabs>.tabs .tab-control.inspector-trigger.global{background:var(--bs-body-bg);border-radius:3px;padding-right:10px;right:0;top:5px;z-index:110}.builder-tabs>.tabs .tab-control.inspector-trigger.global>div{background:var(--oc-toolbar-bg);border-radius:3px;height:24px;padding-left:10px;padding-top:5px;width:24px}.builder-tabs>.tabs .tab-control.inspector-trigger.global>div:active{background:var(--oc-toolbar-hover-bg)}.builder-tabs>.tabs>ul.tabs{font-size:0;list-style:none;margin:0;overflow:hidden;padding-right:50px;position:relative;white-space:nowrap}.builder-tabs>.tabs>ul.tabs>li{cursor:pointer;display:inline-block;font-size:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}.builder-tabs>.tabs>ul.tabs>li>div.tab-container{color:var(--oc-tab-color)!important;position:relative}.builder-tabs>.tabs>ul.tabs>li>div.tab-container>div{position:relative;transition:padding .1s}.builder-tabs>.tabs>ul.tabs>li:hover>div{color:var(--oc-tab-active-color)!important}.builder-tabs>.tabs>ul.tabs>li .tab-control{display:none}.builder-tabs>.tabs>ul.tabs>li .tab-control.close-btn{color:#95a5a6;cursor:pointer;font-size:15px;height:15px;line-height:15px;right:18px;text-align:center;top:7px;width:15px}.builder-tabs>.tabs>ul.tabs>li .tab-control.close-btn:hover{color:var(--bs-link-color)!important}.builder-tabs>.tabs>ul.tabs>li .tab-control.inspector-trigger{right:34px;top:10px}.builder-tabs>.tabs>ul.tabs>li.active>div.tab-container{color:var(--oc-tab-active-color)!important}.builder-tabs>.tabs>ul.tabs>li.active .tab-control{display:block}.builder-tabs>.tabs>ul.panels{list-style:none;padding:0}.builder-tabs>.tabs>ul.panels>li{display:none}.builder-tabs>.tabs>ul.panels>li.active{display:block}.builder-tabs.primary>.tabs>ul.tabs{height:31px;padding:0 40px}.builder-tabs.primary>.tabs>ul.tabs:after{background:transparent linear-gradient(90deg,#bdc3c7 90%,transparent);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;width:100%;z-index:106}.builder-tabs.primary>.tabs>ul.tabs>li{bottom:-3px;margin-left:-20px;z-index:105}.builder-tabs.primary>.tabs>ul.tabs>li>div.tab-container{height:27px;padding:0 21px}.builder-tabs.primary>.tabs>ul.tabs>li>div.tab-container>div{background:#fff;padding:5px 5px 0}.builder-tabs.primary>.tabs>ul.tabs>li>div.tab-container>div>span{position:relative;top:-4px;transition:top .1s}.builder-tabs.primary>.tabs>ul.tabs>li.active{color:var(--oc-tab-active-color);z-index:107}.builder-tabs.primary>.tabs>ul.tabs>li.active>div.tab-container:after,.builder-tabs.primary>.tabs>ul.tabs>li.active>div.tab-container:before{background:transparent url(../images/tab.png) no-repeat;content:"";display:block;height:27px;position:absolute;top:0;width:21px}.builder-tabs.primary>.tabs>ul.tabs>li.active>div.tab-container:before{background-position:0 0;left:0}.builder-tabs.primary>.tabs>ul.tabs>li.active>div.tab-container:after{background-position:-75px 0;right:0}.builder-tabs.primary>.tabs>ul.tabs>li.active>div.tab-container>div{border-top:2px solid #bdc3c7;padding-right:30px}.builder-tabs.primary>.tabs>ul.tabs>li.active>div.tab-container>div>span{top:0}.builder-tabs.primary>.tabs>ul.tabs>li.active:before{background:#fff;bottom:0;content:"";display:block;height:3px;left:0;position:absolute;width:100%}.builder-tabs.primary>.tabs>ul.tabs>li.new-tab{background:transparent url(../images/tab.png) no-repeat;background-position:-24px 0;cursor:pointer;height:22px;margin-left:-11px;position:relative;top:4px;width:27px}.builder-tabs.primary>.tabs>ul.tabs>li.new-tab:hover{background-position:-24px -32px}.builder-tabs.secondary>.tabs ul.tabs{margin-left:12px;padding-left:0}.builder-tabs.secondary>.tabs ul.tabs>li{border-right:1px solid #bdc3c7;padding-right:1px}.builder-tabs.secondary>.tabs ul.tabs>li>div.tab-container>div{padding:4px 10px}.builder-tabs.secondary>.tabs ul.tabs>li>div.tab-container>div span{font-size:14px}.builder-tabs.secondary>.tabs ul.tabs>li .tab-control{right:23px;top:7px}.builder-tabs.secondary>.tabs ul.tabs>li .tab-control.close-btn{right:6px;top:5px}.builder-tabs.secondary>.tabs ul.tabs>li.new-tab{background:transparent;border:2px solid #e4e4e4;border-radius:4px;cursor:pointer;height:22px;left:9px;position:relative;top:7px;width:27px}.builder-tabs.secondary>.tabs ul.tabs>li.new-tab:hover{background-color:#2581b8;border-color:#2581b8}.builder-tabs.secondary>.tabs ul.tabs>li.active{padding-right:10px}.builder-tabs.secondary>.tabs ul.tabs>li.active>div.tab-container>div{color:var(--oc-builder-control-color);padding-right:30px}[data-bs-theme=dark] .builder-tabs.primary>.tabs>ul.tabs>li.active:before,[data-bs-theme=dark] .builder-tabs.primary>.tabs>ul.tabs>li>div.tab-container>div{background:#202124}[data-bs-theme=dark] .builder-tabs.primary>.tabs>ul.tabs>li.active>div.tab-container:after,[data-bs-theme=dark] .builder-tabs.primary>.tabs>ul.tabs>li.active>div.tab-container:before{background-image:url(../images/tab-dark.png)}.builder-menu-editor{background:var(--bs-body-bg,#fff)}.builder-menu-editor .builder-menu-editor-workspace{padding:30px}.builder-menu-editor ul.builder-menu{cursor:pointer;font-size:0;padding:0}.builder-menu-editor ul.builder-menu>li{border-radius:4px}.builder-menu-editor ul.builder-menu>li div.item-container:hover,.builder-menu-editor ul.builder-menu>li.inspector-open>div.item-container{background:var(--oc-selection)!important;color:#fff!important}.builder-menu-editor ul.builder-menu>li div.item-container:hover a,.builder-menu-editor ul.builder-menu>li.inspector-open>div.item-container a{color:#fff!important}.builder-menu-editor ul.builder-menu>li div.item-container{position:relative}.builder-menu-editor ul.builder-menu>li div.item-container .close-btn{color:#fff;display:none;font-size:14px;height:15px;line-height:14px;position:absolute;right:5px;text-align:center;top:5px;width:15px}.builder-menu-editor ul.builder-menu>li div.item-container:hover .close-btn{display:block;opacity:.5;text-decoration:none}.builder-menu-editor ul.builder-menu>li div.item-container:hover .close-btn:hover{opacity:1}.builder-menu-editor ul.builder-menu>li.add{border:2px dotted var(--oc-dropdown-trigger-border,#dde0e2);font-size:16px;text-align:center}.builder-menu-editor ul.builder-menu>li.add a{color:var(--oc-dropdown-trigger-color,#bdc3c7);text-decoration:none}.builder-menu-editor ul.builder-menu>li.add span.title{font-size:14px}.builder-menu-editor ul.builder-menu>li.add:hover{background:var(--oc-selection)!important;border:2px dotted var(--oc-selection)}.builder-menu-editor ul.builder-menu>li.add:hover a{color:#fff}.builder-menu-editor ul.builder-menu>li.list-sortable-placeholder{background:transparent;border:2px dotted var(--oc-selection);height:10px}.builder-menu-editor ul.builder-menu.builder-main-menu>li{display:inline-block;vertical-align:top}.builder-menu-editor ul.builder-menu.builder-main-menu>li.item{margin:0 20px 20px 0}.builder-menu-editor ul.builder-menu.builder-main-menu>li>div.item-container{background:var(--bs-secondary-bg,#ecf0f1);color:var(--bs-secondary-color,#708080);height:64px;padding:20px 25px;white-space:nowrap}.builder-menu-editor ul.builder-menu.builder-main-menu>li>div.item-container i{font-size:24px;margin-right:10px}.builder-menu-editor ul.builder-menu.builder-main-menu>li>div.item-container span.title{font-size:14px;line-height:100%;position:relative;top:-3px}.builder-menu-editor ul.builder-menu.builder-main-menu>li.add{height:64px}.builder-menu-editor ul.builder-menu.builder-main-menu>li.add a{display:block;height:60px;padding:20px 15px}.builder-menu-editor ul.builder-menu.builder-main-menu>li.add a i{margin-right:5px}.builder-menu-editor ul.builder-menu.builder-main-menu>li.add a span{position:relative;top:-1px}.builder-menu-editor ul.builder-menu.builder-submenu{margin-top:1px}.builder-menu-editor ul.builder-menu.builder-submenu>li{display:block;width:120px}.builder-menu-editor ul.builder-menu.builder-submenu>li i{display:block;margin-bottom:7px}.builder-menu-editor ul.builder-menu.builder-submenu>li span.title{display:block;font-size:12px}.builder-menu-editor ul.builder-menu.builder-submenu>li.item{margin:0 0 1px}.builder-menu-editor ul.builder-menu.builder-submenu>li>div.item-container{background:var(--bs-tertiary-bg,#f3f5f5);color:var(--bs-tertiary-color,#94a5a6);padding:18px 13px;text-align:center}.builder-menu-editor ul.builder-menu.builder-submenu>li>div.item-container i{font-size:24px}.builder-menu-editor ul.builder-menu.builder-submenu>li.add{margin-top:20px}.builder-menu-editor ul.builder-menu.builder-submenu>li.add a{display:block;padding:10px 20px}.builder-tailor-builder-area{background:var(--bs-body-bg,#fff)}.builder-tailor-builder-area ul.tailor-blueprint-list{cursor:pointer;list-style:none;margin-bottom:0;padding:20px}.builder-tailor-builder-area ul.tailor-blueprint-list:after,.builder-tailor-builder-area ul.tailor-blueprint-list:before{content:" ";display:table}.builder-tailor-builder-area ul.tailor-blueprint-list:after{clear:both}.builder-tailor-builder-area ul.tailor-blueprint-list li{position:relative}.builder-tailor-builder-area ul.tailor-blueprint-list li h4{border-bottom:1px dotted var(--oc-document-ruler-tick,#bdc3c7);margin:0 -20px 30px;text-align:center}.builder-tailor-builder-area ul.tailor-blueprint-list li h4 span{background:#72809d;border-radius:8px;color:#fff;display:inline-block;font-size:13px;line-height:100%;margin:0 auto;padding:7px 10px;position:relative;top:14px}.builder-tailor-builder-area ul.tailor-blueprint-list li table.table{margin:0}.builder-tailor-builder-area ul.tailor-blueprint-list li table.table td{font-size:.875em}.builder-tailor-builder-area ul.tailor-blueprint-list li table.table td>span{word-wrap:break-word;color:var(--bs-secondary-color);font-family:var(--bs-font-monospace);word-break:break-word}.builder-tailor-builder-area ul.tailor-blueprint-list li table.table th{font-size:.875em;text-align:right}.builder-tailor-builder-area ul.tailor-blueprint-list li table.table th:not(.table-danger){color:var(--bs-body-color)}.builder-tailor-builder-area ul.tailor-blueprint-list li table.table tr:last-child td,.builder-tailor-builder-area ul.tailor-blueprint-list li table.table tr:last-child th{border-bottom:none}.builder-tailor-builder-area ul.tailor-blueprint-list li div.remove-blueprint{background:var(--oc-toolbar-border,#ecf0f1);border-radius:20px;color:var(--oc-toolbar-color,#95a5a6)!important;cursor:pointer;display:none;font-family:sans-serif;font-size:16px;font-weight:700;height:21px;line-height:21px;padding-left:6px;position:absolute;right:0;top:20px;width:21px}.builder-tailor-builder-area ul.tailor-blueprint-list li div.remove-blueprint:hover{background:#c03f31;color:#fff!important}.builder-tailor-builder-area ul.tailor-blueprint-list li:hover div.remove-blueprint{display:block}.builder-tailor-builder-area ul.tailor-blueprint-list li.updating-blueprint:after{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite;background-image:url(../images/loader-transparent.svg);background-position:50% 50%;background-size:15px 15px;content:" ";display:inline-block;height:15px;margin-right:13px;position:relative;position:absolute;right:-8px;top:2px;top:35px;width:15px}.builder-tailor-builder-area ul.tailor-blueprint-list li.updating-blueprint:before{background:hsla(0,0%,50%,.1);border-radius:4px;content:"";height:25px;position:absolute;right:0;top:30px;width:25px}.builder-tailor-builder-area ul.tailor-blueprint-list .blueprint-container:after,.builder-tailor-builder-area ul.tailor-blueprint-list .blueprint-container:before{content:" ";display:table}.builder-tailor-builder-area ul.tailor-blueprint-list .blueprint-container:after{clear:both}.builder-tailor-builder-area ul.tailor-blueprint-list .blueprint-container .tailor-blueprint div.form{border:2px solid var(--oc-document-ruler-tick,#bdc3c7);border-radius:4px;margin-bottom:20px}.builder-tailor-builder-area ul.tailor-blueprint-list .blueprint-container .tailor-blueprint div.form:after,.builder-tailor-builder-area ul.tailor-blueprint-list .blueprint-container .tailor-blueprint div.form:before{content:" ";display:table}.builder-tailor-builder-area ul.tailor-blueprint-list .blueprint-container .tailor-blueprint div.form:after{clear:both}.builder-tailor-builder-area ul.tailor-blueprint-list .blueprint-container.inspector-open *,.builder-tailor-builder-area ul.tailor-blueprint-list .blueprint-container:hover *{border-color:var(--oc-selection)!important}.builder-tailor-builder-area .add-blueprint-button{border:2px dotted var(--oc-dropdown-trigger-border,#dde0e2);font-size:16px;height:64px;margin:0 20px 40px;text-align:center}.builder-tailor-builder-area .add-blueprint-button a{color:var(--oc-dropdown-trigger-color,#bdc3c7);display:block;height:60px;padding:20px 15px;text-decoration:none}.builder-tailor-builder-area .add-blueprint-button i{margin-right:5px}.builder-tailor-builder-area .add-blueprint-button span{position:relative;top:-1px}.builder-tailor-builder-area .add-blueprint-button span.title{font-size:14px}.builder-tailor-builder-area .add-blueprint-button:hover{background:var(--oc-selection)!important;border:2px dotted var(--oc-selection)}.builder-tailor-builder-area .add-blueprint-button:hover a{color:#fff}html.gecko.mac .builder-tailor-builder-area ul.tailor-blueprint-list{padding-right:40px}.localization-input-container input[type=text].string-editor{padding-right:20px!important}.localization-input-container .localization-trigger{color:#95a5a6;display:none;font-size:14px;height:10px;outline:none;position:absolute;width:10px}.localization-input-container .localization-trigger:active,.localization-input-container .localization-trigger:focus,.localization-input-container .localization-trigger:hover{color:#2581b8;text-decoration:none}table.data td.active .localization-input-container .localization-trigger,table.inspector-fields td.active .localization-input-container .localization-trigger{display:block}table.data td.active .localization-input-container .localization-trigger{right:7px!important;top:5px!important}.control-table td[data-column-type=builderLocalization] input[type=text]{border:none;display:block;height:100%;outline:none;padding-right:20px!important;padding:6px 10px;width:100%}html.chrome .control-table td[data-column-type=builderLocalization] input[type=text]{padding:6px 10px 7px!important}html.gecko .control-table td[data-column-type=builderLocalization] input[type=text],html.safari .control-table td[data-column-type=builderLocalization] input[type=text]{padding:5px 10px}.autocomplete.dropdown-menu.table-widget-autocomplete.localization li a{word-wrap:break-word;white-space:normal}table.data td[data-column-type=builderLocalization] .loading-indicator-container.size-small .loading-indicator{padding-bottom:0!important}table.data td[data-column-type=builderLocalization] .loading-indicator-container.size-small .loading-indicator span{left:auto;right:6px}[data-entity=code] .secondary-content-tabs .nav-tabs{display:none}.control-codelist p.no-data{border-radius:4px;color:var(--bs-secondary-color);font-size:14px;font-weight:400;margin:0;padding:22px;text-align:center}.control-codelist p.parent,.control-codelist ul li{font-weight:300;line-height:150%;margin-bottom:0}.control-codelist p.parent.active a,.control-codelist ul li.active a{background:#ddd;position:relative}.control-codelist p.parent.active a:after,.control-codelist ul li.active a:after{background:var(--bs-primary);content:" ";display:block;height:100%;left:0;position:absolute;top:0;width:4px}.control-codelist p.parent a.link,.control-codelist ul li a.link{word-wrap:break-word;color:var(--bs-body-color);display:block;font-size:14px;font-weight:400;outline:none;padding:10px 50px 10px 20px;position:relative}.control-codelist p.parent a.link:active,.control-codelist p.parent a.link:focus,.control-codelist p.parent a.link:hover,.control-codelist ul li a.link:active,.control-codelist ul li a.link:focus,.control-codelist ul li a.link:hover{text-decoration:none}.control-codelist p.parent a.link span,.control-codelist ul li a.link span{display:block}.control-codelist p.parent a.link span.description,.control-codelist ul li a.link span.description{word-wrap:break-word;color:var(--oc-primary-color);font-size:12px;font-weight:400}.control-codelist p.parent a.link span.description strong,.control-codelist ul li a.link span.description strong{color:var(--bs-body-color);font-weight:400}.control-codelist p.parent.directory a.link,.control-codelist p.parent.parent a.link,.control-codelist ul li.directory a.link,.control-codelist ul li.parent a.link{padding-left:40px}.control-codelist p.parent.directory a.link:after,.control-codelist p.parent.parent a.link:after,.control-codelist ul li.directory a.link:after,.control-codelist ul li.parent a.link:after{-webkit-font-smoothing:antialiased;color:#a1aab1;content:"\f07b";display:block;font-family:FontAwesome;font-size:14px;font-style:normal;font-weight:400;height:10px;left:20px;position:absolute;text-decoration:inherit;top:10px;width:10px}.control-codelist p.parent.parent a.link,.control-codelist ul li.parent a.link{word-wrap:break-word;background-color:var(--oc-primary-bg);color:var(--oc-primary-color);padding-left:41px}.control-codelist p.parent.parent a.link:before,.control-codelist ul li.parent a.link:before{background:var(--oc-primary-border);content:"";display:block;height:1px;left:0;position:absolute;top:0;width:100%}.control-codelist p.parent.parent a.link:after,.control-codelist ul li.parent a.link:after{-webkit-font-smoothing:antialiased;color:var(--oc-primary-color);content:"\f053";font-family:FontAwesome;font-size:13px;font-style:normal;font-weight:400;height:18px;left:22px;opacity:.5;text-decoration:inherit;top:11px;width:18px}.control-codelist p.parent a.link:hover{background:var(--oc-editor-section-bg)!important;color:var(--oc-editor-section-color)!important}.control-codelist p.parent a.link:hover:after{opacity:1}.control-codelist p.parent a.link:hover:before{display:none}.control-codelist ul{margin:0;padding:0}.control-codelist ul li{font-weight:300;line-height:150%;list-style:none;position:relative}.control-codelist ul li a.link:hover,.control-codelist ul li.active a.link{background:var(--oc-editor-section-bg);color:var(--oc-editor-section-color)}.control-codelist ul li.active a.link{position:relative}.control-codelist ul li.active a.link:after{background:var(--oc-primary-border);content:" ";display:block;height:100%;left:0;position:absolute;top:0;width:4px}.control-codelist ul li div.controls{position:absolute;right:45px;top:10px}.control-codelist ul li div.controls .dropdown{height:21px;width:14px}.control-codelist ul li div.controls .dropdown.open a.control{display:block!important}.control-codelist ul li div.controls .dropdown.open a.control:before{display:block;visibility:visible}.control-codelist ul li div.controls a.control{color:var(--bs-body-color);cursor:pointer;display:none;font-size:14px;height:21px;opacity:.5;overflow:hidden;text-decoration:none;visibility:hidden;width:14px}.control-codelist ul li div.controls a.control:before{display:block;margin-right:0;visibility:visible}.control-codelist ul li div.controls a.control:hover{opacity:1}.control-codelist ul li:hover{background:var(--oc-editor-section-bg);color:var(--oc-editor-section-color)}.control-codelist ul li:hover a.control,.control-codelist ul li:hover a.control>a.control,.control-codelist ul li:hover div.controls,.control-codelist ul li:hover div.controls>a.control{display:block!important}.control-codelist ul li .form-check{position:absolute;right:5px;top:10px}.control-codelist ul li .form-check label{margin-right:0}.control-codelist div.list-container{position:relative;transform:translate(0)}.control-codelist div.list-container.animate ul{transition:all .2s ease}.control-codelist div.list-container.goForward ul{transform:translate(-350px)}.control-codelist div.list-container.goBackward ul{transform:translate(350px)}.control-filelist ul li.group.model>h4 a:after{content:"\f074";top:10px}.control-filelist ul li.group.form>h4 a:after{content:"\f14a"}.control-filelist ul li.group.list>h4 a:after{content:"\f00b";top:10px}.control-filelist ul li.group>ul>li.group>ul>li>a{margin-left:-20px;padding-left:73px}.control-filelist ul li.with-icon span.description,.control-filelist ul li.with-icon span.title{padding-left:22px}.control-filelist ul li.with-icon i.list-icon{color:#405261;left:20px;position:absolute;top:12px}.control-filelist ul li.with-icon i.list-icon.mute{color:#8f8f8f}.control-filelist ul li.with-icon i.list-icon.icon-check-square{color:#8da85e}html.gecko .control-filelist ul li.group{margin-right:10px}.builder-inspector-container{border-left:1px solid var(--bs-border-color,#d9d9d9);width:350px}.builder-inspector-container:empty{display:none!important}form.hide-secondary-tabs div.control-tabs.secondary-tabs ul.nav.nav-tabs{display:none}.form-group.size-quarter{width:23.5%}.form-group.size-three-quarter{width:73.5%}form[data-entity=database] div.field-datatable,form[data-entity=database] div.field-datatable div[data-control=table],form[data-entity=database] div.field-datatable div[data-control=table] div.table-container,form[data-entity=models] div.field-datatable,form[data-entity=models] div.field-datatable div[data-control=table],form[data-entity=models] div.field-datatable div[data-control=table] div.table-container{height:100%;position:absolute;width:100%}form[data-entity=database] div.field-datatable div[data-control=table] div.table-container div.control-scrollbar,form[data-entity=models] div.field-datatable div[data-control=table] div.table-container div.control-scrollbar{bottom:0;height:auto!important;max-height:none!important;position:absolute;top:70px}.control-tabs.auxiliary-tabs{background:#fff}.control-tabs.auxiliary-tabs>div>ul.nav-tabs,.control-tabs.auxiliary-tabs>ul.nav-tabs{background:#fff;padding-bottom:2px;padding-left:20px;position:relative}.control-tabs.auxiliary-tabs>div>ul.nav-tabs:before,.control-tabs.auxiliary-tabs>ul.nav-tabs:before{background:#95a5a6;content:" ";display:block;height:1px;left:0;position:absolute;top:0;width:100%}.control-tabs.auxiliary-tabs>div>ul.nav-tabs>li,.control-tabs.auxiliary-tabs>ul.nav-tabs>li{margin-right:2px}.control-tabs.auxiliary-tabs>div>ul.nav-tabs>li>a,.control-tabs.auxiliary-tabs>ul.nav-tabs>li>a{background:#fff;border-bottom:1px solid #ecf0f1!important;border-left:1px solid #ecf0f1!important;border-radius:0 0 4px 4px;border-right:1px solid #ecf0f1!important;color:#bdc3c7;line-height:100%;padding:4px 10px}.control-tabs.auxiliary-tabs>div>ul.nav-tabs>li>a>span.title>span,.control-tabs.auxiliary-tabs>ul.nav-tabs>li>a>span.title>span{font-size:13px;height:auto;margin-bottom:0}.control-tabs.auxiliary-tabs>div>ul.nav-tabs>li.active,.control-tabs.auxiliary-tabs>ul.nav-tabs>li.active{top:0}.control-tabs.auxiliary-tabs>div>ul.nav-tabs>li.active:before,.control-tabs.auxiliary-tabs>ul.nav-tabs>li.active:before{background:#fff;content:" ";display:block;height:1px;left:0;position:absolute;top:0;top:-1px;width:100%}.control-tabs.auxiliary-tabs>div>ul.nav-tabs>li.active a,.control-tabs.auxiliary-tabs>ul.nav-tabs>li.active a{border-bottom:1px solid #95a5a6!important;border-left:1px solid #95a5a6!important;border-right:1px solid #95a5a6!important;color:#95a5a6;padding-top:5px}.control-tabs.auxiliary-tabs>div.tab-content>.tab-pane{background:#fff} +.builder-building-area { + background: white; +} +.builder-building-area ul.builder-control-list { + padding: 20px; + margin-bottom: 0; + list-style: none; +} +.builder-building-area ul.builder-control-list:before, +.builder-building-area ul.builder-control-list:after { + content: " "; + display: table; +} +.builder-building-area ul.builder-control-list:after { + clear: both; +} +.builder-building-area ul.builder-control-list > li.control { + position: relative; + margin-bottom: 20px; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.builder-building-area ul.builder-control-list > li.control[data-unknown] { + cursor: default; +} +.builder-building-area ul.builder-control-list > li.control.placeholder, +.builder-building-area ul.builder-control-list > li.control.loading-control { + padding: 10px 12px; + position: relative; + text-align: center; + border: 2px dotted #dde0e2; + margin-top: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + color: #dae0e0; +} +.builder-building-area ul.builder-control-list > li.control.placeholder i, +.builder-building-area ul.builder-control-list > li.control.loading-control i { + margin-right: 8px; +} +.builder-building-area ul.builder-control-list > li.control.clear-row { + display: none; + margin-bottom: 0; +} +.builder-building-area ul.builder-control-list > li.control.loading-control { + border-color: #bdc3c7; + text-align: left; +} +.builder-building-area ul.builder-control-list > li.control.updating-control:after, +.builder-building-area ul.builder-control-list > li.control.loading-control:before { + background-image: url(../../../../../modules/system/assets/ui/images/loader-transparent.svg); + background-size: 15px 15px; + background-position: 50% 50%; + display: inline-block; + width: 15px; + height: 15px; + content: ' '; + margin-right: 13px; + position: relative; + top: 2px; + -webkit-animation: spin 1s linear infinite; + animation: spin 1s linear infinite; +} +.builder-building-area ul.builder-control-list > li.control.loading-control:after { + content: attr(data-builder-loading-text); + display: inline-block; +} +.builder-building-area ul.builder-control-list > li.control.updating-control:after { + position: absolute; + right: -8px; + top: 5px; +} +.builder-building-area ul.builder-control-list > li.control.updating-control:before { + content: ''; + position: absolute; + right: 0; + top: 0; + width: 25px; + height: 25px; + background: rgba(127, 127, 127, 0.1); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.builder-building-area ul.builder-control-list > li.control.drag-over { + color: #2581b8; + border-color: #2581b8; +} +.builder-building-area ul.builder-control-list > li.control.span-full { + width: 100%; + float: left; +} +.builder-building-area ul.builder-control-list > li.control.span-left { + float: left; + width: 48.5%; + clear: left; +} +.builder-building-area ul.builder-control-list > li.control.span-right { + float: right; + width: 48.5%; + clear: right; +} +.builder-building-area ul.builder-control-list > li.control.span-right + li.clear-row { + display: block; + clear: both; +} +.builder-building-area ul.builder-control-list > li.control > div.remove-control { + display: none; +} +.builder-building-area ul.builder-control-list > li.control:not(.placeholder):not(.loading-control):not(.updating-control):hover > div.remove-control { + font-family: sans-serif; + display: block; + position: absolute; + right: 0; + top: 0; + cursor: pointer; + width: 21px; + height: 21px; + padding-left: 6px; + font-size: 16px; + font-weight: bold; + line-height: 21px; + -webkit-border-radius: 20px; + -moz-border-radius: 20px; + border-radius: 20px; + background: #ecf0f1; + color: #95a5a6 !important; +} +.builder-building-area ul.builder-control-list > li.control:not(.placeholder):not(.loading-control):not(.updating-control):hover > div.remove-control:hover { + color: white !important; + background: #c03f31; +} +.builder-building-area ul.builder-control-list > li.control:not(.placeholder):not(.loading-control):not(.updating-control):hover[data-control-type=hint] > div.remove-control, +.builder-building-area ul.builder-control-list > li.control:not(.placeholder):not(.loading-control):not(.updating-control):hover[data-control-type=partial] > div.remove-control { + top: 12px; + right: 12px; +} +.builder-building-area ul.builder-control-list > li.control[data-control-type=hint].updating-control:before, +.builder-building-area ul.builder-control-list > li.control[data-control-type=partial].updating-control:before { + right: 12px; + top: 7; +} +.builder-building-area ul.builder-control-list > li.control[data-control-type=hint].updating-control:after, +.builder-building-area ul.builder-control-list > li.control[data-control-type=partial].updating-control:after { + right: 4px; + top: 13px; +} +.builder-building-area ul.builder-control-list > li.control > .control-wrapper, +.builder-building-area ul.builder-control-list > li.control > .control-static-contents { + position: relative; + -webkit-transition: margin 0.1s; + transition: margin 0.1s; +} +.builder-building-area ul.builder-control-list > li.placeholder:hover, +.builder-building-area ul.builder-control-list > li.placeholder.popover-highlight, +.builder-building-area ul.builder-control-list > li.placeholder.control-palette-open { + background-color: #2581b8 !important; + color: white!important; + border-style: solid; + border-color: #2581b8; +} +.builder-building-area ul.builder-control-list > li.control:not(.placeholder):not(.loading-control):not([data-unknown]):hover > .control-wrapper *, +.builder-building-area ul.builder-control-list > li.control.inspector-open:not(.placeholder):not(.loading-control) > .control-wrapper * { + color: #2581b8 !important; +} +.builder-building-area ul.builder-control-list > li.control.drag-over:not(.placeholder):before { + position: absolute; + content: ''; + top: 0; + left: 0; + width: 10px; + height: 100%; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + background-color: #2581b8; +} +.builder-building-area ul.builder-control-list > li.control.drag-over:not(.placeholder) > .control-wrapper, +.builder-building-area ul.builder-control-list > li.control.drag-over:not(.placeholder) > .control-static-contents { + margin-left: 20px; + margin-right: -20px; +} +.builder-building-area .control-body.field-disabled, +.builder-building-area .control-body.field-hidden { + opacity: 0.5; + filter: alpha(opacity=50); +} +.builder-building-area .builder-control-label { + margin-bottom: 10px; + color: #555555; + font-size: 14px; + font-weight: 600; +} +.builder-building-area .builder-control-label.required:after { + vertical-align: super; + font-size: 60%; + content: " *"; +} +.builder-building-area .builder-control-label:empty { + margin-bottom: 0; +} +.builder-building-area .builder-control-comment-above { + margin-bottom: 8px; + margin-top: -3px; +} +.builder-building-area .builder-control-comment-below { + margin-top: 6px; +} +.builder-building-area .builder-control-comment-above, +.builder-building-area .builder-control-comment-below { + color: #737373; + font-size: 12px; +} +.builder-building-area .builder-control-comment-above:empty, +.builder-building-area .builder-control-comment-below:empty { + display: none; +} +html.gecko.mac .builder-building-area div[data-root-control-wrapper] { + margin-right: 17px; +} +.builder-building-area .builder-blueprint-control-text, +.builder-building-area .builder-blueprint-control-textarea, +.builder-building-area .builder-blueprint-control-partial, +.builder-building-area .builder-blueprint-control-unknown, +.builder-building-area .builder-blueprint-control-dropdown { + padding: 10px 12px; + border: 2px solid #bdc3c7; + color: #95a5a6; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.builder-building-area .builder-blueprint-control-text i, +.builder-building-area .builder-blueprint-control-textarea i, +.builder-building-area .builder-blueprint-control-partial i, +.builder-building-area .builder-blueprint-control-unknown i, +.builder-building-area .builder-blueprint-control-dropdown i { + margin-right: 5px; +} +.builder-building-area li.control:hover > .control-wrapper .builder-blueprint-control-text, +.builder-building-area li.inspector-open > .control-wrapper .builder-blueprint-control-text, +.builder-building-area li.control:hover > .control-wrapper .builder-blueprint-control-textarea, +.builder-building-area li.inspector-open > .control-wrapper .builder-blueprint-control-textarea, +.builder-building-area li.control:hover > .control-wrapper .builder-blueprint-control-dropdown, +.builder-building-area li.inspector-open > .control-wrapper .builder-blueprint-control-dropdown { + border-color: #2581b8; +} +.builder-building-area li.control:hover > .control-wrapper .builder-blueprint-control-dropdown:before, +.builder-building-area li.inspector-open > .control-wrapper .builder-blueprint-control-dropdown:before { + background-color: #2581b8; +} +.builder-building-area .builder-blueprint-control-textarea.size-tiny { + min-height: 50px; +} +.builder-building-area .builder-blueprint-control-textarea.size-small { + min-height: 100px; +} +.builder-building-area .builder-blueprint-control-textarea.size-large { + min-height: 200px; +} +.builder-building-area .builder-blueprint-control-textarea.size-huge { + min-height: 250px; +} +.builder-building-area .builder-blueprint-control-textarea.size-giant { + min-height: 350px; +} +.builder-building-area .builder-blueprint-control-section { + border-bottom: 1px solid #bdc3c7; + padding-bottom: 4px; +} +.builder-building-area .builder-blueprint-control-section .builder-control-label { + font-size: 16px; + margin-bottom: 6px; +} +.builder-building-area .builder-blueprint-control-unknown { + border-color: #eee; + background: #eee; +} +.builder-building-area .builder-blueprint-control-partial { + border-color: #eee; + background: #eee; +} +.builder-building-area .builder-blueprint-control-dropdown { + position: relative; +} +.builder-building-area .builder-blueprint-control-dropdown:before, +.builder-building-area .builder-blueprint-control-dropdown:after { + position: absolute; + content: ''; +} +.builder-building-area .builder-blueprint-control-dropdown:before { + top: 0; + width: 2px; + background: #bdc3c7; + right: 40px; + height: 100%; +} +.builder-building-area .builder-blueprint-control-dropdown:after { + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + content: "\f107"; + color: inherit; + right: 15px; + top: 12px; + font-size: 20px; + line-height: 20px; +} +.builder-building-area .builder-blueprint-control-checkbox:before { + float: left; + content: ' '; + border: 2px solid #bdc3c7; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + width: 17px; + height: 17px; + position: relative; + top: 2px; +} +.builder-building-area .builder-blueprint-control-checkbox .builder-control-label { + margin-left: 25px; + font-weight: normal; +} +.builder-building-area .builder-blueprint-control-checkbox .builder-control-comment-below { + margin-left: 25px; +} +.builder-building-area li.control:hover > .control-wrapper .builder-blueprint-control-checkbox:before, +.builder-building-area li.inspector-open > .control-wrapper .builder-blueprint-control-checkbox:before { + border-color: #2581b8; +} +.builder-building-area .builder-blueprint-control-switch { + position: relative; +} +.builder-building-area .builder-blueprint-control-switch:before, +.builder-building-area .builder-blueprint-control-switch:after { + position: absolute; + content: ' '; + -webkit-border-radius: 30px; + -moz-border-radius: 30px; + border-radius: 30px; +} +.builder-building-area .builder-blueprint-control-switch:before { + background-color: #bdc3c7; + width: 34px; + height: 18px; + top: 2px; + left: 2px; +} +.builder-building-area .builder-blueprint-control-switch:after { + background-color: white; + width: 14px; + height: 14px; + top: 4px; + left: 4px; + margin-left: 16px; +} +.builder-building-area .builder-blueprint-control-switch .builder-control-label { + margin-left: 45px; + font-weight: normal; +} +.builder-building-area .builder-blueprint-control-switch .builder-control-comment-below { + margin-left: 45px; +} +.builder-building-area li.control:hover > .control-wrapper .builder-blueprint-control-switch:before, +.builder-building-area li.inspector-open > .control-wrapper .builder-blueprint-control-switch:before { + background-color: #2581b8; +} +.builder-building-area .builder-blueprint-control-repeater-body > .repeater-button { + padding: 8px 13px; + background: #bdc3c7; + color: white; + display: inline-block; + margin-bottom: 10px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; +} +.builder-building-area ul.builder-control-list > li.control:hover > .control-wrapper > .control-body .builder-blueprint-control-repeater-body > .repeater-button, +.builder-building-area ul.builder-control-list > li.inspector-open > .control-wrapper > .control-body .builder-blueprint-control-repeater-body > .repeater-button { + background: #2581b8; + color: white!important; +} +.builder-building-area ul.builder-control-list > li.control:hover > .control-wrapper > .control-body .builder-blueprint-control-repeater-body > .repeater-button span, +.builder-building-area ul.builder-control-list > li.inspector-open > .control-wrapper > .control-body .builder-blueprint-control-repeater-body > .repeater-button span { + color: white!important; +} +.builder-building-area .builder-blueprint-control-repeater { + position: relative; +} +.builder-building-area .builder-blueprint-control-repeater:before { + content: ''; + position: absolute; + width: 2px; + top: 0; + left: 2px; + height: 100%; + background: #bdc3c7; +} +.builder-building-area .builder-blueprint-control-repeater:after { + content: ''; + position: absolute; + width: 6px; + height: 6px; + top: 14px; + left: 0; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + background: #bdc3c7; +} +.builder-building-area .builder-blueprint-control-repeater > ul.builder-control-list { + padding-right: 0; + padding-bottom: 0; + padding-top: 10px; +} +.builder-building-area li.control:hover > .builder-blueprint-control-repeater:before, +.builder-building-area li.inspector-open > .builder-blueprint-control-repeater:before, +.builder-building-area li.control:hover > .builder-blueprint-control-repeater:after, +.builder-building-area li.inspector-open > .builder-blueprint-control-repeater:after { + background-color: #2581b8; +} +.builder-building-area .builder-blueprint-control-radiolist ul, +.builder-building-area .builder-blueprint-control-checkboxlist ul { + list-style: none; + padding: 0; + color: #95a5a6; +} +.builder-building-area .builder-blueprint-control-radiolist ul li, +.builder-building-area .builder-blueprint-control-checkboxlist ul li { + margin-bottom: 3px; +} +.builder-building-area .builder-blueprint-control-radiolist ul li:last-child, +.builder-building-area .builder-blueprint-control-checkboxlist ul li:last-child { + margin-bottom: 0; +} +.builder-building-area .builder-blueprint-control-radiolist ul li i, +.builder-building-area .builder-blueprint-control-checkboxlist ul li i { + margin-right: 5px; +} +.builder-building-area .builder-blueprint-control-text.fileupload.image { + width: 100px; + height: 100px; + text-align: center; +} +.builder-building-area .builder-blueprint-control-text.fileupload.image i { + line-height: 77px; + margin-right: 0; +} +.builder-controllers-builder-area { + background: white; +} +.builder-controllers-builder-area ul.controller-behavior-list { + padding: 20px; + margin-bottom: 0; + list-style: none; +} +.builder-controllers-builder-area ul.controller-behavior-list:before, +.builder-controllers-builder-area ul.controller-behavior-list:after { + content: " "; + display: table; +} +.builder-controllers-builder-area ul.controller-behavior-list:after { + clear: both; +} +.builder-controllers-builder-area ul.controller-behavior-list li h4 { + text-align: center; + border-bottom: 1px dotted #bdc3c7; + margin: 0 -20px 40px; +} +.builder-controllers-builder-area ul.controller-behavior-list li h4 span { + display: inline-block; + color: white; + margin: 0 auto; + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + border-radius: 8px; + background: #bdc3c7; + padding: 7px 10px; + font-size: 13px; + line-height: 100%; + position: relative; + top: 14px; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container { + margin-bottom: 40px; + cursor: pointer; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container:before, +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container:after { + content: " "; + display: table; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container:after { + clear: both; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .list-behavior, +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .reorder-behavior { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + border: 2px solid #bdc3c7; + padding: 25px 10px 25px 10px; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .list-behavior table, +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .reorder-behavior table { + border-collapse: collapse; + width: 100%; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .list-behavior table td, +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .reorder-behavior table td { + padding: 0 15px 15px 15px; + border-right: 1px solid #bdc3c7; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .list-behavior table td:last-child, +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .reorder-behavior table td:last-child { + border-right: none; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .list-behavior table .placeholder, +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .reorder-behavior table .placeholder { + background: #EEF2F4; + height: 25px; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .list-behavior table tbody tr:last-child td, +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .reorder-behavior table tbody tr:last-child td { + padding-bottom: 0; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .reorder-behavior table i.icon-bars, +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .reorder-behavior table .placeholder { + float: left; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .reorder-behavior table i.icon-bars { + margin-right: 15px; + color: #D6DDE0; + font-size: 28px; + line-height: 28px; + position: relative; + top: -2px; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.form { + padding: 25px 25px 0 25px; + border: 2px solid #bdc3c7; + margin-bottom: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.form:before, +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.form:after { + content: " "; + display: table; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.form:after { + clear: both; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.field.left { + float: left; + width: 48%; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.field.right { + float: right; + width: 45%; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.field div.label { + background: #EEF2F4; + height: 25px; + margin-bottom: 10px; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.field div.label.size-3 { + width: 100px; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.field div.label.size-5 { + width: 150px; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.field div.label.size-2 { + width: 60px; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.field div.control { + background: #EEF2F4; + height: 35px; + margin-bottom: 25px; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.button { + background: #EEF2F4; + height: 35px; + margin-right: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.button.size-5 { + width: 100px; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.button.size-3 { + width: 60px; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container .form-behavior div.button:first-child { + margin-right: 0; +} +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container:hover *, +.builder-controllers-builder-area ul.controller-behavior-list .behavior-container.inspector-open * { + border-color: #2581b8 !important; +} +html.gecko.mac .builder-controllers-builder-area ul.controller-behavior-list { + padding-right: 40px; +} +.builder-tabs > .tabs { + position: relative; +} +.builder-tabs > .tabs .tab-control { + position: absolute; + display: block; +} +.builder-tabs > .tabs .tab-control.inspector-trigger { + font-size: 14px; + padding-left: 5px; + padding-right: 5px; + cursor: pointer; +} +.builder-tabs > .tabs .tab-control.inspector-trigger span { + display: block; + width: 3px; + height: 3px; + margin-bottom: 2px; + background: #95a5a6; +} +.builder-tabs > .tabs .tab-control.inspector-trigger span:last-child { + margin-bottom: 0; +} +.builder-tabs > .tabs .tab-control.inspector-trigger:hover span, +.builder-tabs > .tabs .tab-control.inspector-trigger.inspector-open span { + background: #3498db; +} +.builder-tabs > .tabs .tab-control.inspector-trigger.global { + top: 5px; + right: 15px; +} +.builder-tabs > .tabs > ul.tabs { + margin: 0; + list-style: none; + font-size: 0; + white-space: nowrap; + overflow: hidden; + position: relative; +} +.builder-tabs > .tabs > ul.tabs > li { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + display: inline-block; + font-size: 13px; + white-space: nowrap; + position: relative; + cursor: pointer; +} +.builder-tabs > .tabs > ul.tabs > li > div.tab-container { + position: relative; + color: #bdc3c7!important; +} +.builder-tabs > .tabs > ul.tabs > li > div.tab-container > div { + -webkit-transition: padding 0.1s; + transition: padding 0.1s; + position: relative; +} +.builder-tabs > .tabs > ul.tabs > li:hover > div { + color: #95a5a6!important; +} +.builder-tabs > .tabs > ul.tabs > li .tab-control { + display: none; +} +.builder-tabs > .tabs > ul.tabs > li .tab-control.close-btn { + font-size: 15px; + top: 7px; + right: 18px; + line-height: 15px; + height: 15px; + width: 15px; + text-align: center; + cursor: pointer; + color: #95a5a6; +} +.builder-tabs > .tabs > ul.tabs > li .tab-control.close-btn:hover { + color: #3498db !important; +} +.builder-tabs > .tabs > ul.tabs > li .tab-control.inspector-trigger { + right: 34px; + top: 10px; +} +.builder-tabs > .tabs > ul.tabs > li.active > div.tab-container { + color: #95a5a6!important; +} +.builder-tabs > .tabs > ul.tabs > li.active .tab-control { + display: block; +} +.builder-tabs > .tabs > ul.panels { + padding: 0; + list-style: none; +} +.builder-tabs > .tabs > ul.panels > li { + display: none; +} +.builder-tabs > .tabs > ul.panels > li.active { + display: block; +} +.builder-tabs.primary > .tabs > ul.tabs { + padding: 0 20px 0 40px; + height: 31px; +} +.builder-tabs.primary > .tabs > ul.tabs:after { + position: absolute; + content: ''; + display: block; + height: 2px; + left: 0; + bottom: 0; + width: 100%; + background: #bdc3c7; + z-index: 106; +} +.builder-tabs.primary > .tabs > ul.tabs > li { + bottom: -3px; + margin-left: -20px; + z-index: 105; +} +.builder-tabs.primary > .tabs > ul.tabs > li > div.tab-container { + padding: 0 21px 0 21px; + height: 27px; +} +.builder-tabs.primary > .tabs > ul.tabs > li > div.tab-container > div { + padding: 5px 5px 0 5px; + border-top: 2px solid #e5e5e5; +} +.builder-tabs.primary > .tabs > ul.tabs > li > div.tab-container > div > span { + position: relative; + top: -2px; + -webkit-transition: top 0.1s; + transition: top 0.1s; +} +.builder-tabs.primary > .tabs > ul.tabs > li > div.tab-container:before, +.builder-tabs.primary > .tabs > ul.tabs > li > div.tab-container:after { + content: ''; + display: block; + position: absolute; + top: 0; + height: 27px; + width: 21px; + background: transparent url(../images/tab.png) no-repeat; +} +.builder-tabs.primary > .tabs > ul.tabs > li > div.tab-container:before { + left: 0; + background-position: 0 -27px; +} +.builder-tabs.primary > .tabs > ul.tabs > li > div.tab-container:after { + right: 0; + background-position: -75px -27px; +} +.builder-tabs.primary > .tabs > ul.tabs > li.active { + z-index: 107; +} +.builder-tabs.primary > .tabs > ul.tabs > li.active > div.tab-container:before { + background-position: 0 0; +} +.builder-tabs.primary > .tabs > ul.tabs > li.active > div.tab-container:after { + background-position: -75px 0; +} +.builder-tabs.primary > .tabs > ul.tabs > li.active > div.tab-container > div { + padding-right: 30px; + border-top: 2px solid #bdc3c7; +} +.builder-tabs.primary > .tabs > ul.tabs > li.active > div.tab-container > div > span { + top: 0; +} +.builder-tabs.primary > .tabs > ul.tabs > li.active:before { + position: absolute; + content: ''; + display: block; + height: 3px; + left: 0; + bottom: 0; + width: 100%; + background: white; +} +.builder-tabs.primary > .tabs > ul.tabs > li.new-tab { + background: transparent url(../images/tab.png) no-repeat; + background-position: -24px 0; + width: 27px; + height: 22px; + margin-left: -11px; + top: 4px; + position: relative; + cursor: pointer; +} +.builder-tabs.primary > .tabs > ul.tabs > li.new-tab:hover { + background-position: -24px -32px; +} +.builder-tabs.secondary > .tabs ul.tabs { + margin-left: 12px; + padding-left: 0; +} +.builder-tabs.secondary > .tabs ul.tabs > li { + border-right: 1px solid #bdc3c7; + padding-right: 1px; +} +.builder-tabs.secondary > .tabs ul.tabs > li > div.tab-container > div { + padding: 4px 10px; +} +.builder-tabs.secondary > .tabs ul.tabs > li > div.tab-container > div span { + font-size: 14px; +} +.builder-tabs.secondary > .tabs ul.tabs > li .tab-control { + right: 23px; + top: 7px; +} +.builder-tabs.secondary > .tabs ul.tabs > li .tab-control.close-btn { + right: 6px; + top: 5px; +} +.builder-tabs.secondary > .tabs ul.tabs > li.new-tab { + background: transparent; + border: 2px solid #e4e4e4; + width: 27px; + height: 22px; + left: 9px; + top: 7px; + position: relative; + cursor: pointer; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.builder-tabs.secondary > .tabs ul.tabs > li.new-tab:hover { + background-color: #2581b8; + border-color: #2581b8; +} +.builder-tabs.secondary > .tabs ul.tabs > li.active { + padding-right: 10px; +} +.builder-tabs.secondary > .tabs ul.tabs > li.active > div.tab-container > div { + color: #555555; + padding-right: 30px; +} +.builder-menu-editor { + background: white; +} +.builder-menu-editor .builder-menu-editor-workspace { + padding: 30px; +} +.builder-menu-editor ul.builder-menu { + font-size: 0; + padding: 0; + cursor: pointer; +} +.builder-menu-editor ul.builder-menu > li { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.builder-menu-editor ul.builder-menu > li div.item-container:hover, +.builder-menu-editor ul.builder-menu > li.inspector-open > div.item-container { + background: #2581b8 !important; + color: white!important; +} +.builder-menu-editor ul.builder-menu > li div.item-container:hover a, +.builder-menu-editor ul.builder-menu > li.inspector-open > div.item-container a { + color: white!important; +} +.builder-menu-editor ul.builder-menu > li div.item-container { + position: relative; +} +.builder-menu-editor ul.builder-menu > li div.item-container .close-btn { + color: white; + position: absolute; + display: none; + width: 15px; + height: 15px; + right: 5px; + top: 5px; + font-size: 14px; + text-align: center; + line-height: 14px; +} +.builder-menu-editor ul.builder-menu > li div.item-container:hover .close-btn { + display: block; + text-decoration: none; + opacity: 0.5; + filter: alpha(opacity=50); +} +.builder-menu-editor ul.builder-menu > li div.item-container:hover .close-btn:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.builder-menu-editor ul.builder-menu > li.add { + font-size: 16px; + text-align: center; + border: 2px dotted #dde0e2; +} +.builder-menu-editor ul.builder-menu > li.add a { + text-decoration: none; + color: #bdc3c7; +} +.builder-menu-editor ul.builder-menu > li.add span.title { + font-size: 14px; +} +.builder-menu-editor ul.builder-menu > li.add:hover { + border: 2px dotted #2581b8; + background: #2581b8 !important; +} +.builder-menu-editor ul.builder-menu > li.add:hover a { + color: white; +} +.builder-menu-editor ul.builder-menu > li.list-sortable-placeholder { + border: 2px dotted #2581b8; + height: 10px; + background: transparent; +} +.builder-menu-editor ul.builder-menu.builder-main-menu > li { + display: inline-block; + vertical-align: top; +} +.builder-menu-editor ul.builder-menu.builder-main-menu > li.item { + margin: 0 20px 20px 0; +} +.builder-menu-editor ul.builder-menu.builder-main-menu > li > div.item-container { + background: #ecf0f1; + color: #708080; + padding: 20px 25px; + height: 64px; + white-space: nowrap; +} +.builder-menu-editor ul.builder-menu.builder-main-menu > li > div.item-container i { + font-size: 24px; + margin-right: 10px; +} +.builder-menu-editor ul.builder-menu.builder-main-menu > li > div.item-container span.title { + font-size: 14px; + line-height: 100%; + position: relative; + top: -3px; +} +.builder-menu-editor ul.builder-menu.builder-main-menu > li.add { + height: 64px; +} +.builder-menu-editor ul.builder-menu.builder-main-menu > li.add a { + padding: 20px 15px; + height: 60px; + display: block; +} +.builder-menu-editor ul.builder-menu.builder-main-menu > li.add a i { + margin-right: 5px; +} +.builder-menu-editor ul.builder-menu.builder-main-menu > li.add a span { + position: relative; + top: -1px; +} +.builder-menu-editor ul.builder-menu.builder-submenu { + margin-top: 1px; +} +.builder-menu-editor ul.builder-menu.builder-submenu > li { + display: block; + width: 120px; +} +.builder-menu-editor ul.builder-menu.builder-submenu > li i { + display: block; + margin-bottom: 7px; +} +.builder-menu-editor ul.builder-menu.builder-submenu > li span.title { + display: block; + font-size: 12px; +} +.builder-menu-editor ul.builder-menu.builder-submenu > li.item { + margin: 0 0 1px 0; +} +.builder-menu-editor ul.builder-menu.builder-submenu > li > div.item-container { + background: #f3f5f5; + color: #94a5a6; + padding: 18px 13px; + text-align: center; +} +.builder-menu-editor ul.builder-menu.builder-submenu > li > div.item-container i { + font-size: 24px; +} +.builder-menu-editor ul.builder-menu.builder-submenu > li.add { + margin-top: 20px; +} +.builder-menu-editor ul.builder-menu.builder-submenu > li.add a { + padding: 10px 20px; + display: block; +} +.localization-input-container input[type=text].string-editor { + padding-right: 20px!important; +} +.localization-input-container .localization-trigger { + position: absolute; + display: none; + width: 10px; + height: 10px; + font-size: 14px; + color: #95a5a6; + outline: none; +} +.localization-input-container .localization-trigger:hover, +.localization-input-container .localization-trigger:active, +.localization-input-container .localization-trigger:focus { + color: #2581b8; + text-decoration: none; +} +table.inspector-fields td.active .localization-input-container .localization-trigger, +table.data td.active .localization-input-container .localization-trigger { + display: block; +} +table.data td.active .localization-input-container .localization-trigger { + top: 5px!important; + right: 7px!important; +} +.control-table td[data-column-type=builderLocalization] input[type=text] { + padding-right: 20px!important; +} +.control-table td[data-column-type=builderLocalization] input[type=text] { + width: 100%; + height: 100%; + display: block; + outline: none; + border: none; + padding: 6px 10px 6px; +} +html.chrome .control-table td[data-column-type=builderLocalization] input[type=text] { + padding: 6px 10px 7px!important; +} +html.safari .control-table td[data-column-type=builderLocalization] input[type=text], +html.gecko .control-table td[data-column-type=builderLocalization] input[type=text] { + padding: 5px 10px 5px; +} +.autocomplete.dropdown-menu.table-widget-autocomplete.localization li a { + white-space: normal; + word-wrap: break-word; +} +table.data td[data-column-type=builderLocalization] .loading-indicator-container.size-small .loading-indicator { + padding-bottom: 0!important; +} +table.data td[data-column-type=builderLocalization] .loading-indicator-container.size-small .loading-indicator span { + left: auto; + right: 6px; +} +.control-filelist ul li.group.model > h4 a:after { + content: "\f074"; + top: 10px; +} +.control-filelist ul li.group.form > h4 a:after { + content: "\f14a"; +} +.control-filelist ul li.group.list > h4 a:after { + content: "\f00b"; + top: 10px; +} +.control-filelist ul li.group > ul > li.group > ul > li > a { + padding-left: 73px; + margin-left: -20px; +} +.control-filelist ul li.with-icon span.title, +.control-filelist ul li.with-icon span.description { + padding-left: 22px; +} +.control-filelist ul li.with-icon i.list-icon { + position: absolute; + left: 20px; + top: 12px; + color: #405261; +} +.control-filelist ul li.with-icon i.list-icon.mute { + color: #8f8f8f; +} +.control-filelist ul li.with-icon i.list-icon.icon-check-square { + color: #8da85e; +} +html.gecko .control-filelist ul li.group { + margin-right: 10px; +} +.builder-inspector-container { + width: 350px; + border-left: 1px solid #d9d9d9; +} +.builder-inspector-container:empty { + display: none!important; +} +form.hide-secondary-tabs div.control-tabs.secondary-tabs ul.nav.nav-tabs { + display: none; +} +.form-group.size-quarter { + width: 23.5%; +} +.form-group.size-three-quarter { + width: 73.5%; +} +form[data-entity=database] div.field-datatable, +form[data-entity=models] div.field-datatable { + position: absolute; + width: 100%; + height: 100%; +} +form[data-entity=database] div.field-datatable div[data-control=table], +form[data-entity=models] div.field-datatable div[data-control=table] { + position: absolute; + width: 100%; + height: 100%; +} +form[data-entity=database] div.field-datatable div[data-control=table] div.table-container, +form[data-entity=models] div.field-datatable div[data-control=table] div.table-container { + position: absolute; + width: 100%; + height: 100%; +} +form[data-entity=database] div.field-datatable div[data-control=table] div.table-container div.control-scrollbar, +form[data-entity=models] div.field-datatable div[data-control=table] div.table-container div.control-scrollbar { + top: 70px; + bottom: 0; + position: absolute; + max-height: none!important; + height: auto!important; +} +.control-tabs.auxiliary-tabs { + background: white; +} +.control-tabs.auxiliary-tabs > ul.nav-tabs, +.control-tabs.auxiliary-tabs > div > ul.nav-tabs { + padding-left: 20px; + padding-bottom: 2px; + background: white; + position: relative; +} +.control-tabs.auxiliary-tabs > ul.nav-tabs:before, +.control-tabs.auxiliary-tabs > div > ul.nav-tabs:before { + content: ' '; + display: block; + position: absolute; + width: 100%; + height: 1px; + background: #95a5a6; + top: 0; + left: 0; +} +.control-tabs.auxiliary-tabs > ul.nav-tabs > li, +.control-tabs.auxiliary-tabs > div > ul.nav-tabs > li { + margin-right: 2px; +} +.control-tabs.auxiliary-tabs > ul.nav-tabs > li > a, +.control-tabs.auxiliary-tabs > div > ul.nav-tabs > li > a { + background: white; + color: #bdc3c7; + border-left: 1px solid #ecf0f1!important; + border-right: 1px solid #ecf0f1!important; + border-bottom: 1px solid #ecf0f1!important; + padding: 4px 10px; + line-height: 100%; + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.control-tabs.auxiliary-tabs > ul.nav-tabs > li > a > span.title > span, +.control-tabs.auxiliary-tabs > div > ul.nav-tabs > li > a > span.title > span { + margin-bottom: 0; + font-size: 13px; + height: auto; +} +.control-tabs.auxiliary-tabs > ul.nav-tabs > li.active, +.control-tabs.auxiliary-tabs > div > ul.nav-tabs > li.active { + top: 0; +} +.control-tabs.auxiliary-tabs > ul.nav-tabs > li.active:before, +.control-tabs.auxiliary-tabs > div > ul.nav-tabs > li.active:before { + content: ' '; + display: block; + position: absolute; + width: 100%; + height: 1px; + background: white; + top: 0; + left: 0; + top: -1px; +} +.control-tabs.auxiliary-tabs > ul.nav-tabs > li.active a, +.control-tabs.auxiliary-tabs > div > ul.nav-tabs > li.active a { + padding-top: 5px; + border-left: 1px solid #95a5a6!important; + border-right: 1px solid #95a5a6!important; + border-bottom: 1px solid #95a5a6!important; + color: #95a5a6; +} +.control-tabs.auxiliary-tabs > div.tab-content > .tab-pane { + background: white; +} diff --git a/plugins/rainlab/builder/assets/images/loader-transparent.svg b/plugins/rainlab/builder/assets/images/loader-transparent.svg deleted file mode 100644 index cf84589..0000000 --- a/plugins/rainlab/builder/assets/images/loader-transparent.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - -]> - - - - - - - - diff --git a/plugins/rainlab/builder/assets/images/tab-dark.png b/plugins/rainlab/builder/assets/images/tab-dark.png deleted file mode 100644 index 0862f05140c2ad04ce26a0812fdb8d59b0b699a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5001 zcmV;46L##0P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000QINklq@Zvg)Reg~Y{9N74Q-7!6LJ$$0&({p|~ zIuP>!M}Z?iU4J-)2e^9W%G9`uEad>7&3Rr0wzLJ>Rqi2L*R3lSfrEz*0~CPo1IPD% zWlwR=U(xly&-!eU%{jdR^!0~BXvriW-MWRY>vwXj?_d_ImG`Zf*Amen0RbodzXFz^klV|uNAF**=?9_V{L9OBlE z8+V(Nwg|M5Jn2Ic|#s!GS{MiFtpyP-0>2TlIq z=3kGal6+o0vLutI+ZeSU#N)y(ScYUu)9AT zs@C_H6LwvGi zMF36HFbV~LM+H}o3-AKKg<+0}eZ{kiEOod+0A1I~WiuwXui6qIIuLsZ*w-HpF*Y_RKyQ}h`2rN7AqJV9W$+9pWtv-%y%Mo5NOKlI>}_x@rkwt+B1qQ zJx%G1wH5d+fFes)hHG()0Lf&MM^~%>Xc8PAt=a+x<)O!c1O4F;V-=>IEsCH5Uj$B4 zI=-~@qXQ1$B8*L^sSgM)E4P3_d1x`EY6O2Sld+t7sB&5PUGaBcAdyJW)YJsv2hI)3 zLz^}SHs{JazH}s;cq;)}X4YnI(M^I4`)J*#ZXTp$1?prGxKvUayy7 zRdsab^KpZ&>kO+ZUauF!Fm?c!2j!uoz&o1*8#MsWpgfeIbjmcP&L{j!*zkqVds;rV z<^hWi;QBxR#`~B5QcR`qsHjN;IWMKU7C)eQJf8O!`+R+CSGP1jpv_sVUER{W*yro> zcs%b>s`B##58JAYGoi@R9i@qFfp+ixNTMQ3ca$cIeaO6+t1`}(03sDURhrn@)lJbb z7#kn=+>Zi0vV3{bys0$@`jo6NX_hIXQ`@X>@jV1M~?l7ES;~mKuRb zXID3=RElgi`>_kE*=&|nDrJfg5u8*Ft1hTinph~zdqCq0MjYu6(9ia0ZWAGuN>N{5 z57VWI->JC;D6-T9^mcZ2Gci%o`S2SS$p?5sywsn4!N@8%TEfJ{glPr6f}5JVpdhd` zpVuqhC0}>oJzIfGzF=gD+XT>coqS%0g)B`ht$Hf%li2UjySk!3U?!x~8Pf`CTbd{i z(AN|VqvF7;pY1XG1DwEqUof)TZ31MoS&F3<;2K4iYG0a|t3E+z_6OL7tNH`VQN~Ga zN)r`Xssna+c6F1 zU0u~5P#%m63sIVw%jK-j(d-X!0UT+J82f{Q*v(*KGon?Fr1% z#91+``Kqe=IB=!2tJ|+>TD1XqUbo;2Mt@PQ1+i0K0Hie?a+aNW=m^a87VKzW}PLPL(F^>U^fsLl-Nt zpu9i8E}r!TBOPuNVPax}U7gQ>C`}aH&Mbhcstu~Db_17z9UhN|WKyg3LA%)>-~>*) zO#s6%NG3Hr9uJf{LNBYT+O4YU)c?xxsH&RauF}Lsix$z`+`J&myS2yPS;cgJfGwlC zc694vT#B1FZx-|U{2hxWW-3kedcA#(jg1Rgns{IK2i%Ru#>Qr^*ZV)EiT@n{{q4uq TLrUy*00000NkvXXu0mjf`P*Hb diff --git a/plugins/rainlab/builder/assets/js/build-min.js b/plugins/rainlab/builder/assets/js/build-min.js index 849ef07..0d53b40 100644 --- a/plugins/rainlab/builder/assets/js/build-min.js +++ b/plugins/rainlab/builder/assets/js/build-min.js @@ -1 +1,834 @@ -!function($){"use strict";void 0===$.oc.builder&&($.oc.builder={});var Base=$.oc.foundation.base,DataRegistry=(Base.prototype,function(){this.data={},this.requestCache={},this.callbackCache={},Base.call(this)});DataRegistry.prototype.set=function(plugin,type,subtype,data,params){this.storeData(plugin,type,subtype,data),"localization"!=type||subtype||this.localizationUpdated(plugin,params)},DataRegistry.prototype.get=function($formElement,plugin,type,subtype,callback){if(void 0===this.data[plugin]||void 0===this.data[plugin][type]||void 0===this.data[plugin][type][subtype]||this.isCacheObsolete(this.data[plugin][type][subtype].timestamp))return this.loadDataFromServer($formElement,plugin,type,subtype,callback);callback(this.data[plugin][type][subtype].data)},DataRegistry.prototype.makeCacheKey=function(plugin,type,subtype){var key=plugin+"-"+type;return subtype&&(key+="-"+subtype),key},DataRegistry.prototype.isCacheObsolete=function(timestamp){return Date.now()-timestamp>3e5},DataRegistry.prototype.loadDataFromServer=function($formElement,plugin,type,subtype,callback){var self=this,cacheKey=this.makeCacheKey(plugin,type,subtype);return void 0===this.requestCache[cacheKey]&&(this.requestCache[cacheKey]=$formElement.request("onPluginDataRegistryGetData",{data:{registry_plugin_code:plugin,registry_data_type:type,registry_data_subtype:subtype}}).done((function(data){if(void 0===data.registryData)throw new Error("Invalid data registry response.");self.storeData(plugin,type,subtype,data.registryData),self.applyCallbacks(cacheKey,data.registryData),self.requestCache[cacheKey]=void 0}))),this.addCallbackToQueue(callback,cacheKey),this.requestCache[cacheKey]},DataRegistry.prototype.addCallbackToQueue=function(callback,key){void 0===this.callbackCache[key]&&(this.callbackCache[key]=[]),this.callbackCache[key].push(callback)},DataRegistry.prototype.applyCallbacks=function(key,registryData){if(void 0!==this.callbackCache[key]){for(var i=this.callbackCache[key].length-1;i>=0;i--)this.callbackCache[key][i](registryData);delete this.callbackCache[key]}},DataRegistry.prototype.storeData=function(plugin,type,subtype,data){void 0===this.data[plugin]&&(this.data[plugin]={}),void 0===this.data[plugin][type]&&(this.data[plugin][type]={});var dataItem={timestamp:Date.now(),data:data};this.data[plugin][type][subtype]=dataItem},DataRegistry.prototype.clearCache=function(plugin,type){void 0!==this.data[plugin]&&void 0!==this.data[plugin][type]&&(this.data[plugin][type]=void 0)},DataRegistry.prototype.getLocalizationString=function($formElement,plugin,key,callback){this.get($formElement,plugin,"localization",null,(function(data){void 0===data[key]?callback(key):callback(data[key])}))},DataRegistry.prototype.localizationUpdated=function(plugin,params){$.oc.builder.localizationInput.updatePluginInputs(plugin),void 0!==params&¶ms.suppressLanguageEditorUpdate||$.oc.builder.indexController.entityControllers.localization.languageUpdated(plugin),$.oc.builder.indexController.entityControllers.localization.updateOnScreenStrings(plugin)},$.oc.builder.dataRegistry=new DataRegistry}(window.jQuery),function($){"use strict";void 0===$.oc.builder&&($.oc.builder={}),void 0===$.oc.builder.entityControllers&&($.oc.builder.entityControllers={});var Base=$.oc.foundation.base,BaseProto=Base.prototype,EntityBase=function(typeName,indexController){if(void 0===typeName)throw new Error("The Builder entity type name should be set in the base constructor call.");if(void 0===indexController)throw new Error("The Builder index controller should be set when creating an entity controller.");this.typeName=typeName,this.indexController=indexController,Base.call(this)};(EntityBase.prototype=Object.create(BaseProto)).constructor=EntityBase,EntityBase.prototype.registerHandlers=function(){},EntityBase.prototype.invokeCommand=function(command,ev){if(!/^cmd[a-zA-Z0-9]+$/.test(command))throw new Error("Invalid command: "+command);if(void 0===this[command])throw new Error("Unknown command: "+command);this[command].apply(this,[ev])},EntityBase.prototype.newTabId=function(){return this.typeName+Math.random()},EntityBase.prototype.makeTabId=function(objectName){return this.typeName+"-"+objectName},EntityBase.prototype.getMasterTabsActivePane=function(){return this.indexController.getMasterTabActivePane()},EntityBase.prototype.getMasterTabsObject=function(){return this.indexController.masterTabsObj},EntityBase.prototype.getSelectedPlugin=function(){return $("#PluginList-pluginList-plugin-list > ul > li.active").data("id")},EntityBase.prototype.getIndexController=function(){return this.indexController},EntityBase.prototype.updateMasterTabIdAndTitle=function($tabPane,responseData){var tabsObject=this.getMasterTabsObject();tabsObject.updateIdentifier($tabPane,responseData.tabId),tabsObject.updateTitle($tabPane,responseData.tabTitle)},EntityBase.prototype.unhideFormDeleteButton=function($tabPane){$("[data-control=delete-button]",$tabPane).removeClass("hide oc-hide")},EntityBase.prototype.forceCloseTab=function($tabPane){$tabPane.trigger("close.oc.tab",[{force:!0}])},EntityBase.prototype.unmodifyTab=function($tabPane){this.indexController.unchangeTab($tabPane)},$.oc.builder.entityControllers.base=EntityBase}(window.jQuery),function($){"use strict";void 0===$.oc.builder&&($.oc.builder={}),void 0===$.oc.builder.entityControllers&&($.oc.builder.entityControllers={});var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype,Plugin=function(indexController){Base.call(this,"plugin",indexController),this.popupZIndex=5050};(Plugin.prototype=Object.create(BaseProto)).constructor=Plugin,Plugin.prototype.cmdMakePluginActive=function(ev){var selectedPluginCode=$(ev.currentTarget).data("pluginCode");this.makePluginActive(selectedPluginCode)},Plugin.prototype.cmdCreatePlugin=function(ev){var $target=$(ev.currentTarget);$target.one("shown.oc.popup",this.proxy(this.onPluginPopupShown)),$target.popup({handler:"onPluginLoadPopup",zIndex:this.popupZIndex})},Plugin.prototype.cmdApplyPluginSettings=function(ev){var $form=$(ev.currentTarget),self=this;$.oc.stripeLoadIndicator.show(),$form.request("onPluginSave").always($.oc.builder.indexController.hideStripeIndicatorProxy).done((function(data){$form.trigger("close.oc.popup"),self.applyPluginSettingsDone(data)}))},Plugin.prototype.cmdEditPluginSettings=function(ev){var $target=$(ev.currentTarget);$target.one("shown.oc.popup",this.proxy(this.onPluginPopupShown)),$target.popup({handler:"onPluginLoadPopup",zIndex:this.popupZIndex,extraData:{pluginCode:$target.data("pluginCode")}})},Plugin.prototype.onPluginPopupShown=function(ev,button,popup){$(popup).find("input[name=name]").focus()},Plugin.prototype.applyPluginSettingsDone=function(data){void 0!==data.responseData&&void 0!==data.responseData.isNewPlugin&&this.makePluginActive(data.responseData.pluginCode,!0)},Plugin.prototype.makePluginActive=function(pluginCode,updatePluginList){var $form=$("#builder-plugin-selector-panel form").first();$.oc.stripeLoadIndicator.show(),$form.request("onPluginSetActive",{data:{pluginCode:pluginCode,updatePluginList:updatePluginList?1:0}}).always($.oc.builder.indexController.hideStripeIndicatorProxy).done(this.proxy(this.makePluginActiveDone))},Plugin.prototype.makePluginActiveDone=function(data){var pluginCode=data.responseData.pluginCode;$("#builder-plugin-selector-panel [data-control=filelist]").fileList("markActive",pluginCode)},$.oc.builder.entityControllers.plugin=Plugin}(window.jQuery),function($){"use strict";void 0===$.oc.builder&&($.oc.builder={}),void 0===$.oc.builder.entityControllers&&($.oc.builder.entityControllers={});var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype,DatabaseTable=function(indexController){Base.call(this,"databaseTable",indexController)};(DatabaseTable.prototype=Object.create(BaseProto)).constructor=DatabaseTable,DatabaseTable.prototype.cmdCreateTable=function(ev){var result=this.indexController.openOrLoadMasterTab($(ev.target),"onDatabaseTableCreateOrOpen",this.newTabId());!1!==result&&result.done(this.proxy(this.onTableLoaded,this))},DatabaseTable.prototype.cmdOpenTable=function(ev){var table=$(ev.currentTarget).data("id"),result=this.indexController.openOrLoadMasterTab($(ev.target),"onDatabaseTableCreateOrOpen",this.makeTabId(table),{table_name:table});!1!==result&&result.done(this.proxy(this.onTableLoaded,this))},DatabaseTable.prototype.cmdSaveTable=function(ev){var $target=$(ev.currentTarget);if(this.validateTable($target)){var data={columns:this.getTableData($target)};$target.popup({extraData:data,handler:"onDatabaseTableValidateAndShowPopup"})}},DatabaseTable.prototype.cmdSaveMigration=function(ev){var $target=$(ev.currentTarget);$.oc.stripeLoadIndicator.show(),$target.request("onDatabaseTableMigrationApply").always($.oc.builder.indexController.hideStripeIndicatorProxy).done(this.proxy(this.saveMigrationDone))},DatabaseTable.prototype.cmdDeleteTable=function(ev){var $target=$(ev.currentTarget);$.oc.confirm($target.data("confirm"),this.proxy(this.deleteConfirmed))},DatabaseTable.prototype.cmdUnModifyForm=function(){var $masterTabPane=this.getMasterTabsActivePane();this.unmodifyTab($masterTabPane)},DatabaseTable.prototype.cmdAddIdColumn=function(ev){var $target=$(ev.currentTarget);this.addIdColumn($target)||alert($target.closest("form").attr("data-lang-id-exists"))},DatabaseTable.prototype.cmdAddTimestamps=function(ev){var $target=$(ev.currentTarget);this.addTimeStampColumns($target,["created_at","updated_at"])||alert($target.closest("form").attr("data-lang-timestamps-exist"))},DatabaseTable.prototype.cmdAddSoftDelete=function(ev){var $target=$(ev.currentTarget);this.addTimeStampColumns($target,["deleted_at"])||alert($target.closest("form").attr("data-lang-soft-deleting-exist"))},DatabaseTable.prototype.onTableCellChanged=function(ev,column,value,rowIndex){var $target=$(ev.target);if("columns"==$target.data("alias")&&"database"==$target.closest("form").data("entity")){var updatedRow={};"auto_increment"==column&&value&&(updatedRow.unsigned=1,updatedRow.primary_key=1),"unsigned"!=column||value||(updatedRow.auto_increment=0),"primary_key"==column&&value&&(updatedRow.allow_null=0),"allow_null"==column&&value&&(updatedRow.primary_key=0),"primary_key"!=column||value||(updatedRow.auto_increment=0),$target.table("setRowValues",rowIndex,updatedRow)}},DatabaseTable.prototype.onTableLoaded=function(){$(document).trigger("render");var $masterTabPane=this.getMasterTabsActivePane(),$form=$masterTabPane.find("form"),$toolbar=$masterTabPane.find("div[data-control=table] div.toolbar"),$addIdButton=$(''),$addTimestampsButton=$(''),$addSoftDeleteButton=$('');$addIdButton.text($form.attr("data-lang-add-id")),$toolbar.append($addIdButton),$addTimestampsButton.text($form.attr("data-lang-add-timestamps")),$toolbar.append($addTimestampsButton),$addSoftDeleteButton.text($form.attr("data-lang-add-soft-delete")),$toolbar.append($addSoftDeleteButton)},DatabaseTable.prototype.registerHandlers=function(){this.indexController.$masterTabs.on("oc.tableCellChanged",this.proxy(this.onTableCellChanged))},DatabaseTable.prototype.validateTable=function($target){var tableObj=this.getTableControlObject($target);return tableObj.unfocusTable(),tableObj.validate()},DatabaseTable.prototype.getTableData=function($target){return this.getTableControlObject($target).dataSource.getAllData()},DatabaseTable.prototype.getTableControlObject=function($target){var tableObj=$target.closest("form").find("[data-control=table]").data("oc.table");if(!tableObj)throw new Error("Table object is not found on the database table tab");return tableObj},DatabaseTable.prototype.saveMigrationDone=function(data){if(void 0===data.builderResponseData)throw new Error("Invalid response data");$("#builderTableMigrationPopup").trigger("close.oc.popup");var $masterTabPane=this.getMasterTabsActivePane();this.getMasterTabsObject();"delete"!=data.builderResponseData.operation?($masterTabPane.find("input[name=table_name]").val(data.builderResponseData.builderObjectName),this.updateMasterTabIdAndTitle($masterTabPane,data.builderResponseData),this.unhideFormDeleteButton($masterTabPane),this.getTableList().fileList("markActive",data.builderResponseData.tabId),this.getIndexController().unchangeTab($masterTabPane),this.updateTable(data.builderResponseData)):this.forceCloseTab($masterTabPane),$.oc.builder.dataRegistry.clearCache(data.builderResponseData.pluginCode,"model-columns")},DatabaseTable.prototype.getTableList=function(){return $("#layout-side-panel form[data-content-id=database] [data-control=filelist]")},DatabaseTable.prototype.deleteConfirmed=function(){this.getMasterTabsActivePane().find("form").popup({handler:"onDatabaseTableShowDeletePopup"})},DatabaseTable.prototype.getColumnNames=function($target){this.getTableControlObject($target).unfocusTable();var data=this.getTableData($target),result=[];for(var index in data)void 0!==data[index].name&&result.push($.trim(data[index].name));return result},DatabaseTable.prototype.addIdColumn=function($target){var added=!1;if(-1===this.getColumnNames($target).indexOf("id")){var tableObj=this.getTableControlObject($target),currentData=this.getTableData($target);(currentData.length-1||currentData[0].name||currentData[0].type||currentData[0].length||currentData[0].unsigned||currentData[0].nullable||currentData[0].auto_increment||currentData[0].primary_key||currentData[0].default)&&tableObj.addRecord("bottom",!0),tableObj.setRowValues(currentData.length-1,{name:"id",type:"integer",unsigned:!0,auto_increment:!0,primary_key:!0}),tableObj.addRecord("bottom",!1),tableObj.deleteRecord(),added=!0}return added&&$target.trigger("change"),added},DatabaseTable.prototype.addTimeStampColumns=function($target,columns){var existingColumns=this.getColumnNames($target),added=!1;for(var index in columns){var column=columns[index];-1===existingColumns.indexOf(column)&&(this.addTimeStampColumn($target,column),added=!0)}return added&&$target.trigger("change"),added},DatabaseTable.prototype.addTimeStampColumn=function($target,column){var tableObj=this.getTableControlObject($target),currentData=this.getTableData($target),rowData={name:column,type:"timestamp",default:null,allow_null:!0};tableObj.addRecord("bottom",!0),tableObj.setRowValues(currentData.length-1,rowData),tableObj.addRecord("bottom",!1),tableObj.deleteRecord()},DatabaseTable.prototype.updateTable=function(data){var tabsObject=this.getMasterTabsObject(),tab=$("#builder-master-tabs").data("oc.tab").findByIdentifier(data.tabId);tabsObject.updateTab(tab,data.tableName,data.tab),this.onTableLoaded()},$.oc.builder.entityControllers.databaseTable=DatabaseTable}(window.jQuery),function($){"use strict";void 0===$.oc.builder&&($.oc.builder={}),void 0===$.oc.builder.entityControllers&&($.oc.builder.entityControllers={});var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype,Model=function(indexController){Base.call(this,"model",indexController)};(Model.prototype=Object.create(BaseProto)).constructor=Model,Model.prototype.cmdCreateModel=function(ev){var $target=$(ev.currentTarget);$target.one("shown.oc.popup",this.proxy(this.onModelPopupShown)),$target.popup({handler:"onModelLoadPopup"})},Model.prototype.cmdApplyModelSettings=function(ev){var $form=$(ev.currentTarget),self=this;$.oc.stripeLoadIndicator.show(),$form.request("onModelSave").always($.oc.builder.indexController.hideStripeIndicatorProxy).done((function(data){$form.trigger("close.oc.popup"),self.applyModelSettingsDone(data)}))},Model.prototype.onModelPopupShown=function(ev,button,popup){$(popup).find("input[name=className]").focus()},Model.prototype.applyModelSettingsDone=function(data){if(void 0!==data.builderResponseData.registryData){var registryData=data.builderResponseData.registryData;$.oc.builder.dataRegistry.set(registryData.pluginCode,"model-classes",null,registryData.models)}},$.oc.builder.entityControllers.model=Model}(window.jQuery),function($){"use strict";void 0===$.oc.builder&&($.oc.builder={}),void 0===$.oc.builder.entityControllers&&($.oc.builder.entityControllers={});var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype,ModelForm=function(indexController){Base.call(this,"modelForm",indexController)};(ModelForm.prototype=Object.create(BaseProto)).constructor=ModelForm,ModelForm.prototype.cmdCreateForm=function(ev){var $link=$(ev.currentTarget),data={model_class:$link.data("modelClass")};this.indexController.openOrLoadMasterTab($link,"onModelFormCreateOrOpen",this.newTabId(),data)},ModelForm.prototype.cmdSaveForm=function(ev){var $target=$(ev.currentTarget),$form=$target.closest("form"),$rootContainer=$("[data-root-control-wrapper] > [data-control-container]",$form),$inspectorContainer=$form.find(".inspector-container"),controls=$.oc.builder.formbuilder.domToPropertyJson.convert($rootContainer.get(0));if($.oc.inspector.manager.applyValuesFromContainer($inspectorContainer))if(!1!==controls){var data={controls:controls};$target.request("onModelFormSave",{data:data}).done(this.proxy(this.saveFormDone))}else $.oc.flashMsg({text:$.oc.builder.formbuilder.domToPropertyJson.getLastError(),class:"error",interval:5})},ModelForm.prototype.cmdAddDatabaseFields=function(ev){var $target=$(ev.currentTarget),$placeholder=this.getMasterTabsActivePane().find(".builder-control-list .control.oc-placeholder:first")[0],fields=$target.find(".control-table").data("oc.table").dataSource.data.filter((function(column){return column.add})).reverse();$target.closest(".control-popup").data("oc.popup").hide(),$.oc.stripeLoadIndicator.show();var allFields=$.when({});$.each(fields,(function(index,field){allFields=allFields.then(function(field){return function(){var defer=$.Deferred();return $.oc.builder.formbuilder.controller.addControlToPlaceholder($placeholder,field.type,field.label?field.label:field.column,!1,field.column).always((function(){defer.resolve()})),defer.promise()}}(field))})),$.when(allFields).always($.oc.builder.indexController.hideStripeIndicatorProxy)},ModelForm.prototype.cmdOpenForm=function(ev){var form=$(ev.currentTarget).data("form"),model=$(ev.currentTarget).data("modelClass");this.indexController.openOrLoadMasterTab($(ev.target),"onModelFormCreateOrOpen",this.makeTabId(model+"-"+form),{file_name:form,model_class:model})},ModelForm.prototype.cmdDeleteForm=function(ev){var $target=$(ev.currentTarget);$.oc.confirm($target.data("confirm"),this.proxy(this.deleteConfirmed))},ModelForm.prototype.cmdAddControl=function(ev){$.oc.builder.formbuilder.controlPalette.addControl(ev)},ModelForm.prototype.cmdUndockControlPalette=function(ev){$.oc.builder.formbuilder.controlPalette.undockFromContainer(ev)},ModelForm.prototype.cmdDockControlPalette=function(ev){$.oc.builder.formbuilder.controlPalette.dockToContainer(ev)},ModelForm.prototype.cmdCloseControlPalette=function(ev){$.oc.builder.formbuilder.controlPalette.closeInContainer(ev)},ModelForm.prototype.saveFormDone=function(data){if(void 0===data.builderResponseData)throw new Error("Invalid response data");var $masterTabPane=this.getMasterTabsActivePane();$masterTabPane.find("input[name=file_name]").val(data.builderResponseData.builderObjectName),this.updateMasterTabIdAndTitle($masterTabPane,data.builderResponseData),this.unhideFormDeleteButton($masterTabPane),this.getModelList().fileList("markActive",data.builderResponseData.tabId),this.getIndexController().unchangeTab($masterTabPane),this.updateDataRegistry(data)},ModelForm.prototype.updateDataRegistry=function(data){if(void 0!==data.builderResponseData.registryData){var registryData=data.builderResponseData.registryData;$.oc.builder.dataRegistry.set(registryData.pluginCode,"model-forms",registryData.modelClass,registryData.forms)}},ModelForm.prototype.deleteConfirmed=function(){var $form=this.getMasterTabsActivePane().find("form");$.oc.stripeLoadIndicator.show(),$form.request("onModelFormDelete").always($.oc.builder.indexController.hideStripeIndicatorProxy).done(this.proxy(this.deleteDone))},ModelForm.prototype.deleteDone=function(data){var $masterTabPane=this.getMasterTabsActivePane();this.getIndexController().unchangeTab($masterTabPane),this.forceCloseTab($masterTabPane),this.updateDataRegistry(data)},ModelForm.prototype.getModelList=function(){return $("#layout-side-panel form[data-content-id=models] [data-control=filelist]")},$.oc.builder.entityControllers.modelForm=ModelForm}(window.jQuery),function($){"use strict";void 0===$.oc.builder&&($.oc.builder={}),void 0===$.oc.builder.entityControllers&&($.oc.builder.entityControllers={});var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype,ModelList=function(indexController){this.cachedModelFieldsPromises={},Base.call(this,"modelList",indexController)};(ModelList.prototype=Object.create(BaseProto)).constructor=ModelList,ModelList.prototype.registerHandlers=function(){$(document).on("autocompleteitems.oc.table",'form[data-sub-entity="model-list"] [data-control=table]',this.proxy(this.onAutocompleteItems))},ModelList.prototype.cmdCreateList=function(ev){var $link=$(ev.currentTarget),data={model_class:$link.data("modelClass")},result=this.indexController.openOrLoadMasterTab($link,"onModelListCreateOrOpen",this.newTabId(),data);!1!==result&&result.done(this.proxy(this.onListLoaded,this))},ModelList.prototype.cmdSaveList=function(ev){var $target=$(ev.currentTarget);$target.closest("form");this.validateTable($target)&&$target.request("onModelListSave",{data:{columns:this.getTableData($target)}}).done(this.proxy(this.saveListDone))},ModelList.prototype.cmdOpenList=function(ev){var list=$(ev.currentTarget).data("list"),model=$(ev.currentTarget).data("modelClass"),result=this.indexController.openOrLoadMasterTab($(ev.target),"onModelListCreateOrOpen",this.makeTabId(model+"-"+list),{file_name:list,model_class:model});!1!==result&&result.done(this.proxy(this.onListLoaded,this))},ModelList.prototype.cmdDeleteList=function(ev){var $target=$(ev.currentTarget);$.oc.confirm($target.data("confirm"),this.proxy(this.deleteConfirmed))},ModelList.prototype.cmdAddDatabaseColumns=function(ev){var $target=$(ev.currentTarget);$.oc.stripeLoadIndicator.show(),$target.request("onModelListLoadDatabaseColumns").done(this.proxy(this.databaseColumnsLoaded)).always($.oc.builder.indexController.hideStripeIndicatorProxy)},ModelList.prototype.saveListDone=function(data){if(void 0===data.builderResponseData)throw new Error("Invalid response data");var $masterTabPane=this.getMasterTabsActivePane();$masterTabPane.find("input[name=file_name]").val(data.builderResponseData.builderObjectName),this.updateMasterTabIdAndTitle($masterTabPane,data.builderResponseData),this.unhideFormDeleteButton($masterTabPane),this.getModelList().fileList("markActive",data.builderResponseData.tabId),this.getIndexController().unchangeTab($masterTabPane),this.updateDataRegistry(data)},ModelList.prototype.deleteConfirmed=function(){var $form=this.getMasterTabsActivePane().find("form");$.oc.stripeLoadIndicator.show(),$form.request("onModelListDelete").always($.oc.builder.indexController.hideStripeIndicatorProxy).done(this.proxy(this.deleteDone))},ModelList.prototype.deleteDone=function(data){var $masterTabPane=this.getMasterTabsActivePane();this.getIndexController().unchangeTab($masterTabPane),this.forceCloseTab($masterTabPane),this.updateDataRegistry(data)},ModelList.prototype.getTableControlObject=function($target){var tableObj=$target.closest("form").find("[data-control=table]").data("oc.table");if(!tableObj)throw new Error("Table object is not found on the model list tab");return tableObj},ModelList.prototype.getModelList=function(){return $("#layout-side-panel form[data-content-id=models] [data-control=filelist]")},ModelList.prototype.validateTable=function($target){var tableObj=this.getTableControlObject($target);return tableObj.unfocusTable(),tableObj.validate()},ModelList.prototype.getTableData=function($target){return this.getTableControlObject($target).dataSource.getAllData()},ModelList.prototype.loadModelFields=function(table,callback){var $form=$(table).closest("form"),modelClass=$form.find("input[name=model_class]").val(),cachedFields=$form.data("oc.model-field-cache");void 0===cachedFields?(void 0===this.cachedModelFieldsPromises[modelClass]&&(this.cachedModelFieldsPromises[modelClass]=$form.request("onModelFormGetModelFields",{data:{as_plain_list:1}})),void 0!==callback&&this.cachedModelFieldsPromises[modelClass].done((function(data){$form.data("oc.model-field-cache",data.responseData.options),callback(data.responseData.options)}))):callback(cachedFields)},ModelList.prototype.updateDataRegistry=function(data){if(void 0!==data.builderResponseData.registryData){var registryData=data.builderResponseData.registryData;$.oc.builder.dataRegistry.set(registryData.pluginCode,"model-lists",registryData.modelClass,registryData.lists),$.oc.builder.dataRegistry.clearCache(registryData.pluginCode,"plugin-lists")}},ModelList.prototype.databaseColumnsLoaded=function(data){$.isArray(data.responseData.columns)||alert("Invalid server response");var $form=this.getMasterTabsActivePane().find("form"),existingColumns=this.getColumnNames($form),columnsAdded=!1;for(var i in data.responseData.columns){var column=data.responseData.columns[i],type=this.mapType(column.type);-1===$.inArray(column.name,existingColumns)&&(this.addColumn($form,column.name,type),columnsAdded=!0)}columnsAdded?$form.trigger("change"):alert($form.attr("data-lang-all-database-columns-exist"))},ModelList.prototype.mapType=function(type){switch(type){case"integer":return"number";case"timestamp":return"datetime";default:return"text"}},ModelList.prototype.addColumn=function($target,column,type){var tableObj=this.getTableControlObject($target),currentData=this.getTableData($target),rowData={field:column,label:column,type:type};tableObj.addRecord("bottom",!0),tableObj.setRowValues(currentData.length-1,rowData),tableObj.addRecord("bottom",!1),tableObj.deleteRecord()},ModelList.prototype.getColumnNames=function($target){this.getTableControlObject($target).unfocusTable();var data=this.getTableData($target),result=[];for(var index in data)void 0!==data[index].field&&result.push($.trim(data[index].field));return result},ModelList.prototype.onAutocompleteItems=function(ev,data){if("model-fields"===data.columnConfiguration.fillFrom)return ev.preventDefault(),this.loadModelFields(ev.target,data.callback),!1},ModelList.prototype.onListLoaded=function(){$(document).trigger("render");var $masterTabPane=this.getMasterTabsActivePane(),$form=$masterTabPane.find("form"),$toolbar=$masterTabPane.find("div[data-control=table] div.toolbar"),$button=$('');$button.text($form.attr("data-lang-add-database-columns")),$toolbar.append($button)},$.oc.builder.entityControllers.modelList=ModelList}(window.jQuery),function($){"use strict";void 0===$.oc.builder&&($.oc.builder={}),void 0===$.oc.builder.entityControllers&&($.oc.builder.entityControllers={});var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype,Permission=function(indexController){Base.call(this,"permissions",indexController)};(Permission.prototype=Object.create(BaseProto)).constructor=Permission,Permission.prototype.registerHandlers=function(){this.indexController.$masterTabs.on("oc.tableNewRow",this.proxy(this.onTableRowCreated))},Permission.prototype.cmdOpenPermissions=function(ev){var currentPlugin=this.getSelectedPlugin();currentPlugin?this.indexController.openOrLoadMasterTab($(ev.target),"onPermissionsOpen",this.makeTabId(currentPlugin)):alert("Please select a plugin first")},Permission.prototype.cmdSavePermissions=function(ev){var $target=$(ev.currentTarget);$target.closest("form");this.validateTable($target)&&$target.request("onPermissionsSave",{data:{permissions:this.getTableData($target)}}).done(this.proxy(this.savePermissionsDone))},Permission.prototype.getTableControlObject=function($target){var tableObj=$target.closest("form").find("[data-control=table]").data("oc.table");if(!tableObj)throw new Error("Table object is not found on permissions tab");return tableObj},Permission.prototype.validateTable=function($target){var tableObj=this.getTableControlObject($target);return tableObj.unfocusTable(),tableObj.validate()},Permission.prototype.getTableData=function($target){return this.getTableControlObject($target).dataSource.getAllData()},Permission.prototype.savePermissionsDone=function(data){if(void 0===data.builderResponseData)throw new Error("Invalid response data");var $masterTabPane=this.getMasterTabsActivePane();this.getIndexController().unchangeTab($masterTabPane),$.oc.builder.dataRegistry.clearCache(data.builderResponseData.pluginCode,"permissions")},Permission.prototype.onTableRowCreated=function(ev,recordData){var $target=$(ev.target);if("permissions"==$target.data("alias")){var $form=$target.closest("form");if("permissions"==$form.data("entity")){var pluginCode=$form.find("input[name=plugin_code]").val();recordData.permission=pluginCode.toLowerCase()+"."}}},$.oc.builder.entityControllers.permission=Permission}(window.jQuery),function($){"use strict";void 0===$.oc.builder&&($.oc.builder={}),void 0===$.oc.builder.entityControllers&&($.oc.builder.entityControllers={});var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype,Menus=function(indexController){Base.call(this,"menus",indexController)};(Menus.prototype=Object.create(BaseProto)).constructor=Menus,Menus.prototype.cmdOpenMenus=function(ev){var currentPlugin=this.getSelectedPlugin();currentPlugin?this.indexController.openOrLoadMasterTab($(ev.target),"onMenusOpen",this.makeTabId(currentPlugin)):alert("Please select a plugin first")},Menus.prototype.cmdSaveMenus=function(ev){var $target=$(ev.currentTarget),$form=$target.closest("form"),$inspectorContainer=$form.find(".inspector-container");if($.oc.inspector.manager.applyValuesFromContainer($inspectorContainer)){var menus=$.oc.builder.menubuilder.controller.getJson($form.get(0));$target.request("onMenusSave",{data:{menus:menus}}).done(this.proxy(this.saveMenusDone))}},Menus.prototype.cmdAddMainMenuItem=function(ev){$.oc.builder.menubuilder.controller.addMainMenuItem(ev)},Menus.prototype.cmdAddSideMenuItem=function(ev){$.oc.builder.menubuilder.controller.addSideMenuItem(ev)},Menus.prototype.cmdDeleteMenuItem=function(ev){$.oc.builder.menubuilder.controller.deleteMenuItem(ev)},Menus.prototype.saveMenusDone=function(data){if(void 0===data.builderResponseData)throw new Error("Invalid response data");var $masterTabPane=this.getMasterTabsActivePane();$.oc.mainMenu&&data.mainMenu&&data.mainMenuLeft&&$.oc.mainMenu.reload(data.mainMenu,data.mainMenuLeft),this.getIndexController().unchangeTab($masterTabPane)},$.oc.builder.entityControllers.menus=Menus}(window.jQuery),function($){"use strict";void 0===$.oc.builder&&($.oc.builder={}),void 0===$.oc.builder.entityControllers&&($.oc.builder.entityControllers={});var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype,Imports=function(indexController){Base.call(this,"imports",indexController)};(Imports.prototype=Object.create(BaseProto)).constructor=Imports,Imports.prototype.cmdOpenImports=function(ev){var currentPlugin=this.getSelectedPlugin();currentPlugin?this.indexController.openOrLoadMasterTab($(ev.target),"onImportsOpen",this.makeTabId(currentPlugin)):alert("Please select a plugin first")},Imports.prototype.cmdConfirmImports=function(ev){$(ev.currentTarget).popup({handler:"onImportsShowConfirmPopup"})},Imports.prototype.cmdSaveImports=function(ev){var $form=this.getMasterTabsActivePane().find("form"),$popup=$(ev.currentTarget).closest(".control-popup");$popup.removeClass("show").popup("setLoading",!0),$form.request("onImportsSave",{data:oc.serializeJSON($popup.get(0))}).done((data=>{$popup.trigger("close.oc.popup"),this.saveImportsDone(data)})).fail((()=>{$popup.addClass("show").popup("setLoading",!1).popup("setShake")}))},Imports.prototype.cmdMigrateDatabase=function(ev){$(ev.currentTarget).request("onMigrateDatabase")},Imports.prototype.cmdAddBlueprintItem=function(ev){},Imports.prototype.cmdRemoveBlueprintItem=function(ev){},Imports.prototype.saveImportsDone=function(data){this.hideInspector(),$("#blueprintList").html(""),$.oc.mainMenu&&data&&data.mainMenu&&data.mainMenuLeft&&$.oc.mainMenu.reload(data.mainMenu,data.mainMenuLeft);var $masterTabPane=this.getMasterTabsActivePane();this.getIndexController().unchangeTab($masterTabPane)},Imports.prototype.hideInspector=function(){var $container=$(".blueprint-container.inspector-open:first");if($container.length){var $inspectorContainer=this.findInspectorContainer($container);$.oc.foundation.controlUtils.disposeControls($inspectorContainer.get(0))}},Imports.prototype.findInspectorContainer=function($element){return $element.closest("[data-inspector-container]").find(".inspector-container")},$.oc.builder.entityControllers.imports=Imports}(window.jQuery),function($){"use strict";void 0===$.oc.builder&&($.oc.builder={}),void 0===$.oc.builder.entityControllers&&($.oc.builder.entityControllers={});var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype,Code=function(indexController){Base.call(this,"code",indexController)};(Code.prototype=Object.create(BaseProto)).constructor=Code,Code.prototype.registerHandlers=function(){},Code.prototype.cmdCreateCode=function(ev){this.indexController.openOrLoadMasterTab($(ev.target),"onCodeOpen",this.newTabId())},Code.prototype.cmdOpenCode=function(ev){var path=$(ev.currentTarget).data("path"),pluginCode=$(ev.currentTarget).data("pluginCode"),result=this.indexController.openOrLoadMasterTab($(ev.target),"onCodeOpen",this.makeTabId(pluginCode+"-"+path),{fileName:path});!1!==result&&result.done(this.proxy(this.updateFormEditorMode,this))},Code.prototype.cmdSaveCode=function(ev){var $target=$(ev.currentTarget),$inspectorContainer=$target.closest("form").find(".inspector-container");$.oc.inspector.manager.applyValuesFromContainer($inspectorContainer)&&$target.request("onCodeSave").done(this.proxy(this.saveCodeDone))},Code.prototype.saveCodeDone=function(data){if(void 0===data.builderResponseData)throw new Error("Invalid response data");var $masterTabPane=this.getMasterTabsActivePane();this.getIndexController().unchangeTab($masterTabPane),this.updateFormEditorMode()},Code.prototype.getCodeList=function(){return $("#layout-side-panel form[data-content-id=code] .control-codelist")},Code.prototype.updateFormEditorMode=function(){var $masterTabPane=this.getMasterTabsActivePane(),modes={css:"css",htm:"html",html:"html",js:"javascript",json:"json",less:"less",md:"markdown",sass:"sass",scss:"scss",txt:"plain_text",yaml:"yaml",xml:"xml",php:"php"},parts=$("input[name=fileName]",$masterTabPane).val().split("."),extension="txt",mode="plain_text",editor=$("[data-control=codeeditor]",$masterTabPane);parts.length>=2&&(extension=parts.pop().toLowerCase()),void 0!==modes[extension]&&(mode=modes[extension]);window.setTimeout((function(){editor.data("oc.codeEditor").editor.getSession().setMode({path:"ace/mode/"+mode})}),200)},$.oc.builder.entityControllers.code=Code}(window.jQuery),function($){"use strict";void 0===$.oc.builder&&($.oc.builder={}),void 0===$.oc.builder.entityControllers&&($.oc.builder.entityControllers={});var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype,Version=function(indexController){Base.call(this,"version",indexController),this.hiddenHints={}};(Version.prototype=Object.create(BaseProto)).constructor=Version,Version.prototype.cmdCreateVersion=function(ev){var $link=$(ev.currentTarget),versionType=$link.data("versionType");this.indexController.openOrLoadMasterTab($link,"onVersionCreateOrOpen",this.newTabId(),{version_type:versionType})},Version.prototype.cmdSaveVersion=function(ev){var $target=$(ev.currentTarget);$target.closest("form");$target.request("onVersionSave").done(this.proxy(this.saveVersionDone))},Version.prototype.cmdOpenVersion=function(ev){var versionNumber=$(ev.currentTarget).data("id"),pluginCode=$(ev.currentTarget).data("pluginCode");this.indexController.openOrLoadMasterTab($(ev.target),"onVersionCreateOrOpen",this.makeTabId(pluginCode+"-"+versionNumber),{original_version:versionNumber})},Version.prototype.cmdDeleteVersion=function(ev){var $target=$(ev.currentTarget);$.oc.confirm($target.data("confirm"),this.proxy(this.deleteConfirmed))},Version.prototype.cmdApplyVersion=function(ev){var $target=$(ev.currentTarget),$pane=$target.closest("div.tab-pane"),self=this;this.showHintPopup($pane,"builder-version-apply",(function(){$target.request("onVersionApply").done(self.proxy(self.applyVersionDone))}))},Version.prototype.cmdRollbackVersion=function(ev){var $target=$(ev.currentTarget),$pane=$target.closest("div.tab-pane"),self=this;this.showHintPopup($pane,"builder-version-rollback",(function(){$target.request("onVersionRollback").done(self.proxy(self.rollbackVersionDone))}))},Version.prototype.saveVersionDone=function(data){if(void 0===data.builderResponseData)throw new Error("Invalid response data");var $masterTabPane=this.getMasterTabsActivePane();this.updateUiAfterSave($masterTabPane,data),data.builderResponseData.isApplied||this.showSavedNotAppliedHint($masterTabPane)},Version.prototype.showSavedNotAppliedHint=function($masterTabPane){this.showHintPopup($masterTabPane,"builder-version-save-unapplied")},Version.prototype.showHintPopup=function($masterTabPane,code,callback){this.getDontShowHintAgain(code,$masterTabPane)?callback&&callback.apply(this):($masterTabPane.one("hide.oc.popup",this.proxy(this.onHintPopupHide)),callback&&$masterTabPane.one("shown.oc.popup",(function(ev,$element,$modal){$modal.find("form").one("submit",(function(ev){return callback.apply(this),ev.preventDefault(),$(ev.target).trigger("close.oc.popup"),!1}))})),$masterTabPane.popup({content:this.getPopupContent($masterTabPane,code)}))},Version.prototype.onHintPopupHide=function(ev,$element,$modal){var cbValue=$modal.find("input[type=checkbox][name=dont_show_again]").is(":checked"),code=$modal.find("input[type=hidden][name=hint_code]").val();($modal.find("form").off("submit"),cbValue)&&(this.getMasterTabsActivePane().find('form[data-entity="versions"]').request("onHideBackendHint",{data:{name:code}}),this.setDontShowHintAgain(code))},Version.prototype.setDontShowHintAgain=function(code){this.hiddenHints[code]=!0},Version.prototype.getDontShowHintAgain=function(code,$pane){return void 0!==this.hiddenHints[code]?this.hiddenHints[code]:"true"==$pane.find('input[type=hidden][data-hint-hidden="'+code+'"]').val()},Version.prototype.getPopupContent=function($pane,code){var template=$pane.find('script[data-version-hint-template="'+code+'"]');if(0===template.length)throw new Error("Version popup template not found: "+code);return template.html()},Version.prototype.updateUiAfterSave=function($masterTabPane,data){$masterTabPane.find("input[name=original_version]").val(data.builderResponseData.savedVersion),this.updateMasterTabIdAndTitle($masterTabPane,data.builderResponseData),this.unhideFormDeleteButton($masterTabPane),this.getVersionList().fileList("markActive",data.builderResponseData.tabId),this.getIndexController().unchangeTab($masterTabPane)},Version.prototype.deleteConfirmed=function(){var $form=this.getMasterTabsActivePane().find("form");$.oc.stripeLoadIndicator.show(),$form.request("onVersionDelete").always($.oc.builder.indexController.hideStripeIndicatorProxy).done(this.proxy(this.deleteDone))},Version.prototype.deleteDone=function(){var $masterTabPane=this.getMasterTabsActivePane();this.getIndexController().unchangeTab($masterTabPane),this.forceCloseTab($masterTabPane)},Version.prototype.applyVersionDone=function(data){if(void 0===data.builderResponseData)throw new Error("Invalid response data");var $masterTabPane=this.getMasterTabsActivePane();this.updateUiAfterSave($masterTabPane,data),this.updateVersionsButtons()},Version.prototype.rollbackVersionDone=function(data){if(void 0===data.builderResponseData)throw new Error("Invalid response data");var $masterTabPane=this.getMasterTabsActivePane();this.updateUiAfterSave($masterTabPane,data),this.updateVersionsButtons()},Version.prototype.getVersionList=function(){return $("#layout-side-panel form[data-content-id=version] [data-control=filelist]")},Version.prototype.updateVersionsButtons=function(){for(var tabsObject=this.getMasterTabsObject(),$tabs=tabsObject.$tabsContainer.find("> li"),$versionList=this.getVersionList(),i=$tabs.length-1;i>=0;i--){var $tab=$($tabs[i]),tabId=$tab.data("tabId");if(tabId&&0!=String(tabId).length){var $versionLi=$versionList.find('li[data-id="'+tabId+'"]');if($versionLi.length){var isApplied=$versionLi.data("applied"),$pane=tabsObject.findPaneFromTab($tab);isApplied?($pane.find('[data-builder-command="version:cmdApplyVersion"]').addClass("hide oc-hide"),$pane.find('[data-builder-command="version:cmdRollbackVersion"]').removeClass("hide oc-hide")):($pane.find('[data-builder-command="version:cmdApplyVersion"]').removeClass("hide oc-hide"),$pane.find('[data-builder-command="version:cmdRollbackVersion"]').addClass("hide oc-hide"))}}}},$.oc.builder.entityControllers.version=Version}(window.jQuery),function($){"use strict";void 0===$.oc.builder&&($.oc.builder={}),void 0===$.oc.builder.entityControllers&&($.oc.builder.entityControllers={});var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype,Localization=function(indexController){Base.call(this,"localization",indexController)};(Localization.prototype=Object.create(BaseProto)).constructor=Localization,Localization.prototype.cmdCreateLanguage=function(ev){this.indexController.openOrLoadMasterTab($(ev.target),"onLanguageCreateOrOpen",this.newTabId())},Localization.prototype.cmdOpenLanguage=function(ev){var language=$(ev.currentTarget).data("id"),pluginCode=$(ev.currentTarget).data("pluginCode");this.indexController.openOrLoadMasterTab($(ev.target),"onLanguageCreateOrOpen",this.makeTabId(pluginCode+"-"+language),{original_language:language})},Localization.prototype.cmdSaveLanguage=function(ev){var $target=$(ev.currentTarget);$target.closest("form");$target.request("onLanguageSave").done(this.proxy(this.saveLanguageDone))},Localization.prototype.cmdDeleteLanguage=function(ev){var $target=$(ev.currentTarget);$.oc.confirm($target.data("confirm"),this.proxy(this.deleteConfirmed))},Localization.prototype.cmdCopyMissingStrings=function(ev){var $form=$(ev.currentTarget),language=$form.find("select[name=language]").val(),$masterTabPane=this.getMasterTabsActivePane();$form.trigger("close.oc.popup"),$.oc.stripeLoadIndicator.show(),$masterTabPane.find("form").request("onLanguageCopyStringsFrom",{data:{copy_from:language}}).always($.oc.builder.indexController.hideStripeIndicatorProxy).done(this.proxy(this.copyStringsFromDone))},Localization.prototype.languageUpdated=function(plugin){var languageForm=this.findDefaultLanguageForm(plugin);if(languageForm){var $languageForm=$(languageForm);$languageForm.hasClass("oc-data-changed")?this.mergeLanguageFromServer($languageForm):this.updateLanguageFromServer($languageForm)}},Localization.prototype.updateOnScreenStrings=function(plugin){var stringElements=document.body.querySelectorAll('span[data-localization-key][data-plugin="'+plugin+'"]');$.oc.builder.dataRegistry.get($("#builder-plugin-selector-panel form"),plugin,"localization",null,(function(data){for(var i=stringElements.length-1;i>=0;i--){var stringElement=stringElements[i],stringKey=stringElement.getAttribute("data-localization-key");void 0!==data[stringKey]?stringElement.textContent=data[stringKey]:stringElement.textContent=stringKey}}))},Localization.prototype.saveLanguageDone=function(data){if(void 0===data.builderResponseData)throw new Error("Invalid response data");var $masterTabPane=this.getMasterTabsActivePane();if($masterTabPane.find("input[name=original_language]").val(data.builderResponseData.language),this.updateMasterTabIdAndTitle($masterTabPane,data.builderResponseData),this.unhideFormDeleteButton($masterTabPane),this.getLanguageList().fileList("markActive",data.builderResponseData.tabId),this.getIndexController().unchangeTab($masterTabPane),void 0!==data.builderResponseData.registryData){var registryData=data.builderResponseData.registryData;$.oc.builder.dataRegistry.set(registryData.pluginCode,"localization",null,registryData.strings,{suppressLanguageEditorUpdate:!0}),$.oc.builder.dataRegistry.set(registryData.pluginCode,"localization","sections",registryData.sections)}},Localization.prototype.getLanguageList=function(){return $("#layout-side-panel form[data-content-id=localization] [data-control=filelist]")},Localization.prototype.getCodeEditor=function($tab){return $tab.find("div[data-field-name=strings] div[data-control=codeeditor]").data("oc.codeEditor").editor},Localization.prototype.deleteConfirmed=function(){var $form=this.getMasterTabsActivePane().find("form");$.oc.stripeLoadIndicator.show(),$form.request("onLanguageDelete").always($.oc.builder.indexController.hideStripeIndicatorProxy).done(this.proxy(this.deleteDone))},Localization.prototype.deleteDone=function(){var $masterTabPane=this.getMasterTabsActivePane();this.getIndexController().unchangeTab($masterTabPane),this.forceCloseTab($masterTabPane)},Localization.prototype.copyStringsFromDone=function(data){if(void 0===data.builderResponseData)throw new Error("Invalid response data");var responseData=data.builderResponseData,$masterTabPane=this.getMasterTabsActivePane(),$form=$masterTabPane.find("form"),codeEditor=this.getCodeEditor($masterTabPane),newStringMessage=$form.data("newStringMessage"),mismatchMessage=$form.data("structureMismatch");codeEditor.getSession().setValue(responseData.strings);for(var annotations=[],i=responseData.updatedLines.length-1;i>=0;i--){var line=responseData.updatedLines[i];annotations.push({row:line,column:0,text:newStringMessage,type:"warning"})}codeEditor.getSession().setAnnotations(annotations),responseData.mismatch&&$.oc.alert(mismatchMessage)},Localization.prototype.findDefaultLanguageForm=function(plugin){for(var forms=document.body.querySelectorAll("form[data-entity=localization]"),i=forms.length-1;i>=0;i--){var form=forms[i],pluginInput=form.querySelector("input[name=plugin_code]"),languageInput=form.querySelector("input[name=original_language]");if(pluginInput&&pluginInput.value==plugin&&(languageInput&&form.getAttribute("data-default-language")==languageInput.value))return form}return null},Localization.prototype.updateLanguageFromServer=function($languageForm){var self=this;$languageForm.request("onLanguageGetStrings").done((function(data){self.updateLanguageFromServerDone($languageForm,data)}))},Localization.prototype.updateLanguageFromServerDone=function($languageForm,data){if(void 0===data.builderResponseData)throw new Error("Invalid response data");var responseData=data.builderResponseData,$tabPane=$languageForm.closest(".tab-pane"),codeEditor=this.getCodeEditor($tabPane);responseData.strings&&(codeEditor.getSession().setValue(responseData.strings),this.unmodifyTab($tabPane))},Localization.prototype.mergeLanguageFromServer=function($languageForm){var language=$languageForm.find("input[name=original_language]").val(),self=this;$languageForm.request("onLanguageCopyStringsFrom",{data:{copy_from:language}}).done((function(data){self.mergeLanguageFromServerDone($languageForm,data)}))},Localization.prototype.mergeLanguageFromServerDone=function($languageForm,data){if(void 0===data.builderResponseData)throw new Error("Invalid response data");var responseData=data.builderResponseData,$tabPane=$languageForm.closest(".tab-pane"),codeEditor=this.getCodeEditor($tabPane);codeEditor.getSession().setValue(responseData.strings),codeEditor.getSession().setAnnotations([])},$.oc.builder.entityControllers.localization=Localization}(window.jQuery),function($){"use strict";void 0===$.oc.builder&&($.oc.builder={}),void 0===$.oc.builder.entityControllers&&($.oc.builder.entityControllers={});var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype,Controller=function(indexController){Base.call(this,"controller",indexController)};(Controller.prototype=Object.create(BaseProto)).constructor=Controller,Controller.prototype.cmdCreateController=function(ev){var $form=$(ev.currentTarget),self=this,pluginCode=$form.data("pluginCode");($form.find('input[name="behaviors[]"]:checked').length?this.indexController.openOrLoadMasterTab($form,"onControllerCreate",this.makeTabId(pluginCode+"-new-controller"),{}):$form.request("onControllerCreate")).done((function(data){$form.trigger("close.oc.popup"),self.updateDataRegistry(data)})).always($.oc.builder.indexController.hideStripeIndicatorProxy)},Controller.prototype.cmdOpenController=function(ev){var controller=$(ev.currentTarget).data("id"),pluginCode=$(ev.currentTarget).data("pluginCode");this.indexController.openOrLoadMasterTab($(ev.target),"onControllerOpen",this.makeTabId(pluginCode+"-"+controller),{controller:controller})},Controller.prototype.cmdSaveController=function(ev){var $target=$(ev.currentTarget),$inspectorContainer=$target.closest("form").find(".inspector-container");$.oc.inspector.manager.applyValuesFromContainer($inspectorContainer)&&$target.request("onControllerSave").done(this.proxy(this.saveControllerDone))},Controller.prototype.saveControllerDone=function(data){if(void 0===data.builderResponseData)throw new Error("Invalid response data");var $masterTabPane=this.getMasterTabsActivePane();this.getIndexController().unchangeTab($masterTabPane)},Controller.prototype.updateDataRegistry=function(data){if(void 0!==data.builderResponseData.registryData){var registryData=data.builderResponseData.registryData;$.oc.builder.dataRegistry.set(registryData.pluginCode,"controller-urls",null,registryData.urls)}},Controller.prototype.getControllerList=function(){return $("#layout-side-panel form[data-content-id=controller] [data-control=filelist]")},$.oc.builder.entityControllers.controller=Controller}(window.jQuery),function($){"use strict";void 0===$.oc.builder&&($.oc.builder={});var Base=$.oc.foundation.base,BaseProto=Base.prototype,Builder=function(){Base.call(this),this.$masterTabs=null,this.masterTabsObj=null,this.hideStripeIndicatorProxy=null,this.entityControllers={},this.init()};(Builder.prototype=Object.create(BaseProto)).constructor=Builder,Builder.prototype.dispose=function(){BaseProto.dispose.call(this)},Builder.prototype.openOrLoadMasterTab=function($form,serverHandlerName,tabId,data){if(this.masterTabsObj.goTo(tabId))return!1;var requestData=void 0===data?{}:data;return $.oc.stripeLoadIndicator.show(),$form.request(serverHandlerName,{data:requestData}).done(this.proxy(this.addMasterTab)).always(this.hideStripeIndicatorProxy)},Builder.prototype.getMasterTabActivePane=function(){return this.$masterTabs.find("> .tab-content > .tab-pane.active")},Builder.prototype.unchangeTab=function($pane){$pane.find("form").trigger("unchange.oc.changeMonitor")},Builder.prototype.triggerCommand=function(command,ev){var commandParts=command.split(":");if(2===commandParts.length){var entity=commandParts[0],commandToExecute=commandParts[1];if(void 0===this.entityControllers[entity])throw new Error("Unknown entity type: "+entity);this.entityControllers[entity].invokeCommand(commandToExecute,ev)}},Builder.prototype.init=function(){this.$masterTabs=$("#builder-master-tabs"),this.$sidePanel=$("#builder-side-panel"),this.masterTabsObj=this.$masterTabs.data("oc.tab"),this.hideStripeIndicatorProxy=this.proxy(this.hideStripeIndicator),new $.oc.tabFormExpandControls(this.$masterTabs),this.createEntityControllers(),this.registerHandlers()},Builder.prototype.createEntityControllers=function(){for(var controller in $.oc.builder.entityControllers)"base"!=controller&&(this.entityControllers[controller]=new $.oc.builder.entityControllers[controller](this))},Builder.prototype.registerHandlers=function(){for(var controller in $(document).on("click","[data-builder-command]",this.proxy(this.onCommand)),$(document).on("submit","[data-builder-command]",this.proxy(this.onCommand)),this.$masterTabs.on("changed.oc.changeMonitor",this.proxy(this.onFormChanged)),this.$masterTabs.on("unchanged.oc.changeMonitor",this.proxy(this.onFormUnchanged)),this.$masterTabs.on("shown.bs.tab",this.proxy(this.onTabShown)),this.$masterTabs.on("afterAllClosed.oc.tab",this.proxy(this.onAllTabsClosed)),this.$masterTabs.on("closed.oc.tab",this.proxy(this.onTabClosed)),this.$masterTabs.on("autocompleteitems.oc.inspector",this.proxy(this.onDataRegistryItems)),this.$masterTabs.on("dropdownoptions.oc.inspector",this.proxy(this.onDataRegistryItems)),this.entityControllers)void 0!==this.entityControllers[controller].registerHandlers&&this.entityControllers[controller].registerHandlers()},Builder.prototype.hideStripeIndicator=function(){$.oc.stripeLoadIndicator.hide()},Builder.prototype.addMasterTab=function(data){this.masterTabsObj.addTab(data.tabTitle,data.tab,data.tabId,"oc-"+data.tabIcon);var $masterTabPane=this.getMasterTabActivePane();data.isNewRecord&&$masterTabPane.find("form").one("ready.oc.changeMonitor",this.proxy(this.onChangeMonitorReady)),$("[data-builder-tabs]",$masterTabPane).dragScroll()},Builder.prototype.updateModifiedCounter=function(){var counters={database:{menu:"database",count:0},models:{menu:"models",count:0},permissions:{menu:"permissions",count:0},menus:{menu:"menus",count:0},imports:{menu:"imports",count:0},versions:{menu:"versions",count:0},localization:{menu:"localization",count:0},controller:{menu:"controllers",count:0},code:{menu:"code",count:0}};$("> div.tab-content > div.tab-pane[data-modified] > form",this.$masterTabs).each((function(){var entity=$(this).data("entity");counters[entity].count++})),$.each(counters,(function(type,data){$.oc.sideNav.setCounter("builder/"+data.menu,data.count)}))},Builder.prototype.getFormPluginCode=function(formElement){var code=$(formElement).closest("form").find('input[name="plugin_code"]').val();if(!code)throw new Error("Plugin code input is not found in the form.");return code},Builder.prototype.setPageTitle=function(title){$.oc.layout.setPageTitle(title.length?title+" | ":title)},Builder.prototype.getFileLists=function(){return $("[data-control=filelist]",this.$sidePanel)},Builder.prototype.dataToInspectorArray=function(data){var result=[];for(var key in data){var item={title:data[key],value:key};result.push(item)}return result},Builder.prototype.onCommand=function(ev){if("FORM"!=ev.currentTarget.tagName||"click"!=ev.type){var command=$(ev.currentTarget).data("builderCommand");this.triggerCommand(command,ev);var $target=$(ev.currentTarget);if("A"!==ev.currentTarget.tagName||"menuitem"!=$target.attr("role")||"javascript:;"!=$target.attr("href"))return ev.preventDefault(),!1}},Builder.prototype.onFormChanged=function(ev){$(".form-tabless-fields",ev.target).trigger("modified.oc.tab"),this.updateModifiedCounter()},Builder.prototype.onFormUnchanged=function(ev){$(".form-tabless-fields",ev.target).trigger("unmodified.oc.tab"),this.updateModifiedCounter()},Builder.prototype.onTabShown=function(ev){if($(ev.target).closest("[data-control=tab]").attr("id")==this.$masterTabs.attr("id")){var dataId=$(ev.target).closest("li").attr("data-tab-id"),title=$(ev.target).attr("title");title&&this.setPageTitle(title),this.getFileLists().fileList("markActive",dataId),$(window).trigger("resize")}},Builder.prototype.onAllTabsClosed=function(ev){this.setPageTitle(""),this.getFileLists().fileList("markActive",null)},Builder.prototype.onTabClosed=function(ev,tab,pane){$(pane).find("form").off("ready.oc.changeMonitor",this.proxy(this.onChangeMonitorReady)),this.updateModifiedCounter()},Builder.prototype.onChangeMonitorReady=function(ev){$(ev.target).trigger("change")},Builder.prototype.onDataRegistryItems=function(ev,data){var self=this;if("model-classes"==data.propertyDefinition.fillFrom||"model-forms"==data.propertyDefinition.fillFrom||"model-lists"==data.propertyDefinition.fillFrom||"controller-urls"==data.propertyDefinition.fillFrom||"model-columns"==data.propertyDefinition.fillFrom||"plugin-lists"==data.propertyDefinition.fillFrom||"permissions"==data.propertyDefinition.fillFrom){ev.preventDefault();var subtype=null,subtypeProperty=data.propertyDefinition.subtypeFrom;void 0!==subtypeProperty&&(subtype=data.values[subtypeProperty]),$.oc.builder.dataRegistry.get($(ev.target),this.getFormPluginCode(ev.target),data.propertyDefinition.fillFrom,subtype,(function(response){data.callback({options:self.dataToInspectorArray(response)})}))}},$(document).ready((function(){$.oc.builder.indexController=new Builder}))}(window.jQuery),function($){"use strict";void 0===$.oc.builder&&($.oc.builder={});var Base=$.oc.foundation.base,BaseProto=Base.prototype,LocalizationInput=function(input,form,options){this.input=input,this.form=form,this.options=$.extend({},LocalizationInput.DEFAULTS,options),this.disposed=!1,this.initialized=!1,this.newStringPopupMarkup=null,Base.call(this),this.init()};LocalizationInput.prototype=Object.create(BaseProto),LocalizationInput.prototype.constructor=LocalizationInput,LocalizationInput.prototype.dispose=function(){this.unregisterHandlers(),this.form=null,this.options.beforePopupShowCallback=null,this.options.afterPopupHideCallback=null,this.options=null,this.disposed=!0,this.newStringPopupMarkup=null,this.initialized&&$(this.input).autocomplete("destroy"),$(this.input).removeData("localization-input"),this.input=null,BaseProto.dispose.call(this)},LocalizationInput.prototype.init=function(){if(!this.options.plugin)throw new Error("The options.plugin value should be set in the localization input object.");var $input=$(this.input);$input.data("localization-input",this),$input.attr("data-builder-localization-input","true"),$input.attr("data-builder-localization-plugin",this.options.plugin),this.getContainer().addClass("localization-input-container"),this.registerHandlers(),this.loadDataAndBuild()},LocalizationInput.prototype.buildAddLink=function(){var $container=this.getContainer();if(!($container.find("a.localization-trigger").length>0)){var trigger=document.createElement("a");trigger.setAttribute("class","oc-icon-plus localization-trigger"),trigger.setAttribute("href","#");var pos=$container.position();$(trigger).css({top:pos.top+4,right:7}),$container.append(trigger)}},LocalizationInput.prototype.loadDataAndBuild=function(){this.showLoadingIndicator();var result=$.oc.builder.dataRegistry.get(this.form,this.options.plugin,"localization",null,this.proxy(this.dataLoaded)),self=this;result&&result.always((function(){self.hideLoadingIndicator()}))},LocalizationInput.prototype.reload=function(){$.oc.builder.dataRegistry.get(this.form,this.options.plugin,"localization",null,this.proxy(this.dataLoaded))},LocalizationInput.prototype.dataLoaded=function(data){if(!this.disposed){var autocomplete=$(this.input).data("autocomplete");if(autocomplete)autocomplete.source=this.preprocessData(data);else{this.hideLoadingIndicator();var autocompleteOptions={source:this.preprocessData(data),matchWidth:!0};autocompleteOptions=$.extend(autocompleteOptions,this.options.autocompleteOptions),$(this.input).autocomplete(autocompleteOptions),this.initialized=!0}}},LocalizationInput.prototype.preprocessData=function(data){var dataClone=$.extend({},data);for(var key in dataClone)dataClone[key]=key+" - "+dataClone[key];return dataClone},LocalizationInput.prototype.getContainer=function(){return $(this.input).closest(".autocomplete-container")},LocalizationInput.prototype.showLoadingIndicator=function(){var $container=this.getContainer();$container.addClass("loading-indicator-container size-small"),$container.loadIndicator()},LocalizationInput.prototype.hideLoadingIndicator=function(){var $container=this.getContainer();$container.loadIndicator("hide"),$container.loadIndicator("destroy"),$container.removeClass("loading-indicator-container")},LocalizationInput.prototype.loadAndShowPopup=function(){null===this.newStringPopupMarkup?($.oc.stripeLoadIndicator.show(),$(this.input).request("onLanguageLoadAddStringForm").done(this.proxy(this.popupMarkupLoaded)).always((function(){$.oc.stripeLoadIndicator.hide()}))):this.showPopup()},LocalizationInput.prototype.popupMarkupLoaded=function(responseData){this.newStringPopupMarkup=responseData.markup,this.showPopup()},LocalizationInput.prototype.showPopup=function(){var $input=$(this.input);$input.popup({content:this.newStringPopupMarkup});var $content=$input.data("oc.popup").$content,$keyInput=$content.find("#language_string_key");$.oc.builder.dataRegistry.get(this.form,this.options.plugin,"localization","sections",(function(data){$keyInput.autocomplete({source:data,matchWidth:!0})})),$content.find("form").on("submit",this.proxy(this.onSubmitPopupForm))},LocalizationInput.prototype.stringCreated=function(data){if(void 0===data.localizationData||void 0===data.registryData)throw new Error("Invalid server response.");var $input=$(this.input);$input.val(data.localizationData.key),$.oc.builder.dataRegistry.set(this.options.plugin,"localization",null,data.registryData.strings),$.oc.builder.dataRegistry.set(this.options.plugin,"localization","sections",data.registryData.sections),$input.data("oc.popup").hide(),$input.trigger("change")},LocalizationInput.prototype.onSubmitPopupForm=function(ev){var $form=$(ev.target);return $.oc.stripeLoadIndicator.show(),$form.request("onLanguageCreateString",{data:{plugin_code:this.options.plugin}}).done(this.proxy(this.stringCreated)).always((function(){$.oc.stripeLoadIndicator.hide()})),ev.preventDefault(),!1},LocalizationInput.prototype.onPopupHidden=function(ev,link,popup){$(popup).find("#language_string_key").autocomplete("destroy"),$(popup).find("form").on("submit",this.proxy(this.onSubmitPopupForm)),this.options.afterPopupHideCallback&&this.options.afterPopupHideCallback()},LocalizationInput.updatePluginInputs=function(plugin){for(var inputs=document.body.querySelectorAll('input[data-builder-localization-input][data-builder-localization-plugin="'+plugin+'"]'),i=inputs.length-1;i>=0;i--)$(inputs[i]).data("localization-input").reload()},LocalizationInput.prototype.unregisterHandlers=function(){this.input.removeEventListener("focus",this.proxy(this.onInputFocus)),this.getContainer().off("click","a.localization-trigger",this.proxy(this.onTriggerClick)),$(this.input).off("hidden.oc.popup",this.proxy(this.onPopupHidden))},LocalizationInput.prototype.registerHandlers=function(){this.input.addEventListener("focus",this.proxy(this.onInputFocus)),this.getContainer().on("click","a.localization-trigger",this.proxy(this.onTriggerClick)),$(this.input).on("hidden.oc.popup",this.proxy(this.onPopupHidden))},LocalizationInput.prototype.onInputFocus=function(){this.buildAddLink()},LocalizationInput.prototype.onTriggerClick=function(ev){return this.options.beforePopupShowCallback&&this.options.beforePopupShowCallback(),this.loadAndShowPopup(),ev.preventDefault(),!1},LocalizationInput.DEFAULTS={plugin:null,autocompleteOptions:{},beforePopupShowCallback:null,afterPopupHideCallback:null},$.oc.builder.localizationInput=LocalizationInput}(window.jQuery),function($){"use strict";var Base=$.oc.inspector.propertyEditors.string,BaseProto=Base.prototype,LocalizationEditor=function(inspector,propertyDefinition,containerCell,group){this.localizationInput=null,Base.call(this,inspector,propertyDefinition,containerCell,group)};(LocalizationEditor.prototype=Object.create(BaseProto)).constructor=Base,LocalizationEditor.prototype.dispose=function(){this.removeLocalizationInput(),BaseProto.dispose.call(this)},LocalizationEditor.prototype.build=function(){var container=document.createElement("div"),editor=document.createElement("input"),placeholder=void 0!==this.propertyDefinition.placeholder?this.propertyDefinition.placeholder:"",value=this.inspector.getPropertyValue(this.propertyDefinition.property);editor.setAttribute("type","text"),editor.setAttribute("class","string-editor"),editor.setAttribute("placeholder",placeholder),container.setAttribute("class","autocomplete-container"),void 0===value&&(value=this.propertyDefinition.default),void 0===value&&(value=""),editor.value=value,$.oc.foundation.element.addClass(this.containerCell,"text autocomplete"),container.appendChild(editor),this.containerCell.appendChild(container),this.buildLocalizationEditor()},LocalizationEditor.prototype.buildLocalizationEditor=function(){this.localizationInput=new $.oc.builder.localizationInput(this.getInput(),this.getForm(),{plugin:this.getPluginCode(),beforePopupShowCallback:this.proxy(this.onPopupShown,this),afterPopupHideCallback:this.proxy(this.onPopupHidden,this)})},LocalizationEditor.prototype.removeLocalizationInput=function(){this.localizationInput.dispose(),this.localizationInput=null},LocalizationEditor.prototype.supportsExternalParameterEditor=function(){return!1},LocalizationEditor.prototype.registerHandlers=function(){BaseProto.registerHandlers.call(this),$(this.getInput()).on("change",this.proxy(this.onInputKeyUp))},LocalizationEditor.prototype.unregisterHandlers=function(){BaseProto.unregisterHandlers.call(this),$(this.getInput()).off("change",this.proxy(this.onInputKeyUp))},LocalizationEditor.prototype.getForm=function(){var inspectableElement=this.getRootSurface().getInspectableElement();if(!inspectableElement)throw new Error("Cannot determine inspectable element in the Builder localization editor.");return $(inspectableElement).closest("form")},LocalizationEditor.prototype.getPluginCode=function(){var $input=this.getForm().find("input[name=plugin_code]");if(!$input.length)throw new Error('The input "plugin_code" should be defined in the form in order to use the localization Inspector editor.');return $input.val()},LocalizationEditor.prototype.onPopupShown=function(){this.getRootSurface().popupDisplayed()},LocalizationEditor.prototype.onPopupHidden=function(){this.getRootSurface().popupHidden()},$.oc.inspector.propertyEditors.builderLocalization=LocalizationEditor}(window.jQuery),function($){"use strict";if(void 0===$.oc.table)throw new Error("The $.oc.table namespace is not defined. Make sure that the table.js script is loaded.");if(void 0===$.oc.table.processor)throw new Error("The $.oc.table.processor namespace is not defined. Make sure that the table.processor.base.js script is loaded.");var Base=$.oc.table.processor.string,BaseProto=Base.prototype,LocalizationProcessor=function(tableObj,columnName,columnConfiguration){this.localizationInput=null,this.popupDisplayed=!1,Base.call(this,tableObj,columnName,columnConfiguration)};(LocalizationProcessor.prototype=Object.create(BaseProto)).constructor=LocalizationProcessor,LocalizationProcessor.prototype.dispose=function(){this.removeLocalizationInput(),BaseProto.dispose.call(this)},LocalizationProcessor.prototype.onUnfocus=function(){this.activeCell&&!this.popupDisplayed&&(this.removeLocalizationInput(),BaseProto.onUnfocus.call(this))},LocalizationProcessor.prototype.onBeforePopupShow=function(){this.popupDisplayed=!0},LocalizationProcessor.prototype.onAfterPopupHide=function(){this.popupDisplayed=!1},LocalizationProcessor.prototype.renderCell=function(value,cellContentContainer){BaseProto.renderCell.call(this,value,cellContentContainer)},LocalizationProcessor.prototype.buildEditor=function(cellElement,cellContentContainer,isClick){BaseProto.buildEditor.call(this,cellElement,cellContentContainer,isClick),$.oc.foundation.element.addClass(cellContentContainer,"autocomplete-container"),this.buildLocalizationEditor()},LocalizationProcessor.prototype.buildLocalizationEditor=function(){var input=this.getInput();this.localizationInput=new $.oc.builder.localizationInput(input,$(input),{plugin:this.getPluginCode(input),beforePopupShowCallback:$.proxy(this.onBeforePopupShow,this),afterPopupHideCallback:$.proxy(this.onAfterPopupHide,this),autocompleteOptions:{menu:'',bodyContainer:!0}})},LocalizationProcessor.prototype.getInput=function(){return this.activeCell?this.activeCell.querySelector(".string-input"):null},LocalizationProcessor.prototype.getPluginCode=function(input){var $input=$(input).closest("form").find("input[name=plugin_code]");if(!$input.length)throw new Error('The input "plugin_code" should be defined in the form in order to use the localization table processor.');return $input.val()},LocalizationProcessor.prototype.removeLocalizationInput=function(){this.localizationInput&&(this.localizationInput.dispose(),this.localizationInput=null)},$.oc.table.processor.builderLocalization=LocalizationProcessor}(window.jQuery),function($){"use strict";var CodeList=function(form,alias){this.$form=$(form),this.alias=alias,this.$form.on("ajaxSuccess",$.proxy(this.onAjaxSuccess,this)),this.$form.on("click","ul.list > li.directory > a",$.proxy(this.onDirectoryClick,this)),this.$form.on("click","ul.list > li.file > a",$.proxy(this.onFileClick,this)),this.$form.on("click","p.parent > a",$.proxy(this.onDirectoryClick,this)),this.$form.on("click","a[data-control=delete-asset]",$.proxy(this.onDeleteClick,this)),this.$form.on("oc.list.setActiveItem",$.proxy(this.onSetActiveItem,this)),this.setupUploader()};CodeList.prototype.onDirectoryClick=function(e){return this.gotoDirectory($(e.currentTarget).data("path"),$(e.currentTarget).parent().hasClass("parent")),!1},CodeList.prototype.gotoDirectory=function(path,gotoParent){var $container=$("div.list-container",this.$form),self=this;void 0!==gotoParent&&gotoParent?$container.addClass("goBackward"):$container.addClass("goForward"),$.oc.stripeLoadIndicator.show(),this.$form.request(this.alias+"::onOpenDirectory",{data:{path:path,d:.2},complete:function(){self.updateUi(),$container.trigger("oc.scrollbar.gotoStart")},error:function(jqXHR,textStatus,errorThrown){$container.removeClass("goForward goBackward"),alert(jqXHR.responseText.length?jqXHR.responseText:jqXHR.statusText)}}).always((function(){$.oc.stripeLoadIndicator.hide()}))},CodeList.prototype.onDeleteClick=function(e){var $el=$(e.currentTarget),self=this;return!!confirm($el.data("confirmation"))&&(this.$form.request(this.alias+"::onDeleteFiles",{success:function(data){void 0!==data.error&&"string"===$.type(data.error)&&data.error.length&&$.oc.flashMsg({text:data.error,class:"error"})},complete:function(){self.refresh()}}),!1)},CodeList.prototype.onAjaxSuccess=function(){this.updateUi()},CodeList.prototype.onUploadFail=function(file,message){413===file.xhr.status&&(message="Server rejected the file because it was too large, try increasing post_max_size"),message||(message="Error uploading file"),$.oc.alert(message),this.refresh()},CodeList.prototype.onUploadSuccess=function(file,data){"success"!==data&&$.oc.alert(data)},CodeList.prototype.onUploadComplete=function(file,data){$.oc.stripeLoadIndicator.hide(),this.refresh()},CodeList.prototype.onUploadStart=function(){$.oc.stripeLoadIndicator.show()},CodeList.prototype.onFileClick=function(event){var $li=$(event.currentTarget).parent(),e=$.Event("open.oc.list",{relatedTarget:$li.get(0),clickEvent:event});if(this.$form.trigger(e,this),e.isDefaultPrevented())return!1},CodeList.prototype.onSetActiveItem=function(event,dataId){$("ul li.file",this.$form).removeClass("active"),dataId&&$('ul li.file[data-id="'+dataId+'"]',this.$form).addClass("active")},CodeList.prototype.updateUi=function(){$("button[data-control=asset-tools]",self.$form).trigger("oc.triggerOn.update")},CodeList.prototype.refresh=function(){var self=this;this.$form.request(this.alias+"::onRefresh",{complete:function(){self.updateUi()}})},CodeList.prototype.setupUploader=function(){var self=this,$link=$('[data-control="upload-assets"]',this.$form),uploaderOptions={method:"POST",url:window.location,paramName:"file_data",previewsContainer:$("
").get(0),clickable:$link.get(0),timeout:0,headers:{}},token=$('meta[name="csrf-token"]').attr("content");token&&(uploaderOptions.headers["X-CSRF-TOKEN"]=token);var dropzone=new Dropzone($("
").get(0),uploaderOptions);dropzone.on("error",$.proxy(self.onUploadFail,self)),dropzone.on("success",$.proxy(self.onUploadSuccess,self)),dropzone.on("complete",$.proxy(self.onUploadComplete,self)),dropzone.on("sending",(function(file,xhr,formData){$.each(self.$form.serializeArray(),(function(index,field){formData.append(field.name,field.value)})),xhr.setRequestHeader("X-OCTOBER-REQUEST-HANDLER",self.alias+"::onUpload"),self.onUploadStart()}))},$(document).on("render",(function(){var $container=$("#code-list-container");!0!==$container.data("oc.codeListAttached")&&($container.data("oc.codeListAttached",!0),new CodeList($container.closest("form"),$container.data("alias")))}))}(window.jQuery); + ++function($){"use strict";if($.oc.builder===undefined) +$.oc.builder={} +var Base=$.oc.foundation.base,BaseProto=Base.prototype +var DataRegistry=function(){this.data={} +this.requestCache={} +this.callbackCache={} +Base.call(this)} +DataRegistry.prototype.set=function(plugin,type,subtype,data,params){this.storeData(plugin,type,subtype,data) +if(type=='localization'&&!subtype){this.localizationUpdated(plugin,params)}} +DataRegistry.prototype.get=function($formElement,plugin,type,subtype,callback){if(this.data[plugin]===undefined||this.data[plugin][type]===undefined||this.data[plugin][type][subtype]===undefined||this.isCacheObsolete(this.data[plugin][type][subtype].timestamp)){return this.loadDataFromServer($formElement,plugin,type,subtype,callback)} +callback(this.data[plugin][type][subtype].data)} +DataRegistry.prototype.makeCacheKey=function(plugin,type,subtype){var key=plugin+'-'+type +if(subtype){key+='-'+subtype} +return key} +DataRegistry.prototype.isCacheObsolete=function(timestamp){return(Date.now()-timestamp)>60000*5} +DataRegistry.prototype.loadDataFromServer=function($formElement,plugin,type,subtype,callback){var self=this,cacheKey=this.makeCacheKey(plugin,type,subtype) +if(this.requestCache[cacheKey]===undefined){this.requestCache[cacheKey]=$formElement.request('onPluginDataRegistryGetData',{data:{registry_plugin_code:plugin,registry_data_type:type,registry_data_subtype:subtype}}).done(function(data){if(data.registryData===undefined){throw new Error('Invalid data registry response.')} +self.storeData(plugin,type,subtype,data.registryData) +self.applyCallbacks(cacheKey,data.registryData) +self.requestCache[cacheKey]=undefined})} +this.addCallbackToQueue(callback,cacheKey) +return this.requestCache[cacheKey]} +DataRegistry.prototype.addCallbackToQueue=function(callback,key){if(this.callbackCache[key]===undefined){this.callbackCache[key]=[]} +this.callbackCache[key].push(callback)} +DataRegistry.prototype.applyCallbacks=function(key,registryData){if(this.callbackCache[key]===undefined){return} +for(var i=this.callbackCache[key].length-1;i>=0;i--){this.callbackCache[key][i](registryData);} +delete this.callbackCache[key]} +DataRegistry.prototype.storeData=function(plugin,type,subtype,data){if(this.data[plugin]===undefined){this.data[plugin]={}} +if(this.data[plugin][type]===undefined){this.data[plugin][type]={}} +var dataItem={timestamp:Date.now(),data:data} +this.data[plugin][type][subtype]=dataItem} +DataRegistry.prototype.clearCache=function(plugin,type){if(this.data[plugin]===undefined){return} +if(this.data[plugin][type]===undefined){return} +this.data[plugin][type]=undefined} +DataRegistry.prototype.getLocalizationString=function($formElement,plugin,key,callback){this.get($formElement,plugin,'localization',null,function(data){if(data[key]!==undefined){callback(data[key]) +return} +callback(key)})} +DataRegistry.prototype.localizationUpdated=function(plugin,params){$.oc.builder.localizationInput.updatePluginInputs(plugin) +if(params===undefined||!params.suppressLanguageEditorUpdate){$.oc.builder.indexController.entityControllers.localization.languageUpdated(plugin)} +$.oc.builder.indexController.entityControllers.localization.updateOnScreenStrings(plugin)} +$.oc.builder.dataRegistry=new DataRegistry()}(window.jQuery);+function($){"use strict";if($.oc.builder===undefined) +$.oc.builder={} +if($.oc.builder.entityControllers===undefined) +$.oc.builder.entityControllers={} +var Base=$.oc.foundation.base,BaseProto=Base.prototype +var EntityBase=function(typeName,indexController){if(typeName===undefined){throw new Error('The Builder entity type name should be set in the base constructor call.')} +if(indexController===undefined){throw new Error('The Builder index controller should be set when creating an entity controller.')} +this.typeName=typeName +this.indexController=indexController +Base.call(this)} +EntityBase.prototype=Object.create(BaseProto) +EntityBase.prototype.constructor=EntityBase +EntityBase.prototype.registerHandlers=function(){} +EntityBase.prototype.invokeCommand=function(command,ev){if(/^cmd[a-zA-Z0-9]+$/.test(command)){if(this[command]!==undefined){this[command].apply(this,[ev])} +else{throw new Error('Unknown command: '+command)}} +else{throw new Error('Invalid command: '+command)}} +EntityBase.prototype.newTabId=function(){return this.typeName+Math.random()} +EntityBase.prototype.makeTabId=function(objectName){return this.typeName+'-'+objectName} +EntityBase.prototype.getMasterTabsActivePane=function(){return this.indexController.getMasterTabActivePane()} +EntityBase.prototype.getMasterTabsObject=function(){return this.indexController.masterTabsObj} +EntityBase.prototype.getSelectedPlugin=function(){var activeItem=$('#PluginList-pluginList-plugin-list > ul > li.active') +return activeItem.data('id')} +EntityBase.prototype.getIndexController=function(){return this.indexController} +EntityBase.prototype.updateMasterTabIdAndTitle=function($tabPane,responseData){var tabsObject=this.getMasterTabsObject() +tabsObject.updateIdentifier($tabPane,responseData.tabId) +tabsObject.updateTitle($tabPane,responseData.tabTitle)} +EntityBase.prototype.unhideFormDeleteButton=function($tabPane){$('[data-control=delete-button]',$tabPane).removeClass('hide oc-hide')} +EntityBase.prototype.forceCloseTab=function($tabPane){$tabPane.trigger('close.oc.tab',[{force:true}])} +EntityBase.prototype.unmodifyTab=function($tabPane){this.indexController.unchangeTab($tabPane)} +$.oc.builder.entityControllers.base=EntityBase;}(window.jQuery);+function($){"use strict";if($.oc.builder===undefined) +$.oc.builder={} +if($.oc.builder.entityControllers===undefined) +$.oc.builder.entityControllers={} +var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype +var Plugin=function(indexController){Base.call(this,'plugin',indexController) +this.popupZIndex=5050} +Plugin.prototype=Object.create(BaseProto) +Plugin.prototype.constructor=Plugin +Plugin.prototype.cmdMakePluginActive=function(ev){var $target=$(ev.currentTarget),selectedPluginCode=$target.data('pluginCode') +this.makePluginActive(selectedPluginCode)} +Plugin.prototype.cmdCreatePlugin=function(ev){var $target=$(ev.currentTarget) +$target.one('shown.oc.popup',this.proxy(this.onPluginPopupShown)) +$target.popup({handler:'onPluginLoadPopup',zIndex:this.popupZIndex})} +Plugin.prototype.cmdApplyPluginSettings=function(ev){var $form=$(ev.currentTarget),self=this +$.oc.stripeLoadIndicator.show() +$form.request('onPluginSave').always($.oc.builder.indexController.hideStripeIndicatorProxy).done(function(data){$form.trigger('close.oc.popup') +self.applyPluginSettingsDone(data)})} +Plugin.prototype.cmdEditPluginSettings=function(ev){var $target=$(ev.currentTarget) +$target.one('shown.oc.popup',this.proxy(this.onPluginPopupShown)) +$target.popup({handler:'onPluginLoadPopup',zIndex:this.popupZIndex,extraData:{pluginCode:$target.data('pluginCode')}})} +Plugin.prototype.onPluginPopupShown=function(ev,button,popup){$(popup).find('input[name=name]').focus()} +Plugin.prototype.applyPluginSettingsDone=function(data){if(data.responseData!==undefined&&data.responseData.isNewPlugin!==undefined){this.makePluginActive(data.responseData.pluginCode,true)}} +Plugin.prototype.makePluginActive=function(pluginCode,updatePluginList){var $form=$('#builder-plugin-selector-panel form').first() +$.oc.stripeLoadIndicator.show() +$form.request('onPluginSetActive',{data:{pluginCode:pluginCode,updatePluginList:(updatePluginList?1:0)}}).always($.oc.builder.indexController.hideStripeIndicatorProxy).done(this.proxy(this.makePluginActiveDone))} +Plugin.prototype.makePluginActiveDone=function(data){var pluginCode=data.responseData.pluginCode +$('#builder-plugin-selector-panel [data-control=filelist]').fileList('markActive',pluginCode)} +$.oc.builder.entityControllers.plugin=Plugin;}(window.jQuery);+function($){"use strict";if($.oc.builder===undefined) +$.oc.builder={} +if($.oc.builder.entityControllers===undefined) +$.oc.builder.entityControllers={} +var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype +var DatabaseTable=function(indexController){Base.call(this,'databaseTable',indexController)} +DatabaseTable.prototype=Object.create(BaseProto) +DatabaseTable.prototype.constructor=DatabaseTable +DatabaseTable.prototype.cmdCreateTable=function(ev){var result=this.indexController.openOrLoadMasterTab($(ev.target),'onDatabaseTableCreateOrOpen',this.newTabId()) +if(result!==false){result.done(this.proxy(this.onTableLoaded,this))}} +DatabaseTable.prototype.cmdOpenTable=function(ev){var table=$(ev.currentTarget).data('id'),result=this.indexController.openOrLoadMasterTab($(ev.target),'onDatabaseTableCreateOrOpen',this.makeTabId(table),{table_name:table}) +if(result!==false){result.done(this.proxy(this.onTableLoaded,this))}} +DatabaseTable.prototype.cmdSaveTable=function(ev){var $target=$(ev.currentTarget) +if(!this.validateTable($target)){return} +var data={'columns':this.getTableData($target)} +$target.popup({extraData:data,handler:'onDatabaseTableValidateAndShowPopup'})} +DatabaseTable.prototype.cmdSaveMigration=function(ev){var $target=$(ev.currentTarget) +$.oc.stripeLoadIndicator.show() +$target.request('onDatabaseTableMigrationApply').always($.oc.builder.indexController.hideStripeIndicatorProxy).done(this.proxy(this.saveMigrationDone))} +DatabaseTable.prototype.cmdDeleteTable=function(ev){var $target=$(ev.currentTarget) +$.oc.confirm($target.data('confirm'),this.proxy(this.deleteConfirmed))} +DatabaseTable.prototype.cmdUnModifyForm=function(){var $masterTabPane=this.getMasterTabsActivePane() +this.unmodifyTab($masterTabPane)} +DatabaseTable.prototype.cmdAddIdColumn=function(ev){var $target=$(ev.currentTarget),added=this.addIdColumn($target) +if(!added){alert($target.closest('form').attr('data-lang-id-exists'))}} +DatabaseTable.prototype.cmdAddTimestamps=function(ev){var $target=$(ev.currentTarget),added=this.addTimeStampColumns($target,['created_at','updated_at']) +if(!added){alert($target.closest('form').attr('data-lang-timestamps-exist'))}} +DatabaseTable.prototype.cmdAddSoftDelete=function(ev){var $target=$(ev.currentTarget),added=this.addTimeStampColumns($target,['deleted_at']) +if(!added){alert($target.closest('form').attr('data-lang-soft-deleting-exist'))}} +DatabaseTable.prototype.onTableCellChanged=function(ev,column,value,rowIndex){var $target=$(ev.target) +if($target.data('alias')!='columns'){return} +if($target.closest('form').data('entity')!='database'){return} +var updatedRow={} +if(column=='auto_increment'&&value){updatedRow.unsigned=1 +updatedRow.primary_key=1} +if(column=='unsigned'&&!value){updatedRow.auto_increment=0} +if(column=='primary_key'&&value){updatedRow.allow_null=0} +if(column=='allow_null'&&value){updatedRow.primary_key=0} +if(column=='primary_key'&&!value){updatedRow.auto_increment=0} +$target.table('setRowValues',rowIndex,updatedRow)} +DatabaseTable.prototype.onTableLoaded=function(){$(document).trigger('render') +var $masterTabPane=this.getMasterTabsActivePane(),$form=$masterTabPane.find('form'),$toolbar=$masterTabPane.find('div[data-control=table] div.toolbar'),$addIdButton=$(''),$addTimestampsButton=$(''),$addSoftDeleteButton=$('') +$addIdButton.text($form.attr('data-lang-add-id'));$toolbar.append($addIdButton) +$addTimestampsButton.text($form.attr('data-lang-add-timestamps'));$toolbar.append($addTimestampsButton) +$addSoftDeleteButton.text($form.attr('data-lang-add-soft-delete'));$toolbar.append($addSoftDeleteButton)} +DatabaseTable.prototype.registerHandlers=function(){this.indexController.$masterTabs.on('oc.tableCellChanged',this.proxy(this.onTableCellChanged))} +DatabaseTable.prototype.validateTable=function($target){var tableObj=this.getTableControlObject($target) +tableObj.unfocusTable() +return tableObj.validate()} +DatabaseTable.prototype.getTableData=function($target){var tableObj=this.getTableControlObject($target) +return tableObj.dataSource.getAllData()} +DatabaseTable.prototype.getTableControlObject=function($target){var $form=$target.closest('form'),$table=$form.find('[data-control=table]'),tableObj=$table.data('oc.table') +if(!tableObj){throw new Error('Table object is not found on the database table tab')} +return tableObj} +DatabaseTable.prototype.saveMigrationDone=function(data){if(data['builderResponseData']===undefined){throw new Error('Invalid response data')} +$('#builderTableMigrationPopup').trigger('close.oc.popup') +var $masterTabPane=this.getMasterTabsActivePane(),tabsObject=this.getMasterTabsObject() +if(data.builderResponseData.operation!='delete'){$masterTabPane.find('input[name=table_name]').val(data.builderResponseData.builderObjectName) +this.updateMasterTabIdAndTitle($masterTabPane,data.builderResponseData) +this.unhideFormDeleteButton($masterTabPane) +this.getTableList().fileList('markActive',data.builderResponseData.tabId) +this.getIndexController().unchangeTab($masterTabPane) +this.updateTable(data.builderResponseData)} +else{this.forceCloseTab($masterTabPane)} +$.oc.builder.dataRegistry.clearCache(data.builderResponseData.pluginCode,'model-columns')} +DatabaseTable.prototype.getTableList=function(){return $('#layout-side-panel form[data-content-id=database] [data-control=filelist]')} +DatabaseTable.prototype.deleteConfirmed=function(){var $masterTabPane=this.getMasterTabsActivePane() +$masterTabPane.find('form').popup({handler:'onDatabaseTableShowDeletePopup'})} +DatabaseTable.prototype.getColumnNames=function($target){var tableObj=this.getTableControlObject($target) +tableObj.unfocusTable() +var data=this.getTableData($target),result=[] +for(var index in data){if(data[index].name!==undefined){result.push($.trim(data[index].name))}} +return result} +DatabaseTable.prototype.addIdColumn=function($target){var existingColumns=this.getColumnNames($target),added=false +if(existingColumns.indexOf('id')===-1){var tableObj=this.getTableControlObject($target),currentData=this.getTableData($target),rowData={name:'id',type:'integer',unsigned:true,auto_increment:true,primary_key:true,} +if(currentData.length-1||currentData[0].name||currentData[0].type||currentData[0].length||currentData[0].unsigned||currentData[0].nullable||currentData[0].auto_increment||currentData[0].primary_key||currentData[0].default){tableObj.addRecord('bottom',true)} +tableObj.setRowValues(currentData.length-1,rowData) +tableObj.addRecord('bottom',false) +tableObj.deleteRecord() +added=true} +if(added){$target.trigger('change')} +return added} +DatabaseTable.prototype.addTimeStampColumns=function($target,columns) +{var existingColumns=this.getColumnNames($target),added=false +for(var index in columns){var column=columns[index] +if(existingColumns.indexOf(column)===-1){this.addTimeStampColumn($target,column) +added=true}} +if(added){$target.trigger('change')} +return added} +DatabaseTable.prototype.addTimeStampColumn=function($target,column){var tableObj=this.getTableControlObject($target),currentData=this.getTableData($target),rowData={name:column,type:'timestamp','default':null,allow_null:true} +tableObj.addRecord('bottom',true) +tableObj.setRowValues(currentData.length-1,rowData) +tableObj.addRecord('bottom',false) +tableObj.deleteRecord()} +DatabaseTable.prototype.updateTable=function(data){var tabsObject=this.getMasterTabsObject(),tabs=$('#builder-master-tabs').data('oc.tab'),tab=tabs.findByIdentifier(data.tabId) +tabsObject.updateTab(tab,data.tableName,data.tab) +this.onTableLoaded()} +$.oc.builder.entityControllers.databaseTable=DatabaseTable;}(window.jQuery);+function($){"use strict";if($.oc.builder===undefined) +$.oc.builder={} +if($.oc.builder.entityControllers===undefined) +$.oc.builder.entityControllers={} +var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype +var Model=function(indexController){Base.call(this,'model',indexController)} +Model.prototype=Object.create(BaseProto) +Model.prototype.constructor=Model +Model.prototype.cmdCreateModel=function(ev){var $target=$(ev.currentTarget) +$target.one('shown.oc.popup',this.proxy(this.onModelPopupShown)) +$target.popup({handler:'onModelLoadPopup'})} +Model.prototype.cmdApplyModelSettings=function(ev){var $form=$(ev.currentTarget),self=this +$.oc.stripeLoadIndicator.show() +$form.request('onModelSave').always($.oc.builder.indexController.hideStripeIndicatorProxy).done(function(data){$form.trigger('close.oc.popup') +self.applyModelSettingsDone(data)})} +Model.prototype.onModelPopupShown=function(ev,button,popup){$(popup).find('input[name=className]').focus()} +Model.prototype.applyModelSettingsDone=function(data){if(data.builderResponseData.registryData!==undefined){var registryData=data.builderResponseData.registryData +$.oc.builder.dataRegistry.set(registryData.pluginCode,'model-classes',null,registryData.models)}} +$.oc.builder.entityControllers.model=Model;}(window.jQuery);+function($){"use strict";if($.oc.builder===undefined) +$.oc.builder={} +if($.oc.builder.entityControllers===undefined) +$.oc.builder.entityControllers={} +var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype +var ModelForm=function(indexController){Base.call(this,'modelForm',indexController)} +ModelForm.prototype=Object.create(BaseProto) +ModelForm.prototype.constructor=ModelForm +ModelForm.prototype.cmdCreateForm=function(ev){var $link=$(ev.currentTarget),data={model_class:$link.data('modelClass')} +this.indexController.openOrLoadMasterTab($link,'onModelFormCreateOrOpen',this.newTabId(),data)} +ModelForm.prototype.cmdSaveForm=function(ev){var $target=$(ev.currentTarget),$form=$target.closest('form'),$rootContainer=$('[data-root-control-wrapper] > [data-control-container]',$form),$inspectorContainer=$form.find('.inspector-container'),controls=$.oc.builder.formbuilder.domToPropertyJson.convert($rootContainer.get(0)) +if(!$.oc.inspector.manager.applyValuesFromContainer($inspectorContainer)){return} +if(controls===false){$.oc.flashMsg({'text':$.oc.builder.formbuilder.domToPropertyJson.getLastError(),'class':'error','interval':5}) +return} +var data={controls:controls} +$target.request('onModelFormSave',{data:data}).done(this.proxy(this.saveFormDone))} +ModelForm.prototype.cmdAddDatabaseFields=function(ev){var $target=$(ev.currentTarget) +var $placeholder=this.getMasterTabsActivePane().find('.builder-control-list .control.placeholder:first')[0] +var fields=$target.find('.control-table').data('oc.table').dataSource.data.filter(function(column){return column.add}).reverse() +$target.closest('.control-popup').data('oc.popup').hide() +$.oc.stripeLoadIndicator.show() +function addField(field){return function(){var defer=$.Deferred() +$.oc.builder.formbuilder.controller.addControlToPlaceholder($placeholder,field.type,field.label?field.label:field.column,false,field.column).always(function(){defer.resolve()}) +return defer.promise()};} +var allFields=$.when({}) +$.each(fields,function(index,field){allFields=allFields.then(addField(field))});$.when(allFields).always($.oc.builder.indexController.hideStripeIndicatorProxy)} +ModelForm.prototype.cmdOpenForm=function(ev){var form=$(ev.currentTarget).data('form'),model=$(ev.currentTarget).data('modelClass') +this.indexController.openOrLoadMasterTab($(ev.target),'onModelFormCreateOrOpen',this.makeTabId(model+'-'+form),{file_name:form,model_class:model})} +ModelForm.prototype.cmdDeleteForm=function(ev){var $target=$(ev.currentTarget) +$.oc.confirm($target.data('confirm'),this.proxy(this.deleteConfirmed))} +ModelForm.prototype.cmdAddControl=function(ev){$.oc.builder.formbuilder.controlPalette.addControl(ev)} +ModelForm.prototype.cmdUndockControlPalette=function(ev){$.oc.builder.formbuilder.controlPalette.undockFromContainer(ev)} +ModelForm.prototype.cmdDockControlPalette=function(ev){$.oc.builder.formbuilder.controlPalette.dockToContainer(ev)} +ModelForm.prototype.cmdCloseControlPalette=function(ev){$.oc.builder.formbuilder.controlPalette.closeInContainer(ev)} +ModelForm.prototype.saveFormDone=function(data){if(data['builderResponseData']===undefined){throw new Error('Invalid response data')} +var $masterTabPane=this.getMasterTabsActivePane() +$masterTabPane.find('input[name=file_name]').val(data.builderResponseData.builderObjectName) +this.updateMasterTabIdAndTitle($masterTabPane,data.builderResponseData) +this.unhideFormDeleteButton($masterTabPane) +this.getModelList().fileList('markActive',data.builderResponseData.tabId) +this.getIndexController().unchangeTab($masterTabPane) +this.updateDataRegistry(data)} +ModelForm.prototype.updateDataRegistry=function(data){if(data.builderResponseData.registryData!==undefined){var registryData=data.builderResponseData.registryData +$.oc.builder.dataRegistry.set(registryData.pluginCode,'model-forms',registryData.modelClass,registryData.forms)}} +ModelForm.prototype.deleteConfirmed=function(){var $masterTabPane=this.getMasterTabsActivePane(),$form=$masterTabPane.find('form') +$.oc.stripeLoadIndicator.show() +$form.request('onModelFormDelete').always($.oc.builder.indexController.hideStripeIndicatorProxy).done(this.proxy(this.deleteDone))} +ModelForm.prototype.deleteDone=function(data){var $masterTabPane=this.getMasterTabsActivePane() +this.getIndexController().unchangeTab($masterTabPane) +this.forceCloseTab($masterTabPane) +this.updateDataRegistry(data)} +ModelForm.prototype.getModelList=function(){return $('#layout-side-panel form[data-content-id=models] [data-control=filelist]')} +$.oc.builder.entityControllers.modelForm=ModelForm;}(window.jQuery);+function($){"use strict";if($.oc.builder===undefined) +$.oc.builder={} +if($.oc.builder.entityControllers===undefined) +$.oc.builder.entityControllers={} +var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype +var ModelList=function(indexController){this.cachedModelFieldsPromises={} +Base.call(this,'modelList',indexController)} +ModelList.prototype=Object.create(BaseProto) +ModelList.prototype.constructor=ModelList +ModelList.prototype.registerHandlers=function(){$(document).on('autocompleteitems.oc.table','form[data-sub-entity="model-list"] [data-control=table]',this.proxy(this.onAutocompleteItems))} +ModelList.prototype.cmdCreateList=function(ev){var $link=$(ev.currentTarget),data={model_class:$link.data('modelClass')} +var result=this.indexController.openOrLoadMasterTab($link,'onModelListCreateOrOpen',this.newTabId(),data) +if(result!==false){result.done(this.proxy(this.onListLoaded,this))}} +ModelList.prototype.cmdSaveList=function(ev){var $target=$(ev.currentTarget),$form=$target.closest('form') +if(!this.validateTable($target)){return} +$target.request('onModelListSave',{data:{columns:this.getTableData($target)}}).done(this.proxy(this.saveListDone))} +ModelList.prototype.cmdOpenList=function(ev){var list=$(ev.currentTarget).data('list'),model=$(ev.currentTarget).data('modelClass') +var result=this.indexController.openOrLoadMasterTab($(ev.target),'onModelListCreateOrOpen',this.makeTabId(model+'-'+list),{file_name:list,model_class:model}) +if(result!==false){result.done(this.proxy(this.onListLoaded,this))}} +ModelList.prototype.cmdDeleteList=function(ev){var $target=$(ev.currentTarget) +$.oc.confirm($target.data('confirm'),this.proxy(this.deleteConfirmed))} +ModelList.prototype.cmdAddDatabaseColumns=function(ev){var $target=$(ev.currentTarget) +$.oc.stripeLoadIndicator.show() +$target.request('onModelListLoadDatabaseColumns').done(this.proxy(this.databaseColumnsLoaded)).always($.oc.builder.indexController.hideStripeIndicatorProxy)} +ModelList.prototype.saveListDone=function(data){if(data['builderResponseData']===undefined){throw new Error('Invalid response data')} +var $masterTabPane=this.getMasterTabsActivePane() +$masterTabPane.find('input[name=file_name]').val(data.builderResponseData.builderObjectName) +this.updateMasterTabIdAndTitle($masterTabPane,data.builderResponseData) +this.unhideFormDeleteButton($masterTabPane) +this.getModelList().fileList('markActive',data.builderResponseData.tabId) +this.getIndexController().unchangeTab($masterTabPane) +this.updateDataRegistry(data)} +ModelList.prototype.deleteConfirmed=function(){var $masterTabPane=this.getMasterTabsActivePane(),$form=$masterTabPane.find('form') +$.oc.stripeLoadIndicator.show() +$form.request('onModelListDelete').always($.oc.builder.indexController.hideStripeIndicatorProxy).done(this.proxy(this.deleteDone))} +ModelList.prototype.deleteDone=function(data){var $masterTabPane=this.getMasterTabsActivePane() +this.getIndexController().unchangeTab($masterTabPane) +this.forceCloseTab($masterTabPane) +this.updateDataRegistry(data)} +ModelList.prototype.getTableControlObject=function($target){var $form=$target.closest('form'),$table=$form.find('[data-control=table]'),tableObj=$table.data('oc.table') +if(!tableObj){throw new Error('Table object is not found on the model list tab')} +return tableObj} +ModelList.prototype.getModelList=function(){return $('#layout-side-panel form[data-content-id=models] [data-control=filelist]')} +ModelList.prototype.validateTable=function($target){var tableObj=this.getTableControlObject($target) +tableObj.unfocusTable() +return tableObj.validate()} +ModelList.prototype.getTableData=function($target){var tableObj=this.getTableControlObject($target) +return tableObj.dataSource.getAllData()} +ModelList.prototype.loadModelFields=function(table,callback){var $form=$(table).closest('form'),modelClass=$form.find('input[name=model_class]').val(),cachedFields=$form.data('oc.model-field-cache') +if(cachedFields!==undefined){callback(cachedFields) +return} +if(this.cachedModelFieldsPromises[modelClass]===undefined){this.cachedModelFieldsPromises[modelClass]=$form.request('onModelFormGetModelFields',{data:{'as_plain_list':1}})} +if(callback===undefined){return} +this.cachedModelFieldsPromises[modelClass].done(function(data){$form.data('oc.model-field-cache',data.responseData.options) +callback(data.responseData.options)})} +ModelList.prototype.updateDataRegistry=function(data){if(data.builderResponseData.registryData!==undefined){var registryData=data.builderResponseData.registryData +$.oc.builder.dataRegistry.set(registryData.pluginCode,'model-lists',registryData.modelClass,registryData.lists) +$.oc.builder.dataRegistry.clearCache(registryData.pluginCode,'plugin-lists')}} +ModelList.prototype.databaseColumnsLoaded=function(data){if(!$.isArray(data.responseData.columns)){alert('Invalid server response')} +var $masterTabPane=this.getMasterTabsActivePane(),$form=$masterTabPane.find('form'),existingColumns=this.getColumnNames($form),columnsAdded=false +for(var i in data.responseData.columns){var column=data.responseData.columns[i],type=this.mapType(column.type) +if($.inArray(column.name,existingColumns)!==-1){continue} +this.addColumn($form,column.name,type) +columnsAdded=true} +if(!columnsAdded){alert($form.attr('data-lang-all-database-columns-exist'))} +else{$form.trigger('change')}} +ModelList.prototype.mapType=function(type){switch(type){case'integer':return'number' +case'timestamp':return'datetime' +default:return'text'}} +ModelList.prototype.addColumn=function($target,column,type){var tableObj=this.getTableControlObject($target),currentData=this.getTableData($target),rowData={field:column,label:column,type:type} +tableObj.addRecord('bottom',true) +tableObj.setRowValues(currentData.length-1,rowData) +tableObj.addRecord('bottom',false) +tableObj.deleteRecord()} +ModelList.prototype.getColumnNames=function($target){var tableObj=this.getTableControlObject($target) +tableObj.unfocusTable() +var data=this.getTableData($target),result=[] +for(var index in data){if(data[index].field!==undefined){result.push($.trim(data[index].field))}} +return result} +ModelList.prototype.onAutocompleteItems=function(ev,data){if(data.columnConfiguration.fillFrom==='model-fields'){ev.preventDefault() +this.loadModelFields(ev.target,data.callback) +return false}} +ModelList.prototype.onListLoaded=function(){$(document).trigger('render') +var $masterTabPane=this.getMasterTabsActivePane(),$form=$masterTabPane.find('form'),$toolbar=$masterTabPane.find('div[data-control=table] div.toolbar'),$button=$('') +$button.text($form.attr('data-lang-add-database-columns'));$toolbar.append($button)} +$.oc.builder.entityControllers.modelList=ModelList;}(window.jQuery);+function($){"use strict";if($.oc.builder===undefined) +$.oc.builder={} +if($.oc.builder.entityControllers===undefined) +$.oc.builder.entityControllers={} +var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype +var Permission=function(indexController){Base.call(this,'permissions',indexController)} +Permission.prototype=Object.create(BaseProto) +Permission.prototype.constructor=Permission +Permission.prototype.registerHandlers=function(){this.indexController.$masterTabs.on('oc.tableNewRow',this.proxy(this.onTableRowCreated))} +Permission.prototype.cmdOpenPermissions=function(ev){var currentPlugin=this.getSelectedPlugin() +if(!currentPlugin){alert('Please select a plugin first') +return} +this.indexController.openOrLoadMasterTab($(ev.target),'onPermissionsOpen',this.makeTabId(currentPlugin))} +Permission.prototype.cmdSavePermissions=function(ev){var $target=$(ev.currentTarget),$form=$target.closest('form') +if(!this.validateTable($target)){return} +$target.request('onPermissionsSave',{data:{permissions:this.getTableData($target)}}).done(this.proxy(this.savePermissionsDone))} +Permission.prototype.getTableControlObject=function($target){var $form=$target.closest('form'),$table=$form.find('[data-control=table]'),tableObj=$table.data('oc.table') +if(!tableObj){throw new Error('Table object is not found on permissions tab')} +return tableObj} +Permission.prototype.validateTable=function($target){var tableObj=this.getTableControlObject($target) +tableObj.unfocusTable() +return tableObj.validate()} +Permission.prototype.getTableData=function($target){var tableObj=this.getTableControlObject($target) +return tableObj.dataSource.getAllData()} +Permission.prototype.savePermissionsDone=function(data){if(data['builderResponseData']===undefined){throw new Error('Invalid response data')} +var $masterTabPane=this.getMasterTabsActivePane() +this.getIndexController().unchangeTab($masterTabPane) +$.oc.builder.dataRegistry.clearCache(data.builderResponseData.pluginCode,'permissions')} +Permission.prototype.onTableRowCreated=function(ev,recordData){var $target=$(ev.target) +if($target.data('alias')!='permissions'){return} +var $form=$target.closest('form') +if($form.data('entity')!='permissions'){return} +var pluginCode=$form.find('input[name=plugin_code]').val() +recordData.permission=pluginCode.toLowerCase()+'.';} +$.oc.builder.entityControllers.permission=Permission;}(window.jQuery);+function($){"use strict";if($.oc.builder===undefined) +$.oc.builder={} +if($.oc.builder.entityControllers===undefined) +$.oc.builder.entityControllers={} +var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype +var Menus=function(indexController){Base.call(this,'menus',indexController)} +Menus.prototype=Object.create(BaseProto) +Menus.prototype.constructor=Menus +Menus.prototype.cmdOpenMenus=function(ev){var currentPlugin=this.getSelectedPlugin() +if(!currentPlugin){alert('Please select a plugin first') +return} +this.indexController.openOrLoadMasterTab($(ev.target),'onMenusOpen',this.makeTabId(currentPlugin))} +Menus.prototype.cmdSaveMenus=function(ev){var $target=$(ev.currentTarget),$form=$target.closest('form'),$inspectorContainer=$form.find('.inspector-container') +if(!$.oc.inspector.manager.applyValuesFromContainer($inspectorContainer)){return} +var menus=$.oc.builder.menubuilder.controller.getJson($form.get(0)) +$target.request('onMenusSave',{data:{menus:menus}}).done(this.proxy(this.saveMenusDone))} +Menus.prototype.cmdAddMainMenuItem=function(ev){$.oc.builder.menubuilder.controller.addMainMenuItem(ev)} +Menus.prototype.cmdAddSideMenuItem=function(ev){$.oc.builder.menubuilder.controller.addSideMenuItem(ev)} +Menus.prototype.cmdDeleteMenuItem=function(ev){$.oc.builder.menubuilder.controller.deleteMenuItem(ev)} +Menus.prototype.saveMenusDone=function(data){if(data['builderResponseData']===undefined){throw new Error('Invalid response data')} +var $masterTabPane=this.getMasterTabsActivePane() +this.getIndexController().unchangeTab($masterTabPane)} +$.oc.builder.entityControllers.menus=Menus;}(window.jQuery);+function($){"use strict";if($.oc.builder===undefined) +$.oc.builder={} +if($.oc.builder.entityControllers===undefined) +$.oc.builder.entityControllers={} +var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype +var Version=function(indexController){Base.call(this,'version',indexController) +this.hiddenHints={}} +Version.prototype=Object.create(BaseProto) +Version.prototype.constructor=Version +Version.prototype.cmdCreateVersion=function(ev){var $link=$(ev.currentTarget),versionType=$link.data('versionType') +this.indexController.openOrLoadMasterTab($link,'onVersionCreateOrOpen',this.newTabId(),{version_type:versionType})} +Version.prototype.cmdSaveVersion=function(ev){var $target=$(ev.currentTarget),$form=$target.closest('form') +$target.request('onVersionSave').done(this.proxy(this.saveVersionDone))} +Version.prototype.cmdOpenVersion=function(ev){var versionNumber=$(ev.currentTarget).data('id'),pluginCode=$(ev.currentTarget).data('pluginCode') +this.indexController.openOrLoadMasterTab($(ev.target),'onVersionCreateOrOpen',this.makeTabId(pluginCode+'-'+versionNumber),{original_version:versionNumber})} +Version.prototype.cmdDeleteVersion=function(ev){var $target=$(ev.currentTarget) +$.oc.confirm($target.data('confirm'),this.proxy(this.deleteConfirmed))} +Version.prototype.cmdApplyVersion=function(ev){var $target=$(ev.currentTarget),$pane=$target.closest('div.tab-pane'),self=this +this.showHintPopup($pane,'builder-version-apply',function(){$target.request('onVersionApply').done(self.proxy(self.applyVersionDone))})} +Version.prototype.cmdRollbackVersion=function(ev){var $target=$(ev.currentTarget),$pane=$target.closest('div.tab-pane'),self=this +this.showHintPopup($pane,'builder-version-rollback',function(){$target.request('onVersionRollback').done(self.proxy(self.rollbackVersionDone))})} +Version.prototype.saveVersionDone=function(data){if(data['builderResponseData']===undefined){throw new Error('Invalid response data')} +var $masterTabPane=this.getMasterTabsActivePane() +this.updateUiAfterSave($masterTabPane,data) +if(!data.builderResponseData.isApplied){this.showSavedNotAppliedHint($masterTabPane)}} +Version.prototype.showSavedNotAppliedHint=function($masterTabPane){this.showHintPopup($masterTabPane,'builder-version-save-unapplied')} +Version.prototype.showHintPopup=function($masterTabPane,code,callback){if(this.getDontShowHintAgain(code,$masterTabPane)){if(callback){callback.apply(this)} +return} +$masterTabPane.one('hide.oc.popup',this.proxy(this.onHintPopupHide)) +if(callback){$masterTabPane.one('shown.oc.popup',function(ev,$element,$modal){$modal.find('form').one('submit',function(ev){callback.apply(this) +ev.preventDefault() +$(ev.target).trigger('close.oc.popup') +return false})})} +$masterTabPane.popup({content:this.getPopupContent($masterTabPane,code)})} +Version.prototype.onHintPopupHide=function(ev,$element,$modal){var cbValue=$modal.find('input[type=checkbox][name=dont_show_again]').is(':checked'),code=$modal.find('input[type=hidden][name=hint_code]').val() +$modal.find('form').off('submit') +if(!cbValue){return} +var $form=this.getMasterTabsActivePane().find('form[data-entity="versions"]') +$form.request('onHideBackendHint',{data:{name:code}}) +this.setDontShowHintAgain(code)} +Version.prototype.setDontShowHintAgain=function(code){this.hiddenHints[code]=true} +Version.prototype.getDontShowHintAgain=function(code,$pane){if(this.hiddenHints[code]!==undefined){return this.hiddenHints[code]} +return $pane.find('input[type=hidden][data-hint-hidden="'+code+'"]').val()=="true"} +Version.prototype.getPopupContent=function($pane,code){var template=$pane.find('script[data-version-hint-template="'+code+'"]') +if(template.length===0){throw new Error('Version popup template not found: '+code)} +return template.html()} +Version.prototype.updateUiAfterSave=function($masterTabPane,data){$masterTabPane.find('input[name=original_version]').val(data.builderResponseData.savedVersion) +this.updateMasterTabIdAndTitle($masterTabPane,data.builderResponseData) +this.unhideFormDeleteButton($masterTabPane) +this.getVersionList().fileList('markActive',data.builderResponseData.tabId) +this.getIndexController().unchangeTab($masterTabPane)} +Version.prototype.deleteConfirmed=function(){var $masterTabPane=this.getMasterTabsActivePane(),$form=$masterTabPane.find('form') +$.oc.stripeLoadIndicator.show() +$form.request('onVersionDelete').always($.oc.builder.indexController.hideStripeIndicatorProxy).done(this.proxy(this.deleteDone))} +Version.prototype.deleteDone=function(){var $masterTabPane=this.getMasterTabsActivePane() +this.getIndexController().unchangeTab($masterTabPane) +this.forceCloseTab($masterTabPane)} +Version.prototype.applyVersionDone=function(data){if(data['builderResponseData']===undefined){throw new Error('Invalid response data')} +var $masterTabPane=this.getMasterTabsActivePane() +this.updateUiAfterSave($masterTabPane,data) +this.updateVersionsButtons()} +Version.prototype.rollbackVersionDone=function(data){if(data['builderResponseData']===undefined){throw new Error('Invalid response data')} +var $masterTabPane=this.getMasterTabsActivePane() +this.updateUiAfterSave($masterTabPane,data) +this.updateVersionsButtons()} +Version.prototype.getVersionList=function(){return $('#layout-side-panel form[data-content-id=version] [data-control=filelist]')} +Version.prototype.updateVersionsButtons=function(){var tabsObject=this.getMasterTabsObject(),$tabs=tabsObject.$tabsContainer.find('> li'),$versionList=this.getVersionList() +for(var i=$tabs.length-1;i>=0;i--){var $tab=$($tabs[i]),tabId=$tab.data('tabId') +if(!tabId||String(tabId).length==0){continue} +var $versionLi=$versionList.find('li[data-id="'+tabId+'"]') +if(!$versionLi.length){continue} +var isApplied=$versionLi.data('applied'),$pane=tabsObject.findPaneFromTab($tab) +if(isApplied){$pane.find('[data-builder-command="version:cmdApplyVersion"]').addClass('hide oc-hide') +$pane.find('[data-builder-command="version:cmdRollbackVersion"]').removeClass('hide oc-hide')} +else{$pane.find('[data-builder-command="version:cmdApplyVersion"]').removeClass('hide oc-hide') +$pane.find('[data-builder-command="version:cmdRollbackVersion"]').addClass('hide oc-hide')}}} +$.oc.builder.entityControllers.version=Version;}(window.jQuery);+function($){"use strict";if($.oc.builder===undefined) +$.oc.builder={} +if($.oc.builder.entityControllers===undefined) +$.oc.builder.entityControllers={} +var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype +var Localization=function(indexController){Base.call(this,'localization',indexController)} +Localization.prototype=Object.create(BaseProto) +Localization.prototype.constructor=Localization +Localization.prototype.cmdCreateLanguage=function(ev){this.indexController.openOrLoadMasterTab($(ev.target),'onLanguageCreateOrOpen',this.newTabId())} +Localization.prototype.cmdOpenLanguage=function(ev){var language=$(ev.currentTarget).data('id'),pluginCode=$(ev.currentTarget).data('pluginCode') +this.indexController.openOrLoadMasterTab($(ev.target),'onLanguageCreateOrOpen',this.makeTabId(pluginCode+'-'+language),{original_language:language})} +Localization.prototype.cmdSaveLanguage=function(ev){var $target=$(ev.currentTarget),$form=$target.closest('form') +$target.request('onLanguageSave').done(this.proxy(this.saveLanguageDone))} +Localization.prototype.cmdDeleteLanguage=function(ev){var $target=$(ev.currentTarget) +$.oc.confirm($target.data('confirm'),this.proxy(this.deleteConfirmed))} +Localization.prototype.cmdCopyMissingStrings=function(ev){var $form=$(ev.currentTarget),language=$form.find('select[name=language]').val(),$masterTabPane=this.getMasterTabsActivePane() +$form.trigger('close.oc.popup') +$.oc.stripeLoadIndicator.show() +$masterTabPane.find('form').request('onLanguageCopyStringsFrom',{data:{copy_from:language}}).always($.oc.builder.indexController.hideStripeIndicatorProxy).done(this.proxy(this.copyStringsFromDone))} +Localization.prototype.languageUpdated=function(plugin){var languageForm=this.findDefaultLanguageForm(plugin) +if(!languageForm){return} +var $languageForm=$(languageForm) +if(!$languageForm.hasClass('oc-data-changed')){this.updateLanguageFromServer($languageForm)} +else{this.mergeLanguageFromServer($languageForm)}} +Localization.prototype.updateOnScreenStrings=function(plugin){var stringElements=document.body.querySelectorAll('span[data-localization-key][data-plugin="'+plugin+'"]') +$.oc.builder.dataRegistry.get($('#builder-plugin-selector-panel form'),plugin,'localization',null,function(data){for(var i=stringElements.length-1;i>=0;i--){var stringElement=stringElements[i],stringKey=stringElement.getAttribute('data-localization-key') +if(data[stringKey]!==undefined){stringElement.textContent=data[stringKey]} +else{stringElement.textContent=stringKey}}})} +Localization.prototype.saveLanguageDone=function(data){if(data['builderResponseData']===undefined){throw new Error('Invalid response data')} +var $masterTabPane=this.getMasterTabsActivePane() +$masterTabPane.find('input[name=original_language]').val(data.builderResponseData.language) +this.updateMasterTabIdAndTitle($masterTabPane,data.builderResponseData) +this.unhideFormDeleteButton($masterTabPane) +this.getLanguageList().fileList('markActive',data.builderResponseData.tabId) +this.getIndexController().unchangeTab($masterTabPane) +if(data.builderResponseData.registryData!==undefined){var registryData=data.builderResponseData.registryData +$.oc.builder.dataRegistry.set(registryData.pluginCode,'localization',null,registryData.strings,{suppressLanguageEditorUpdate:true}) +$.oc.builder.dataRegistry.set(registryData.pluginCode,'localization','sections',registryData.sections)}} +Localization.prototype.getLanguageList=function(){return $('#layout-side-panel form[data-content-id=localization] [data-control=filelist]')} +Localization.prototype.getCodeEditor=function($tab){return $tab.find('div[data-field-name=strings] div[data-control=codeeditor]').data('oc.codeEditor').editor} +Localization.prototype.deleteConfirmed=function(){var $masterTabPane=this.getMasterTabsActivePane(),$form=$masterTabPane.find('form') +$.oc.stripeLoadIndicator.show() +$form.request('onLanguageDelete').always($.oc.builder.indexController.hideStripeIndicatorProxy).done(this.proxy(this.deleteDone))} +Localization.prototype.deleteDone=function(){var $masterTabPane=this.getMasterTabsActivePane() +this.getIndexController().unchangeTab($masterTabPane) +this.forceCloseTab($masterTabPane)} +Localization.prototype.copyStringsFromDone=function(data){if(data['builderResponseData']===undefined){throw new Error('Invalid response data')} +var responseData=data.builderResponseData,$masterTabPane=this.getMasterTabsActivePane(),$form=$masterTabPane.find('form'),codeEditor=this.getCodeEditor($masterTabPane),newStringMessage=$form.data('newStringMessage'),mismatchMessage=$form.data('structureMismatch') +codeEditor.getSession().setValue(responseData.strings) +var annotations=[] +for(var i=responseData.updatedLines.length-1;i>=0;i--){var line=responseData.updatedLines[i] +annotations.push({row:line,column:0,text:newStringMessage,type:'warning'})} +codeEditor.getSession().setAnnotations(annotations) +if(responseData.mismatch){$.oc.alert(mismatchMessage)}} +Localization.prototype.findDefaultLanguageForm=function(plugin){var forms=document.body.querySelectorAll('form[data-entity=localization]') +for(var i=forms.length-1;i>=0;i--){var form=forms[i],pluginInput=form.querySelector('input[name=plugin_code]'),languageInput=form.querySelector('input[name=original_language]') +if(!pluginInput||pluginInput.value!=plugin){continue} +if(!languageInput){continue} +if(form.getAttribute('data-default-language')==languageInput.value){return form}} +return null} +Localization.prototype.updateLanguageFromServer=function($languageForm){var self=this +$languageForm.request('onLanguageGetStrings').done(function(data){self.updateLanguageFromServerDone($languageForm,data)})} +Localization.prototype.updateLanguageFromServerDone=function($languageForm,data){if(data['builderResponseData']===undefined){throw new Error('Invalid response data')} +var responseData=data.builderResponseData,$tabPane=$languageForm.closest('.tab-pane'),codeEditor=this.getCodeEditor($tabPane) +if(!responseData.strings){return} +codeEditor.getSession().setValue(responseData.strings) +this.unmodifyTab($tabPane)} +Localization.prototype.mergeLanguageFromServer=function($languageForm){var language=$languageForm.find('input[name=original_language]').val(),self=this +$languageForm.request('onLanguageCopyStringsFrom',{data:{copy_from:language}}).done(function(data){self.mergeLanguageFromServerDone($languageForm,data)})} +Localization.prototype.mergeLanguageFromServerDone=function($languageForm,data){if(data['builderResponseData']===undefined){throw new Error('Invalid response data')} +var responseData=data.builderResponseData,$tabPane=$languageForm.closest('.tab-pane'),codeEditor=this.getCodeEditor($tabPane) +codeEditor.getSession().setValue(responseData.strings) +codeEditor.getSession().setAnnotations([])} +$.oc.builder.entityControllers.localization=Localization;}(window.jQuery);+function($){"use strict";if($.oc.builder===undefined) +$.oc.builder={} +if($.oc.builder.entityControllers===undefined) +$.oc.builder.entityControllers={} +var Base=$.oc.builder.entityControllers.base,BaseProto=Base.prototype +var Controller=function(indexController){Base.call(this,'controller',indexController)} +Controller.prototype=Object.create(BaseProto) +Controller.prototype.constructor=Controller +Controller.prototype.cmdCreateController=function(ev){var $form=$(ev.currentTarget),self=this,pluginCode=$form.data('pluginCode'),behaviorsSelected=$form.find('input[name="behaviors[]"]:checked').length,promise=null +if(behaviorsSelected){promise=this.indexController.openOrLoadMasterTab($form,'onControllerCreate',this.makeTabId(pluginCode+'-new-controller'),{})} +else{promise=$form.request('onControllerCreate')} +promise.done(function(data){$form.trigger('close.oc.popup') +self.updateDataRegistry(data)}).always($.oc.builder.indexController.hideStripeIndicatorProxy)} +Controller.prototype.cmdOpenController=function(ev){var controller=$(ev.currentTarget).data('id'),pluginCode=$(ev.currentTarget).data('pluginCode') +this.indexController.openOrLoadMasterTab($(ev.target),'onControllerOpen',this.makeTabId(pluginCode+'-'+controller),{controller:controller})} +Controller.prototype.cmdSaveController=function(ev){var $target=$(ev.currentTarget),$form=$target.closest('form'),$inspectorContainer=$form.find('.inspector-container') +if(!$.oc.inspector.manager.applyValuesFromContainer($inspectorContainer)){return} +$target.request('onControllerSave').done(this.proxy(this.saveControllerDone))} +Controller.prototype.saveControllerDone=function(data){if(data['builderResponseData']===undefined){throw new Error('Invalid response data')} +var $masterTabPane=this.getMasterTabsActivePane() +this.getIndexController().unchangeTab($masterTabPane)} +Controller.prototype.updateDataRegistry=function(data){if(data.builderResponseData.registryData!==undefined){var registryData=data.builderResponseData.registryData +$.oc.builder.dataRegistry.set(registryData.pluginCode,'controller-urls',null,registryData.urls)}} +Controller.prototype.getControllerList=function(){return $('#layout-side-panel form[data-content-id=controller] [data-control=filelist]')} +$.oc.builder.entityControllers.controller=Controller;}(window.jQuery);+function($){"use strict";if($.oc.builder===undefined) +$.oc.builder={} +var Base=$.oc.foundation.base,BaseProto=Base.prototype +var Builder=function(){Base.call(this) +this.$masterTabs=null +this.masterTabsObj=null +this.hideStripeIndicatorProxy=null +this.entityControllers={} +this.init()} +Builder.prototype=Object.create(BaseProto) +Builder.prototype.constructor=Builder +Builder.prototype.dispose=function(){BaseProto.dispose.call(this)} +Builder.prototype.openOrLoadMasterTab=function($form,serverHandlerName,tabId,data){if(this.masterTabsObj.goTo(tabId)) +return false +var requestData=data===undefined?{}:data +$.oc.stripeLoadIndicator.show() +var promise=$form.request(serverHandlerName,{data:requestData}).done(this.proxy(this.addMasterTab)).always(this.hideStripeIndicatorProxy) +return promise} +Builder.prototype.getMasterTabActivePane=function(){return this.$masterTabs.find('> .tab-content > .tab-pane.active')} +Builder.prototype.unchangeTab=function($pane){$pane.find('form').trigger('unchange.oc.changeMonitor')} +Builder.prototype.triggerCommand=function(command,ev){var commandParts=command.split(':') +if(commandParts.length===2){var entity=commandParts[0],commandToExecute=commandParts[1] +if(this.entityControllers[entity]===undefined){throw new Error('Unknown entity type: '+entity)} +this.entityControllers[entity].invokeCommand(commandToExecute,ev)}} +Builder.prototype.init=function(){this.$masterTabs=$('#builder-master-tabs') +this.$sidePanel=$('#builder-side-panel') +this.masterTabsObj=this.$masterTabs.data('oc.tab') +this.hideStripeIndicatorProxy=this.proxy(this.hideStripeIndicator) +new $.oc.tabFormExpandControls(this.$masterTabs) +this.createEntityControllers() +this.registerHandlers()} +Builder.prototype.createEntityControllers=function(){for(var controller in $.oc.builder.entityControllers){if(controller=="base"){continue} +this.entityControllers[controller]=new $.oc.builder.entityControllers[controller](this)}} +Builder.prototype.registerHandlers=function(){$(document).on('click','[data-builder-command]',this.proxy(this.onCommand)) +$(document).on('submit','[data-builder-command]',this.proxy(this.onCommand)) +this.$masterTabs.on('changed.oc.changeMonitor',this.proxy(this.onFormChanged)) +this.$masterTabs.on('unchanged.oc.changeMonitor',this.proxy(this.onFormUnchanged)) +this.$masterTabs.on('shown.bs.tab',this.proxy(this.onTabShown)) +this.$masterTabs.on('afterAllClosed.oc.tab',this.proxy(this.onAllTabsClosed)) +this.$masterTabs.on('closed.oc.tab',this.proxy(this.onTabClosed)) +this.$masterTabs.on('autocompleteitems.oc.inspector',this.proxy(this.onDataRegistryItems)) +this.$masterTabs.on('dropdownoptions.oc.inspector',this.proxy(this.onDataRegistryItems)) +for(var controller in this.entityControllers){if(this.entityControllers[controller].registerHandlers!==undefined){this.entityControllers[controller].registerHandlers()}}} +Builder.prototype.hideStripeIndicator=function(){$.oc.stripeLoadIndicator.hide()} +Builder.prototype.addMasterTab=function(data){this.masterTabsObj.addTab(data.tabTitle,data.tab,data.tabId,'oc-'+data.tabIcon) +if(data.isNewRecord){var $masterTabPane=this.getMasterTabActivePane() +$masterTabPane.find('form').one('ready.oc.changeMonitor',this.proxy(this.onChangeMonitorReady))}} +Builder.prototype.updateModifiedCounter=function(){var counters={database:{menu:'database',count:0},models:{menu:'models',count:0},permissions:{menu:'permissions',count:0},menus:{menu:'menus',count:0},versions:{menu:'versions',count:0},localization:{menu:'localization',count:0},controller:{menu:'controllers',count:0}} +$('> div.tab-content > div.tab-pane[data-modified] > form',this.$masterTabs).each(function(){var entity=$(this).data('entity') +counters[entity].count++}) +$.each(counters,function(type,data){$.oc.sideNav.setCounter('builder/'+data.menu,data.count);})} +Builder.prototype.getFormPluginCode=function(formElement){var $form=$(formElement).closest('form'),$input=$form.find('input[name="plugin_code"]'),code=$input.val() +if(!code){throw new Error('Plugin code input is not found in the form.')} +return code} +Builder.prototype.setPageTitle=function(title){$.oc.layout.setPageTitle(title.length?(title+' | '):title)} +Builder.prototype.getFileLists=function(){return $('[data-control=filelist]',this.$sidePanel)} +Builder.prototype.dataToInspectorArray=function(data){var result=[] +for(var key in data){var item={title:data[key],value:key} +result.push(item)} +return result} +Builder.prototype.onCommand=function(ev){if(ev.currentTarget.tagName=='FORM'&&ev.type=='click'){return} +var command=$(ev.currentTarget).data('builderCommand') +this.triggerCommand(command,ev) +var $target=$(ev.currentTarget) +if(ev.currentTarget.tagName==='A'&&$target.attr('role')=='menuitem'&&$target.attr('href')=='javascript:;'){return} +ev.preventDefault() +return false} +Builder.prototype.onFormChanged=function(ev){$('.form-tabless-fields',ev.target).trigger('modified.oc.tab') +this.updateModifiedCounter()} +Builder.prototype.onFormUnchanged=function(ev){$('.form-tabless-fields',ev.target).trigger('unmodified.oc.tab') +this.updateModifiedCounter()} +Builder.prototype.onTabShown=function(ev){var $tabControl=$(ev.target).closest('[data-control=tab]') +if($tabControl.attr('id')!=this.$masterTabs.attr('id')){return} +var dataId=$(ev.target).closest('li').attr('data-tab-id'),title=$(ev.target).attr('title') +if(title){this.setPageTitle(title)} +this.getFileLists().fileList('markActive',dataId) +$(window).trigger('resize')} +Builder.prototype.onAllTabsClosed=function(ev){this.setPageTitle('') +this.getFileLists().fileList('markActive',null)} +Builder.prototype.onTabClosed=function(ev,tab,pane){$(pane).find('form').off('ready.oc.changeMonitor',this.proxy(this.onChangeMonitorReady)) +this.updateModifiedCounter()} +Builder.prototype.onChangeMonitorReady=function(ev){$(ev.target).trigger('change')} +Builder.prototype.onDataRegistryItems=function(ev,data){var self=this +if(data.propertyDefinition.fillFrom=='model-classes'||data.propertyDefinition.fillFrom=='model-forms'||data.propertyDefinition.fillFrom=='model-lists'||data.propertyDefinition.fillFrom=='controller-urls'||data.propertyDefinition.fillFrom=='model-columns'||data.propertyDefinition.fillFrom=='plugin-lists'||data.propertyDefinition.fillFrom=='permissions'){ev.preventDefault() +var subtype=null,subtypeProperty=data.propertyDefinition.subtypeFrom +if(subtypeProperty!==undefined){subtype=data.values[subtypeProperty]} +$.oc.builder.dataRegistry.get($(ev.target),this.getFormPluginCode(ev.target),data.propertyDefinition.fillFrom,subtype,function(response){data.callback({options:self.dataToInspectorArray(response)})})}} +$(document).ready(function(){$.oc.builder.indexController=new Builder()})}(window.jQuery);+function($){"use strict";if($.oc.builder===undefined) +$.oc.builder={} +var Base=$.oc.foundation.base,BaseProto=Base.prototype +var LocalizationInput=function(input,form,options){this.input=input +this.form=form +this.options=$.extend({},LocalizationInput.DEFAULTS,options) +this.disposed=false +this.initialized=false +this.newStringPopupMarkup=null +Base.call(this) +this.init()} +LocalizationInput.prototype=Object.create(BaseProto) +LocalizationInput.prototype.constructor=LocalizationInput +LocalizationInput.prototype.dispose=function(){this.unregisterHandlers() +this.form=null +this.options.beforePopupShowCallback=null +this.options.afterPopupHideCallback=null +this.options=null +this.disposed=true +this.newStringPopupMarkup=null +if(this.initialized){$(this.input).autocomplete('destroy')} +$(this.input).removeData('localization-input') +this.input=null +BaseProto.dispose.call(this)} +LocalizationInput.prototype.init=function(){if(!this.options.plugin){throw new Error('The options.plugin value should be set in the localization input object.')} +var $input=$(this.input) +$input.data('localization-input',this) +$input.attr('data-builder-localization-input','true') +$input.attr('data-builder-localization-plugin',this.options.plugin) +this.getContainer().addClass('localization-input-container') +this.registerHandlers() +this.loadDataAndBuild()} +LocalizationInput.prototype.buildAddLink=function(){var $container=this.getContainer() +if($container.find('a.localization-trigger').length>0){return} +var trigger=document.createElement('a') +trigger.setAttribute('class','oc-icon-plus localization-trigger') +trigger.setAttribute('href','#') +var pos=$container.position() +$(trigger).css({top:pos.top+4,right:7}) +$container.append(trigger)} +LocalizationInput.prototype.loadDataAndBuild=function(){this.showLoadingIndicator() +var result=$.oc.builder.dataRegistry.get(this.form,this.options.plugin,'localization',null,this.proxy(this.dataLoaded)),self=this +if(result){result.always(function(){self.hideLoadingIndicator()})}} +LocalizationInput.prototype.reload=function(){$.oc.builder.dataRegistry.get(this.form,this.options.plugin,'localization',null,this.proxy(this.dataLoaded))} +LocalizationInput.prototype.dataLoaded=function(data){if(this.disposed){return} +var $input=$(this.input),autocomplete=$input.data('autocomplete') +if(!autocomplete){this.hideLoadingIndicator() +var autocompleteOptions={source:this.preprocessData(data),matchWidth:true} +autocompleteOptions=$.extend(autocompleteOptions,this.options.autocompleteOptions) +$(this.input).autocomplete(autocompleteOptions) +this.initialized=true} +else{autocomplete.source=this.preprocessData(data)}} +LocalizationInput.prototype.preprocessData=function(data){var dataClone=$.extend({},data) +for(var key in dataClone){dataClone[key]=key+' - '+dataClone[key]} +return dataClone} +LocalizationInput.prototype.getContainer=function(){return $(this.input).closest('.autocomplete-container')} +LocalizationInput.prototype.showLoadingIndicator=function(){var $container=this.getContainer() +$container.addClass('loading-indicator-container size-small') +$container.loadIndicator()} +LocalizationInput.prototype.hideLoadingIndicator=function(){var $container=this.getContainer() +$container.loadIndicator('hide') +$container.loadIndicator('destroy') +$container.removeClass('loading-indicator-container')} +LocalizationInput.prototype.loadAndShowPopup=function(){if(this.newStringPopupMarkup===null){$.oc.stripeLoadIndicator.show() +$(this.input).request('onLanguageLoadAddStringForm').done(this.proxy(this.popupMarkupLoaded)).always(function(){$.oc.stripeLoadIndicator.hide()})} +else{this.showPopup()}} +LocalizationInput.prototype.popupMarkupLoaded=function(responseData){this.newStringPopupMarkup=responseData.markup +this.showPopup()} +LocalizationInput.prototype.showPopup=function(){var $input=$(this.input) +$input.popup({content:this.newStringPopupMarkup}) +var $content=$input.data('oc.popup').$content,$keyInput=$content.find('#language_string_key') +$.oc.builder.dataRegistry.get(this.form,this.options.plugin,'localization','sections',function(data){$keyInput.autocomplete({source:data,matchWidth:true})}) +$content.find('form').on('submit',this.proxy(this.onSubmitPopupForm))} +LocalizationInput.prototype.stringCreated=function(data){if(data.localizationData===undefined||data.registryData===undefined){throw new Error('Invalid server response.')} +var $input=$(this.input) +$input.val(data.localizationData.key) +$.oc.builder.dataRegistry.set(this.options.plugin,'localization',null,data.registryData.strings) +$.oc.builder.dataRegistry.set(this.options.plugin,'localization','sections',data.registryData.sections) +$input.data('oc.popup').hide() +$input.trigger('change')} +LocalizationInput.prototype.onSubmitPopupForm=function(ev){var $form=$(ev.target) +$.oc.stripeLoadIndicator.show() +$form.request('onLanguageCreateString',{data:{plugin_code:this.options.plugin}}).done(this.proxy(this.stringCreated)).always(function(){$.oc.stripeLoadIndicator.hide()}) +ev.preventDefault() +return false} +LocalizationInput.prototype.onPopupHidden=function(ev,link,popup){$(popup).find('#language_string_key').autocomplete('destroy') +$(popup).find('form').on('submit',this.proxy(this.onSubmitPopupForm)) +if(this.options.afterPopupHideCallback){this.options.afterPopupHideCallback()}} +LocalizationInput.updatePluginInputs=function(plugin){var inputs=document.body.querySelectorAll('input[data-builder-localization-input][data-builder-localization-plugin="'+plugin+'"]') +for(var i=inputs.length-1;i>=0;i--){$(inputs[i]).data('localization-input').reload()}} +LocalizationInput.prototype.unregisterHandlers=function(){this.input.removeEventListener('focus',this.proxy(this.onInputFocus)) +this.getContainer().off('click','a.localization-trigger',this.proxy(this.onTriggerClick)) +$(this.input).off('hidden.oc.popup',this.proxy(this.onPopupHidden))} +LocalizationInput.prototype.registerHandlers=function(){this.input.addEventListener('focus',this.proxy(this.onInputFocus)) +this.getContainer().on('click','a.localization-trigger',this.proxy(this.onTriggerClick)) +$(this.input).on('hidden.oc.popup',this.proxy(this.onPopupHidden))} +LocalizationInput.prototype.onInputFocus=function(){this.buildAddLink()} +LocalizationInput.prototype.onTriggerClick=function(ev){if(this.options.beforePopupShowCallback){this.options.beforePopupShowCallback()} +this.loadAndShowPopup() +ev.preventDefault() +return false} +LocalizationInput.DEFAULTS={plugin:null,autocompleteOptions:{},beforePopupShowCallback:null,afterPopupHideCallback:null} +$.oc.builder.localizationInput=LocalizationInput}(window.jQuery);+function($){"use strict";var Base=$.oc.inspector.propertyEditors.string,BaseProto=Base.prototype +var LocalizationEditor=function(inspector,propertyDefinition,containerCell,group){this.localizationInput=null +Base.call(this,inspector,propertyDefinition,containerCell,group)} +LocalizationEditor.prototype=Object.create(BaseProto) +LocalizationEditor.prototype.constructor=Base +LocalizationEditor.prototype.dispose=function(){this.removeLocalizationInput() +BaseProto.dispose.call(this)} +LocalizationEditor.prototype.build=function(){var container=document.createElement('div'),editor=document.createElement('input'),placeholder=this.propertyDefinition.placeholder!==undefined?this.propertyDefinition.placeholder:'',value=this.inspector.getPropertyValue(this.propertyDefinition.property) +editor.setAttribute('type','text') +editor.setAttribute('class','string-editor') +editor.setAttribute('placeholder',placeholder) +container.setAttribute('class','autocomplete-container') +if(value===undefined){value=this.propertyDefinition.default} +if(value===undefined){value=''} +editor.value=value +$.oc.foundation.element.addClass(this.containerCell,'text autocomplete') +container.appendChild(editor) +this.containerCell.appendChild(container) +this.buildLocalizationEditor()} +LocalizationEditor.prototype.buildLocalizationEditor=function(){this.localizationInput=new $.oc.builder.localizationInput(this.getInput(),this.getForm(),{plugin:this.getPluginCode(),beforePopupShowCallback:this.proxy(this.onPopupShown,this),afterPopupHideCallback:this.proxy(this.onPopupHidden,this)})} +LocalizationEditor.prototype.removeLocalizationInput=function(){this.localizationInput.dispose() +this.localizationInput=null} +LocalizationEditor.prototype.supportsExternalParameterEditor=function(){return false} +LocalizationEditor.prototype.registerHandlers=function(){BaseProto.registerHandlers.call(this) +$(this.getInput()).on('change',this.proxy(this.onInputKeyUp))} +LocalizationEditor.prototype.unregisterHandlers=function(){BaseProto.unregisterHandlers.call(this) +$(this.getInput()).off('change',this.proxy(this.onInputKeyUp))} +LocalizationEditor.prototype.getForm=function(){var inspectableElement=this.getRootSurface().getInspectableElement() +if(!inspectableElement){throw new Error('Cannot determine inspectable element in the Builder localization editor.')} +return $(inspectableElement).closest('form')} +LocalizationEditor.prototype.getPluginCode=function(){var $form=this.getForm(),$input=$form.find('input[name=plugin_code]') +if(!$input.length){throw new Error('The input "plugin_code" should be defined in the form in order to use the localization Inspector editor.')} +return $input.val()} +LocalizationEditor.prototype.onPopupShown=function(){this.getRootSurface().popupDisplayed()} +LocalizationEditor.prototype.onPopupHidden=function(){this.getRootSurface().popupHidden()} +$.oc.inspector.propertyEditors.builderLocalization=LocalizationEditor}(window.jQuery);+function($){"use strict";if($.oc.table===undefined) +throw new Error("The $.oc.table namespace is not defined. Make sure that the table.js script is loaded.");if($.oc.table.processor===undefined) +throw new Error("The $.oc.table.processor namespace is not defined. Make sure that the table.processor.base.js script is loaded.");var Base=$.oc.table.processor.string,BaseProto=Base.prototype +var LocalizationProcessor=function(tableObj,columnName,columnConfiguration){this.localizationInput=null +this.popupDisplayed=false +Base.call(this,tableObj,columnName,columnConfiguration)} +LocalizationProcessor.prototype=Object.create(BaseProto) +LocalizationProcessor.prototype.constructor=LocalizationProcessor +LocalizationProcessor.prototype.dispose=function(){this.removeLocalizationInput() +BaseProto.dispose.call(this)} +LocalizationProcessor.prototype.onUnfocus=function(){if(!this.activeCell||this.popupDisplayed) +return +this.removeLocalizationInput() +BaseProto.onUnfocus.call(this)} +LocalizationProcessor.prototype.onBeforePopupShow=function(){this.popupDisplayed=true} +LocalizationProcessor.prototype.onAfterPopupHide=function(){this.popupDisplayed=false} +LocalizationProcessor.prototype.renderCell=function(value,cellContentContainer){BaseProto.renderCell.call(this,value,cellContentContainer)} +LocalizationProcessor.prototype.buildEditor=function(cellElement,cellContentContainer,isClick){BaseProto.buildEditor.call(this,cellElement,cellContentContainer,isClick) +$.oc.foundation.element.addClass(cellContentContainer,'autocomplete-container') +this.buildLocalizationEditor()} +LocalizationProcessor.prototype.buildLocalizationEditor=function(){var input=this.getInput() +this.localizationInput=new $.oc.builder.localizationInput(input,$(input),{plugin:this.getPluginCode(input),beforePopupShowCallback:$.proxy(this.onBeforePopupShow,this),afterPopupHideCallback:$.proxy(this.onAfterPopupHide,this),autocompleteOptions:{menu:'',bodyContainer:true}})} +LocalizationProcessor.prototype.getInput=function(){if(!this.activeCell){return null} +return this.activeCell.querySelector('.string-input')} +LocalizationProcessor.prototype.getPluginCode=function(input){var $form=$(input).closest('form'),$input=$form.find('input[name=plugin_code]') +if(!$input.length){throw new Error('The input "plugin_code" should be defined in the form in order to use the localization table processor.')} +return $input.val()} +LocalizationProcessor.prototype.removeLocalizationInput=function(){if(!this.localizationInput){return} +this.localizationInput.dispose() +this.localizationInput=null} +$.oc.table.processor.builderLocalization=LocalizationProcessor;}(window.jQuery); \ No newline at end of file diff --git a/plugins/rainlab/builder/assets/js/build.js b/plugins/rainlab/builder/assets/js/build.js new file mode 100644 index 0000000..965eba0 --- /dev/null +++ b/plugins/rainlab/builder/assets/js/build.js @@ -0,0 +1,20 @@ +/* + +=require builder.dataregistry.js +=require builder.index.entity.base.js +=require builder.index.entity.plugin.js +=require builder.index.entity.databasetable.js +=require builder.index.entity.model.js +=require builder.index.entity.modelform.js +=require builder.index.entity.modellist.js +=require builder.index.entity.permission.js +=require builder.index.entity.menus.js +=require builder.index.entity.version.js +=require builder.index.entity.localization.js +=require builder.index.entity.controller.js +=require builder.index.js +=require builder.localizationinput.js +=require builder.inspector.editor.localization.js +=require builder.table.processor.localization.js + +*/ diff --git a/plugins/rainlab/builder/assets/js/builder.codelist.js b/plugins/rainlab/builder/assets/js/builder.codelist.js deleted file mode 100644 index 43064e7..0000000 --- a/plugins/rainlab/builder/assets/js/builder.codelist.js +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Code List - */ -+function ($) { "use strict"; - - var CodeList = function (form, alias) { - this.$form = $(form); - this.alias = alias; - - this.$form.on('ajaxSuccess', $.proxy(this.onAjaxSuccess, this)); - this.$form.on('click', 'ul.list > li.directory > a', $.proxy(this.onDirectoryClick, this)); - this.$form.on('click', 'ul.list > li.file > a', $.proxy(this.onFileClick, this)); - this.$form.on('click', 'p.parent > a', $.proxy(this.onDirectoryClick, this)); - this.$form.on('click', 'a[data-control=delete-asset]', $.proxy(this.onDeleteClick, this)); - this.$form.on('oc.list.setActiveItem', $.proxy(this.onSetActiveItem, this)); - - this.setupUploader(); - } - - // Event handlers - // ================= - - CodeList.prototype.onDirectoryClick = function(e) { - this.gotoDirectory( - $(e.currentTarget).data('path'), - $(e.currentTarget).parent().hasClass('parent') - ); - - return false; - } - - CodeList.prototype.gotoDirectory = function(path, gotoParent) { - var $container = $('div.list-container', this.$form), - self = this; - - if (gotoParent !== undefined && gotoParent) { - $container.addClass('goBackward'); - } - else { - $container.addClass('goForward'); - } - - $.oc.stripeLoadIndicator.show(); - this.$form.request(this.alias+'::onOpenDirectory', { - data: { - path: path, - d: 0.2 - }, - complete: function() { - self.updateUi() - $container.trigger('oc.scrollbar.gotoStart') - }, - error: function(jqXHR, textStatus, errorThrown) { - $container.removeClass('goForward goBackward') - alert(jqXHR.responseText.length ? jqXHR.responseText : jqXHR.statusText) - } - }).always(function(){ - $.oc.stripeLoadIndicator.hide() - }) - } - - CodeList.prototype.onDeleteClick = function(e) { - var $el = $(e.currentTarget), - self = this; - - if (!confirm($el.data('confirmation'))) { - return false; - } - - this.$form.request(this.alias+'::onDeleteFiles', { - success: function(data) { - if (data.error !== undefined && $.type(data.error) === 'string' && data.error.length) { - $.oc.flashMsg({text: data.error, 'class': 'error'}); - } - }, - complete: function() { - self.refresh(); - } - }); - - return false; - } - - CodeList.prototype.onAjaxSuccess = function() { - this.updateUi(); - } - - CodeList.prototype.onUploadFail = function(file, message) { - if (file.xhr.status === 413) { - message = 'Server rejected the file because it was too large, try increasing post_max_size'; - } - if (!message) { - message = 'Error uploading file'; - } - - $.oc.alert(message); - - this.refresh(); - } - - CodeList.prototype.onUploadSuccess = function(file, data) { - if (data !== 'success') { - $.oc.alert(data); - } - } - - CodeList.prototype.onUploadComplete = function(file, data) { - $.oc.stripeLoadIndicator.hide(); - this.refresh(); - } - - CodeList.prototype.onUploadStart = function() { - $.oc.stripeLoadIndicator.show(); - } - - CodeList.prototype.onFileClick = function(event) { - var $link = $(event.currentTarget), - $li = $link.parent(); - - var e = $.Event('open.oc.list', {relatedTarget: $li.get(0), clickEvent: event}); - this.$form.trigger(e, this); - - if (e.isDefaultPrevented()) { - return false; - } - } - - CodeList.prototype.onSetActiveItem = function(event, dataId) { - $('ul li.file', this.$form).removeClass('active'); - if (dataId) { - $('ul li.file[data-id="'+dataId+'"]', this.$form).addClass('active'); - } - } - - // Service functions - // ================= - - CodeList.prototype.updateUi = function() { - $('button[data-control=asset-tools]', self.$form).trigger('oc.triggerOn.update'); - } - - CodeList.prototype.refresh = function() { - var self = this; - - this.$form.request(this.alias+'::onRefresh', { - complete: function() { - self.updateUi(); - } - }); - } - - CodeList.prototype.setupUploader = function() { - var self = this, - $link = $('[data-control="upload-assets"]', this.$form), - uploaderOptions = { - method: 'POST', - url: window.location, - paramName: 'file_data', - previewsContainer: $('
').get(0), - clickable: $link.get(0), - timeout: 0, - headers: {} - }; - - // Add CSRF token to headers - var token = $('meta[name="csrf-token"]').attr('content'); - if (token) { - uploaderOptions.headers['X-CSRF-TOKEN'] = token; - } - - var dropzone = new Dropzone($('
').get(0), uploaderOptions); - dropzone.on('error', $.proxy(self.onUploadFail, self)); - dropzone.on('success', $.proxy(self.onUploadSuccess, self)); - dropzone.on('complete', $.proxy(self.onUploadComplete, self)); - dropzone.on('sending', function(file, xhr, formData) { - $.each(self.$form.serializeArray(), function (index, field) { - formData.append(field.name, field.value); - }); - xhr.setRequestHeader('X-OCTOBER-REQUEST-HANDLER', self.alias + '::onUpload'); - self.onUploadStart(); - }); - } - - $(document).on('render', function() { - var $container = $('#code-list-container'); - if ($container.data('oc.codeListAttached') === true) { - return; - } - - $container.data('oc.codeListAttached', true); - new CodeList( - $container.closest('form'), - $container.data('alias') - ); - }); - -}(window.jQuery); diff --git a/plugins/rainlab/builder/assets/js/builder.index.entity.code.js b/plugins/rainlab/builder/assets/js/builder.index.entity.code.js deleted file mode 100644 index 4544233..0000000 --- a/plugins/rainlab/builder/assets/js/builder.index.entity.code.js +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Builder Index controller Code entity controller - */ -+function ($) { "use strict"; - - if ($.oc.builder === undefined) { - $.oc.builder = {}; - } - - if ($.oc.builder.entityControllers === undefined) { - $.oc.builder.entityControllers = {}; - } - - var Base = $.oc.builder.entityControllers.base, - BaseProto = Base.prototype; - - var Code = function(indexController) { - Base.call(this, 'code', indexController); - } - - Code.prototype = Object.create(BaseProto); - Code.prototype.constructor = Code; - - // PUBLIC METHODS - // ============================ - - Code.prototype.registerHandlers = function() { - } - - Code.prototype.cmdCreateCode = function(ev) { - this.indexController.openOrLoadMasterTab($(ev.target), 'onCodeOpen', this.newTabId()); - } - - Code.prototype.cmdOpenCode = function(ev) { - var path = $(ev.currentTarget).data('path'), - pluginCode = $(ev.currentTarget).data('pluginCode'); - - var result = this.indexController.openOrLoadMasterTab($(ev.target), 'onCodeOpen', this.makeTabId(pluginCode+'-'+path), { - fileName: path - }); - - if (result !== false) { - result.done(this.proxy(this.updateFormEditorMode, this)); - } - } - - Code.prototype.cmdSaveCode = function(ev) { - var $target = $(ev.currentTarget), - $form = $target.closest('form'), - $inspectorContainer = $form.find('.inspector-container') - - if (!$.oc.inspector.manager.applyValuesFromContainer($inspectorContainer)) { - return - } - - $target.request('onCodeSave').done( - this.proxy(this.saveCodeDone) - ) - } - - Code.prototype.saveCodeDone = function(data) { - if (data['builderResponseData'] === undefined) { - throw new Error('Invalid response data'); - } - - var $masterTabPane = this.getMasterTabsActivePane(); - - this.getIndexController().unchangeTab($masterTabPane); - - this.updateFormEditorMode(); - } - - Code.prototype.getCodeList = function() { - return $('#layout-side-panel form[data-content-id=code] .control-codelist') - } - - Code.prototype.updateFormEditorMode = function() { - var $masterTabPane = this.getMasterTabsActivePane(); - - var modes = { - css: "css", - htm: "html", - html: "html", - js: "javascript", - json: "json", - less: "less", - md: "markdown", - sass: "sass", - scss: "scss", - txt: "plain_text", - yaml: "yaml", - xml: "xml", - php: "php" - }; - - var fileName = $('input[name=fileName]', $masterTabPane).val(), - parts = fileName.split('.'), - extension = 'txt', - mode = 'plain_text', - editor = $('[data-control=codeeditor]', $masterTabPane); - - if (parts.length >= 2) { - extension = parts.pop().toLowerCase(); - } - - if (modes[extension] !== undefined) { - mode = modes[extension]; - } - - var setEditorMode = function() { - window.setTimeout(function() { - editor.data('oc.codeEditor').editor.getSession().setMode({path: 'ace/mode/'+mode}) - }, 200); - }; - - setEditorMode(); - } - - // REGISTRATION - // ============================ - - $.oc.builder.entityControllers.code = Code; - -}(window.jQuery); diff --git a/plugins/rainlab/builder/assets/js/builder.index.entity.controller.js b/plugins/rainlab/builder/assets/js/builder.index.entity.controller.js index 5e21a28..1cb12e3 100644 --- a/plugins/rainlab/builder/assets/js/builder.index.entity.controller.js +++ b/plugins/rainlab/builder/assets/js/builder.index.entity.controller.js @@ -13,11 +13,11 @@ BaseProto = Base.prototype var Controller = function(indexController) { - Base.call(this, 'controller', indexController); + Base.call(this, 'controller', indexController) } - Controller.prototype = Object.create(BaseProto); - Controller.prototype.constructor = Controller; + Controller.prototype = Object.create(BaseProto) + Controller.prototype.constructor = Controller // PUBLIC METHODS // ============================ @@ -27,50 +27,50 @@ self = this, pluginCode = $form.data('pluginCode'), behaviorsSelected = $form.find('input[name="behaviors[]"]:checked').length, - promise = null; + promise = null - // If behaviors were selected, open a new tab after the + // If behaviors were selected, open a new tab after the // controller is saved. Otherwise just update the controller // list. if (behaviorsSelected) { promise = this.indexController.openOrLoadMasterTab( - $form, - 'onControllerCreate', - this.makeTabId(pluginCode+'-new-controller'), + $form, + 'onControllerCreate', + this.makeTabId(pluginCode+'-new-controller'), {} - ); + ) } else { - promise = $form.request('onControllerCreate'); + promise = $form.request('onControllerCreate') } promise.done(function(data){ $form.trigger('close.oc.popup') self.updateDataRegistry(data) - }).always($.oc.builder.indexController.hideStripeIndicatorProxy); + }).always($.oc.builder.indexController.hideStripeIndicatorProxy) } Controller.prototype.cmdOpenController = function(ev) { var controller = $(ev.currentTarget).data('id'), - pluginCode = $(ev.currentTarget).data('pluginCode'); + pluginCode = $(ev.currentTarget).data('pluginCode') this.indexController.openOrLoadMasterTab($(ev.target), 'onControllerOpen', this.makeTabId(pluginCode+'-'+controller), { controller: controller - }); + }) } Controller.prototype.cmdSaveController = function(ev) { var $target = $(ev.currentTarget), $form = $target.closest('form'), - $inspectorContainer = $form.find('.inspector-container'); + $inspectorContainer = $form.find('.inspector-container') if (!$.oc.inspector.manager.applyValuesFromContainer($inspectorContainer)) { - return; + return } $target.request('onControllerSave').done( this.proxy(this.saveControllerDone) - ); + ) } // EVENT HANDLERS @@ -85,7 +85,7 @@ } var $masterTabPane = this.getMasterTabsActivePane() - + this.getIndexController().unchangeTab($masterTabPane) } diff --git a/plugins/rainlab/builder/assets/js/builder.index.entity.databasetable.js b/plugins/rainlab/builder/assets/js/builder.index.entity.databasetable.js index 474707e..98f8cbd 100644 --- a/plugins/rainlab/builder/assets/js/builder.index.entity.databasetable.js +++ b/plugins/rainlab/builder/assets/js/builder.index.entity.databasetable.js @@ -129,7 +129,7 @@ // Some migration-related rules are enforced here: // - // 1. Checking Autoincrement checkbox automatically checks the Unsigned checkbox (this corresponds to the + // 1. Checking Autoincrement checkbox automatically checks the Unsigned checkbox (this corresponds to the // logic internally implemented in Laravel schema builder) and PK // 2. Unchecking Unsigned unchecks Autoincrement // 3. Checking the PK column unchecks Nullable @@ -186,20 +186,20 @@ // ============================ DatabaseTable.prototype.registerHandlers = function() { - this.indexController.$masterTabs.on('oc.tableCellChanged', this.proxy(this.onTableCellChanged)); + this.indexController.$masterTabs.on('oc.tableCellChanged', this.proxy(this.onTableCellChanged)) } DatabaseTable.prototype.validateTable = function($target) { - var tableObj = this.getTableControlObject($target); + var tableObj = this.getTableControlObject($target) - tableObj.unfocusTable(); - return tableObj.validate(); + tableObj.unfocusTable() + return tableObj.validate() } DatabaseTable.prototype.getTableData = function($target) { - var tableObj = this.getTableControlObject($target); + var tableObj = this.getTableControlObject($target) - return tableObj.dataSource.getAllData(); + return tableObj.dataSource.getAllData() } DatabaseTable.prototype.getTableControlObject = function($target) { diff --git a/plugins/rainlab/builder/assets/js/builder.index.entity.imports.js b/plugins/rainlab/builder/assets/js/builder.index.entity.imports.js deleted file mode 100644 index b09bdd3..0000000 --- a/plugins/rainlab/builder/assets/js/builder.index.entity.imports.js +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Builder Index controller Imports entity controller - */ -+function ($) { "use strict"; - - if ($.oc.builder === undefined) { - $.oc.builder = {}; - } - - if ($.oc.builder.entityControllers === undefined) { - $.oc.builder.entityControllers = {}; - } - - var Base = $.oc.builder.entityControllers.base, - BaseProto = Base.prototype; - - var Imports = function(indexController) { - Base.call(this, 'imports', indexController); - } - - Imports.prototype = Object.create(BaseProto); - Imports.prototype.constructor = Imports; - - // PUBLIC METHODS - // ============================ - - Imports.prototype.cmdOpenImports = function(ev) { - var currentPlugin = this.getSelectedPlugin(); - - if (!currentPlugin) { - alert('Please select a plugin first'); - return; - } - - this.indexController.openOrLoadMasterTab($(ev.target), 'onImportsOpen', this.makeTabId(currentPlugin)); - } - - Imports.prototype.cmdConfirmImports = function(ev) { - var $target = $(ev.currentTarget); - - $target.popup({ - handler: 'onImportsShowConfirmPopup' - }); - } - - Imports.prototype.cmdSaveImports = function(ev) { - var $masterTabPane = this.getMasterTabsActivePane(), - $form = $masterTabPane.find('form'), - $popup = $(ev.currentTarget).closest('.control-popup'); - - $popup.removeClass('show').popup('setLoading', true); - - $form.request('onImportsSave', { - data: oc.serializeJSON($popup.get(0)) - }) - .done((data) => { - $popup.trigger('close.oc.popup'); - this.saveImportsDone(data); - }) - .fail(() => { - $popup.addClass('show').popup('setLoading', false).popup('setShake'); - }); - } - - Imports.prototype.cmdMigrateDatabase = function(ev) { - var $target = $(ev.currentTarget); - $target.request('onMigrateDatabase'); - } - - Imports.prototype.cmdAddBlueprintItem = function(ev) { - // $.oc.builder.blueprintbuilder.controller.addBlueprintItem(ev) - } - - Imports.prototype.cmdRemoveBlueprintItem = function(ev) { - // $.oc.builder.blueprintbuilder.controller.removeBlueprint(ev) - } - - // INTERNAL METHODS - // ============================ - - Imports.prototype.saveImportsDone = function(data) { - this.hideInspector(); - $('#blueprintList').html(''); - - if ($.oc.mainMenu && data && data.mainMenu && data.mainMenuLeft) { - $.oc.mainMenu.reload(data.mainMenu, data.mainMenuLeft); - } - - var $masterTabPane = this.getMasterTabsActivePane(); - this.getIndexController().unchangeTab($masterTabPane); - } - - Imports.prototype.hideInspector = function() { - var $container = $('.blueprint-container.inspector-open:first'); - - if ($container.length) { - var $inspectorContainer = this.findInspectorContainer($container); - $.oc.foundation.controlUtils.disposeControls($inspectorContainer.get(0)); - } - } - - Imports.prototype.findInspectorContainer = function($element) { - var $containerRoot = $element.closest('[data-inspector-container]') - return $containerRoot.find('.inspector-container') - } - - // REGISTRATION - // ============================ - - $.oc.builder.entityControllers.imports = Imports; - -}(window.jQuery); diff --git a/plugins/rainlab/builder/assets/js/builder.index.entity.menus.js b/plugins/rainlab/builder/assets/js/builder.index.entity.menus.js index 18753a3..5330bfb 100644 --- a/plugins/rainlab/builder/assets/js/builder.index.entity.menus.js +++ b/plugins/rainlab/builder/assets/js/builder.index.entity.menus.js @@ -70,16 +70,12 @@ Menus.prototype.saveMenusDone = function(data) { if (data['builderResponseData'] === undefined) { - throw new Error('Invalid response data'); + throw new Error('Invalid response data') } - var $masterTabPane = this.getMasterTabsActivePane(); + var $masterTabPane = this.getMasterTabsActivePane() - if ($.oc.mainMenu && data.mainMenu && data.mainMenuLeft) { - $.oc.mainMenu.reload(data.mainMenu, data.mainMenuLeft); - } - - this.getIndexController().unchangeTab($masterTabPane); + this.getIndexController().unchangeTab($masterTabPane) } // REGISTRATION diff --git a/plugins/rainlab/builder/assets/js/builder.index.entity.modelform.js b/plugins/rainlab/builder/assets/js/builder.index.entity.modelform.js index af03406..9a1cd5a 100644 --- a/plugins/rainlab/builder/assets/js/builder.index.entity.modelform.js +++ b/plugins/rainlab/builder/assets/js/builder.index.entity.modelform.js @@ -67,14 +67,14 @@ var $target = $(ev.currentTarget) // Always use the first placeholder to add controls - var $placeholder = this.getMasterTabsActivePane().find('.builder-control-list .control.oc-placeholder:first')[0] + var $placeholder = this.getMasterTabsActivePane().find('.builder-control-list .control.placeholder:first')[0] // Filter all fields from the DataTable that have the "add" checkbox checked. var fields = $target.find('.control-table').data('oc.table').dataSource.data.filter(function (column) { return column.add }).reverse() - // Hide the popup and initialize the load indicator. + // Hide the poup and initialize the load indicator. $target.closest('.control-popup').data('oc.popup').hide() $.oc.stripeLoadIndicator.show() @@ -83,7 +83,7 @@ // addControlToPlaceholder requires a proper reflow of the whole form layout before // a new field can be added. This addField helper function makes sure that all // Promises are run in sequence to achieve this. - function addField(field) { + function addField (field) { return function () { var defer = $.Deferred() $.oc.builder.formbuilder.controller.addControlToPlaceholder( diff --git a/plugins/rainlab/builder/assets/js/builder.index.js b/plugins/rainlab/builder/assets/js/builder.index.js index d3cd3fc..c73c6dc 100644 --- a/plugins/rainlab/builder/assets/js/builder.index.js +++ b/plugins/rainlab/builder/assets/js/builder.index.js @@ -3,29 +3,28 @@ */ +function ($) { "use strict"; - if ($.oc.builder === undefined) { - $.oc.builder = {}; - } + if ($.oc.builder === undefined) + $.oc.builder = {} var Base = $.oc.foundation.base, - BaseProto = Base.prototype; + BaseProto = Base.prototype var Builder = function() { - Base.call(this); + Base.call(this) - this.$masterTabs = null; - this.masterTabsObj = null; - this.hideStripeIndicatorProxy = null; - this.entityControllers = {}; + this.$masterTabs = null + this.masterTabsObj = null + this.hideStripeIndicatorProxy = null + this.entityControllers = {} - this.init(); + this.init() } Builder.prototype = Object.create(BaseProto) Builder.prototype.constructor = Builder Builder.prototype.dispose = function() { - // We don't really care about disposing the + // We don't really care about disposing the // index controller, as it's used only once // and always exists during the page life. BaseProto.dispose.call(this) @@ -35,30 +34,30 @@ // ============================ Builder.prototype.openOrLoadMasterTab = function($form, serverHandlerName, tabId, data) { - if (this.masterTabsObj.goTo(tabId)) { - return false; - } + if (this.masterTabsObj.goTo(tabId)) + return false - var requestData = data === undefined ? {} : data; + var requestData = data === undefined ? {} : data - $.oc.stripeLoadIndicator.show(); - - var promise = $form - .request(serverHandlerName, { - data: requestData - }) + $.oc.stripeLoadIndicator.show() + var promise = $form.request( + serverHandlerName, + { data: requestData } + ) .done(this.proxy(this.addMasterTab)) - .always(this.hideStripeIndicatorProxy); + .always( + this.hideStripeIndicatorProxy + ) - return promise; + return promise } Builder.prototype.getMasterTabActivePane = function() { - return this.$masterTabs.find('> .tab-content > .tab-pane.active'); + return this.$masterTabs.find('> .tab-content > .tab-pane.active') } Builder.prototype.unchangeTab = function($pane) { - $pane.find('form').trigger('unchange.oc.changeMonitor'); + $pane.find('form').trigger('unchange.oc.changeMonitor') } Builder.prototype.triggerCommand = function(command, ev) { @@ -94,46 +93,44 @@ Builder.prototype.createEntityControllers = function() { for (var controller in $.oc.builder.entityControllers) { if (controller == "base") { - continue; + continue } - this.entityControllers[controller] = new $.oc.builder.entityControllers[controller](this); + this.entityControllers[controller] = new $.oc.builder.entityControllers[controller](this) } } Builder.prototype.registerHandlers = function() { - $(document).on('click', '[data-builder-command]', this.proxy(this.onCommand)); - $(document).on('submit', '[data-builder-command]', this.proxy(this.onCommand)); + $(document).on('click', '[data-builder-command]', this.proxy(this.onCommand)) + $(document).on('submit', '[data-builder-command]', this.proxy(this.onCommand)) - this.$masterTabs.on('changed.oc.changeMonitor', this.proxy(this.onFormChanged)); - this.$masterTabs.on('unchanged.oc.changeMonitor', this.proxy(this.onFormUnchanged)); - this.$masterTabs.on('shown.bs.tab', this.proxy(this.onTabShown)); - this.$masterTabs.on('afterAllClosed.oc.tab', this.proxy(this.onAllTabsClosed)); - this.$masterTabs.on('closed.oc.tab', this.proxy(this.onTabClosed)); - this.$masterTabs.on('autocompleteitems.oc.inspector', this.proxy(this.onDataRegistryItems)); - this.$masterTabs.on('dropdownoptions.oc.inspector', this.proxy(this.onDataRegistryItems)); + this.$masterTabs.on('changed.oc.changeMonitor', this.proxy(this.onFormChanged)) + this.$masterTabs.on('unchanged.oc.changeMonitor', this.proxy(this.onFormUnchanged)) + this.$masterTabs.on('shown.bs.tab', this.proxy(this.onTabShown)) + this.$masterTabs.on('afterAllClosed.oc.tab', this.proxy(this.onAllTabsClosed)) + this.$masterTabs.on('closed.oc.tab', this.proxy(this.onTabClosed)) + this.$masterTabs.on('autocompleteitems.oc.inspector', this.proxy(this.onDataRegistryItems)) + this.$masterTabs.on('dropdownoptions.oc.inspector', this.proxy(this.onDataRegistryItems)) for (var controller in this.entityControllers) { if (this.entityControllers[controller].registerHandlers !== undefined) { - this.entityControllers[controller].registerHandlers(); + this.entityControllers[controller].registerHandlers() } } } Builder.prototype.hideStripeIndicator = function() { - $.oc.stripeLoadIndicator.hide(); + $.oc.stripeLoadIndicator.hide() } Builder.prototype.addMasterTab = function(data) { this.masterTabsObj.addTab(data.tabTitle, data.tab, data.tabId, 'oc-' + data.tabIcon) - var $masterTabPane = this.getMasterTabActivePane(); - if (data.isNewRecord) { - $masterTabPane.find('form').one('ready.oc.changeMonitor', this.proxy(this.onChangeMonitorReady)); - } + var $masterTabPane = this.getMasterTabActivePane() - $('[data-builder-tabs]', $masterTabPane).dragScroll(); + $masterTabPane.find('form').one('ready.oc.changeMonitor', this.proxy(this.onChangeMonitorReady)) + } } Builder.prototype.updateModifiedCounter = function() { @@ -142,11 +139,9 @@ models: { menu: 'models', count: 0 }, permissions: { menu: 'permissions', count: 0 }, menus: { menu: 'menus', count: 0 }, - imports: { menu: 'imports', count: 0 }, versions: { menu: 'versions', count: 0 }, localization: { menu: 'localization', count: 0 }, - controller: { menu: 'controllers', count: 0 }, - code: { menu: 'code', count: 0 } + controller: { menu: 'controllers', count: 0 } } $('> div.tab-content > div.tab-pane[data-modified] > form', this.$masterTabs).each(function(){ @@ -199,22 +194,23 @@ Builder.prototype.onCommand = function(ev) { if (ev.currentTarget.tagName == 'FORM' && ev.type == 'click') { // The form elements could have data-builder-command attribute, - // but for them we only handle the submit event and ignore clicks. - return; + // but for them we only handle the submit event and ignore clicks. + + return } - var command = $(ev.currentTarget).data('builderCommand'); - this.triggerCommand(command, ev); + var command = $(ev.currentTarget).data('builderCommand') + this.triggerCommand(command, ev) // Prevent default for everything except drop-down menu items // - var $target = $(ev.currentTarget); + var $target = $(ev.currentTarget) if (ev.currentTarget.tagName === 'A' && $target.attr('role') == 'menuitem' && $target.attr('href') == 'javascript:;') { - return; + return } - ev.preventDefault(); - return false; + ev.preventDefault() + return false } Builder.prototype.onFormChanged = function(ev) { @@ -264,14 +260,13 @@ Builder.prototype.onDataRegistryItems = function(ev, data) { var self = this - if (data.propertyDefinition.fillFrom == 'model-classes' || - data.propertyDefinition.fillFrom == 'model-forms' || - data.propertyDefinition.fillFrom == 'model-lists' || + if (data.propertyDefinition.fillFrom == 'model-classes' || + data.propertyDefinition.fillFrom == 'model-forms' || + data.propertyDefinition.fillFrom == 'model-lists' || data.propertyDefinition.fillFrom == 'controller-urls' || - data.propertyDefinition.fillFrom == 'model-columns' || - data.propertyDefinition.fillFrom == 'plugin-lists' || - data.propertyDefinition.fillFrom == 'permissions' - ) { + data.propertyDefinition.fillFrom == 'model-columns' || + data.propertyDefinition.fillFrom == 'plugin-lists' || + data.propertyDefinition.fillFrom == 'permissions') { ev.preventDefault() var subtype = null, diff --git a/plugins/rainlab/builder/assets/less/behaviors.less b/plugins/rainlab/builder/assets/less/behaviors.less index 02af3da..d06e292 100644 --- a/plugins/rainlab/builder/assets/less/behaviors.less +++ b/plugins/rainlab/builder/assets/less/behaviors.less @@ -1,5 +1,5 @@ .builder-controllers-builder-area { - background: var(--bs-body-bg, white); + background: white; ul.controller-behavior-list { .clearfix(); @@ -11,15 +11,15 @@ li { h4 { text-align: center; - border-bottom: 1px dotted @builder-control-border-color; + border-bottom: 1px dotted @builder-control-border-color; margin: 0 -20px 40px; span { display: inline-block; - background: @builder-control-tooltip-color; color: white; margin: 0 auto; - border-radius: 8px; + .border-radius(8px); + background: @builder-control-border-color; padding: 7px 10px; font-size: 13px; line-height: 100%; @@ -34,8 +34,8 @@ .clearfix(); cursor: pointer; - .list-behavior, .import-export-behavior { - border-radius: 4px; + .list-behavior, .reorder-behavior { + .border-radius(4px); border: 2px solid @builder-control-border-color; padding: 25px 10px 25px 10px; @@ -53,8 +53,8 @@ } } - .oc-placeholder { - background: var(--oc-secondary-bg, #EEF2F4); + .placeholder { + background: #EEF2F4; height: 25px; } @@ -64,9 +64,9 @@ } } - .import-export-behavior { + .reorder-behavior { table { - i.icon-bars, .oc-placeholder { + i.icon-bars, .placeholder { float: left; } @@ -103,7 +103,7 @@ } div.label { - background: var(--oc-secondary-bg, #EEF2F4); + background: #EEF2F4; height: 25px; margin-bottom: 10px; @@ -121,14 +121,14 @@ } div.control { - background: var(--oc-secondary-bg, #EEF2F4); + background: #EEF2F4; height: 35px; margin-bottom: 25px; } } div.button { - background: var(--oc-secondary-bg, #EEF2F4); + background: #EEF2F4; height: 35px; margin-right: 20px; .border-radius(4px); diff --git a/plugins/rainlab/builder/assets/less/builder.less b/plugins/rainlab/builder/assets/less/builder.less index 44f0e98..265912a 100644 --- a/plugins/rainlab/builder/assets/less/builder.less +++ b/plugins/rainlab/builder/assets/less/builder.less @@ -1,26 +1,15 @@ @import "../../../../../modules/backend/assets/less/core/boot.less"; -@builder-control-border-color: var(--oc-document-ruler-tick, #bdc3c7); -@builder-control-tooltip-color: #72809d; +@builder-control-border-color: #bdc3c7; @builder-control-text-color: #95a5a6; -@builder-hover-color: var(--oc-selection); - -:root, [data-bs-theme="light"] { - --oc-builder-control-color: #555; -} - -[data-bs-theme="dark"] { - --oc-builder-control-color: #888; -} +@builder-hover-color: #2581b8; @import "buildingarea.less"; @import "controlblueprint.less"; @import "behaviors.less"; @import "tabs.less"; @import "menus.less"; -@import "imports.less"; @import "localization.less"; -@import "codelist.less"; .control-filelist ul li.group.model > h4 a:after { content: @random; @@ -68,7 +57,7 @@ html.gecko .control-filelist ul li.group { .builder-inspector-container { width: 350px; - border-left: 1px solid var(--bs-border-color, #d9d9d9); + border-left: 1px solid #d9d9d9; &:empty { display: none!important; diff --git a/plugins/rainlab/builder/assets/less/buildingarea.less b/plugins/rainlab/builder/assets/less/buildingarea.less index 234b43f..96ea040 100644 --- a/plugins/rainlab/builder/assets/less/buildingarea.less +++ b/plugins/rainlab/builder/assets/less/buildingarea.less @@ -1,5 +1,5 @@ .builder-building-area { - background: var(--bs-body-bg, white); + background: white; ul.builder-control-list { .clearfix(); @@ -11,30 +11,26 @@ position: relative; margin-bottom: 20px; cursor: pointer; - user-select: none; + .user-select(none); &[data-unknown] { cursor: default; } - &.oc-placeholder, &.loading-control { + &.placeholder, &.loading-control { padding: 10px 12px; position: relative; text-align: center; - border: 2px dotted var(--bs-border-color, #dae0e0); + border: 2px dotted #dde0e2; margin-top: 20px; - border-radius: 4px; - color: var(--bs-emphasis-color, #dae0e0); + .border-radius(4px); + color: #dae0e0; i { margin-right: 8px; } } - &.loading-control { - background: var(--oc-secondary-bg); - } - &.clear-row { display: none; margin-bottom: 0; @@ -45,9 +41,9 @@ text-align: left; } - &.updating-control:after, + &.updating-control:after, &.loading-control:before { - background-image:url(../images/loader-transparent.svg); + background-image:url(../../../../../modules/system/assets/ui/images/loader-transparent.svg); background-size: 15px 15px; background-position: 50% 50%; display: inline-block; @@ -57,7 +53,7 @@ margin-right: 13px; position: relative; top: 2px; - animation: spin 1s linear infinite; + .animation(spin 1s linear infinite); } &.loading-control:after { @@ -79,7 +75,7 @@ width: 25px; height: 25px; background: rgba(127, 127, 127, 0.1); - border-radius: 4px; + .border-radius(4px); } &.drag-over { @@ -113,7 +109,7 @@ display: none; } - &:not(.oc-placeholder):not(.loading-control):not(.updating-control):hover > { + &:not(.placeholder):not(.loading-control):not(.updating-control):hover > { > div.remove-control { font-family: sans-serif; display: block; @@ -127,9 +123,9 @@ font-size: 16px; font-weight: bold; line-height: 21px; - border-radius: 20px; - background: var(--oc-toolbar-border, #ecf0f1); - color: var(--oc-toolbar-color, #95a5a6) !important; + .border-radius(20px); + background: #ecf0f1; + color: #95a5a6 !important; &:hover { color: white !important; @@ -162,26 +158,25 @@ > .control-wrapper, > .control-static-contents { position: relative; - transition: margin 0.1s; + .transition(margin 0.1s); } } - > li.oc-placeholder:hover, - > li.oc-placeholder.popover-highlight, - > li.oc-placeholder.control-palette-open { + > li.placeholder:hover, + > li.placeholder.popover-highlight, + > li.placeholder.control-palette-open { background-color: @builder-hover-color!important; color: white!important; border-style: solid; border-color: @builder-hover-color; - opacity: 1; } - > li.control:not(.oc-placeholder):not(.loading-control):not([data-unknown]):hover > .control-wrapper *, - > li.control.inspector-open:not(.oc-placeholder):not(.loading-control) > .control-wrapper * { + > li.control:not(.placeholder):not(.loading-control):not([data-unknown]):hover > .control-wrapper *, + > li.control.inspector-open:not(.placeholder):not(.loading-control) > .control-wrapper * { color: @builder-hover-color!important; } - > li.control.drag-over:not(.oc-placeholder) { + > li.control.drag-over:not(.placeholder) { &:before { position: absolute; content: ''; @@ -189,7 +184,7 @@ left: 0; width: 10px; height: 100%; - border-radius: 5px; + .border-radius(5px); background-color: @builder-hover-color; } @@ -204,13 +199,13 @@ .control-body { &.field-disabled, &.field-hidden { - opacity: 0.5; + .opacity(0.5); } } .builder-control-label { margin-bottom: 10px; - color: var(--oc-builder-control-color); + color: #555555; font-size: 14px; font-weight: 600; @@ -234,7 +229,7 @@ margin-top: 6px; } - .builder-control-comment-above, + .builder-control-comment-above, .builder-control-comment-below { color: #737373; font-size: 12px; @@ -253,10 +248,4 @@ html.gecko.mac { margin-right: 17px; } } -} - -[data-bs-theme="dark"] { - .builder-building-area { - background: @body-bg; - } -} +} \ No newline at end of file diff --git a/plugins/rainlab/builder/assets/less/codelist.less b/plugins/rainlab/builder/assets/less/codelist.less deleted file mode 100644 index 2c6f63a..0000000 --- a/plugins/rainlab/builder/assets/less/codelist.less +++ /dev/null @@ -1,249 +0,0 @@ - - -@color-text-title: @text-color; -@color-text-description: @primary-color; - -[data-entity="code"] .secondary-content-tabs .nav-tabs { - display: none; -} - -.control-codelist { - p.no-data { - padding: 22px; - margin: 0; - color: @text-muted; - font-size: 14px; - text-align: center; - font-weight: 400; - border-radius: @border-radius-base; - } - - p.parent, ul li { - font-weight: 300; - line-height: 150%; - margin-bottom: 0; - - &.active a { - background: @color-list-active; - position: relative; - &:after { - position: absolute; - height: 100%; - width: 4px; - left: 0; - top: 0; - background: @color-list-active-border; - display: block; - content: ' '; - } - } - - a.link { - display: block; - position: relative; - word-wrap: break-word; - padding: 10px 50px 10px 20px; - outline: none; - font-weight: 400; - color: @color-text-title; - font-size: 14px; - - &:hover, &:focus, &:active { - text-decoration: none; - } - - span { - display: block; - - &.description { - color: @color-text-description; - font-size: 12px; - font-weight: 400; - word-wrap: break-word; - - strong { - color: @color-text-title; - font-weight: 400; - } - } - } - } - - &.directory, &.parent { - a.link { - padding-left: 40px; - - &:after { - display: block; - position: absolute; - width: 10px; - height: 10px; - top: 10px; - left: 20px; - .icon(@folder); - color: @color-list-icon; - font-size: 14px; - } - } - } - - &.parent { - a.link { - padding-left: 41px; - background-color: @primary-bg; - color: @primary-color; - word-wrap: break-word; - - &:before { - content: ''; - height: 1px; - display: block; - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 1px; - background: @primary-border; - } - - - &:after { - font-size: 13px; - color: @primary-color; - width: 18px; - height: 18px; - top: 11px; - left: 22px; - opacity: 0.5; - .icon(@chevron-left); - } - } - } - } - - p.parent a.link:hover { - background: @editor-section-bg !important; - color: @editor-section-color !important; - - &:after { - opacity: 1; - } - - &:before { - display: none; - } - } - - ul { - padding: 0; - margin: 0; - - li { - font-weight: 300; - line-height: 150%; - position: relative; - list-style: none; - - &.active a.link, a.link:hover { - background: @editor-section-bg; - color: @editor-section-color; - } - - &.active a.link { - position: relative; - &:after { - position: absolute; - height: 100%; - width: 4px; - left: 0; - top: 0; - background: @primary-border; - display: block; - content: ' '; - } - } - - div.controls { - position: absolute; - right: 45px; - top: 10px; - - .dropdown { - width: 14px; - height: 21px; - - &.open a.control { - display: block!important; - &:before { - visibility: visible; - display: block; - } - } - } - - a.control { - color: @color-text-title; - font-size: 14px; - visibility: hidden; - overflow: hidden; - width: 14px; - height: 21px; - display: none; - text-decoration: none; - cursor: pointer; - opacity: 0.5; - &:before { - visibility: visible; - display: block; - margin-right: 0; - } - - &:hover { - opacity: 1; - } - } - } - - &:hover { - background: @editor-section-bg; - color: @editor-section-color; - - div.controls, a.control { - display: block !important; - - > a.control { - display: block !important; - } - } - } - - .form-check { - position: absolute; - top: 10px; - right: 5px; - - label { - margin-right: 0; - } - } - } - } - - div.list-container { - position: relative; - .translate(0, 0); - - &.animate ul { - .transition(all 0.2s ease); - } - - &.goForward ul { - .translate(-350px, 0); - } - - &.goBackward ul { - .translate(350px, 0); - } - - } -} diff --git a/plugins/rainlab/builder/assets/less/imports.less b/plugins/rainlab/builder/assets/less/imports.less deleted file mode 100644 index 7c48ddc..0000000 --- a/plugins/rainlab/builder/assets/less/imports.less +++ /dev/null @@ -1,186 +0,0 @@ -.builder-tailor-builder-area { - background: var(--bs-body-bg, white); - - ul.tailor-blueprint-list { - .clearfix(); - cursor: pointer; - padding: 20px; - margin-bottom: 0; - list-style: none; - - li { - position: relative; - - h4 { - text-align: center; - border-bottom: 1px dotted @builder-control-border-color; - margin: 0 -20px 30px; - - span { - display: inline-block; - color: white; - margin: 0 auto; - border-radius: 8px; - background: @builder-control-tooltip-color; - padding: 7px 10px; - font-size: 13px; - line-height: 100%; - position: relative; - top: 14px; - } - } - - table.table { - margin: 0; - td { - font-size: 0.875em; - - > span { - font-family: var(--bs-font-monospace); - color: @secondary-color; - word-wrap: break-word; - word-break: break-word; - } - } - th { - font-size: 0.875em; - text-align: right; - } - th:not(.table-danger) { - color: @text-color; - } - tr:last-child { - td, th { - border-bottom: none; - } - } - } - - div.remove-blueprint { - font-family: sans-serif; - display: none; - position: absolute; - right: 0; - top: 20px; - cursor: pointer; - width: 21px; - height: 21px; - padding-left: 6px; - font-size: 16px; - font-weight: bold; - line-height: 21px; - border-radius: 20px; - background: var(--oc-toolbar-border, #ecf0f1); - color: var(--oc-toolbar-color, #95a5a6) !important; - - &:hover { - color: white !important; - background: #c03f31; - } - } - - &:hover { - div.remove-blueprint { - display: block; - } - } - - &.updating-blueprint:after { - background-image:url(../images/loader-transparent.svg); - background-size: 15px 15px; - background-position: 50% 50%; - display: inline-block; - width: 15px; - height: 15px; - content: ' '; - margin-right: 13px; - position: relative; - top: 2px; - animation: spin 1s linear infinite; - } - - &.updating-blueprint:after { - position: absolute; - right: -8px; - top: 35px; - } - - &.updating-blueprint:before { - content: ''; - position: absolute; - right: 0; - top: 30px; - width: 25px; - height: 25px; - background: rgba(127, 127, 127, 0.1); - border-radius: 4px; - } - } - - .blueprint-container { - .clearfix(); - - .tailor-blueprint { - div.form { - .clearfix(); - border: 2px solid @builder-control-border-color; - margin-bottom: 20px; - border-radius: 4px; - } - } - - &:hover, &.inspector-open { - * { - border-color: @builder-hover-color!important; - } - } - } - } - - .add-blueprint-button { - font-size: 16px; - text-align: center; - border: 2px dotted var(--oc-dropdown-trigger-border, #dde0e2); - height: 64px; - margin: 0 20px 40px; - - a { - padding: 20px 15px; - height: 60px; - display: block; - text-decoration: none; - color: var(--oc-dropdown-trigger-color, #bdc3c7); - } - - i { - margin-right: 5px; - } - - span { - position: relative; - top: -1px; - } - - span.title { - font-size: 14px; - } - - &:hover { - border: 2px dotted @builder-hover-color; - background: @builder-hover-color!important; - - a { - color: white; - } - } - } -} - -// Fix for the Mac firefox -html.gecko.mac { - .builder-tailor-builder-area { - ul.tailor-blueprint-list { - padding-right: 40px; - } - } -} diff --git a/plugins/rainlab/builder/assets/less/menus.less b/plugins/rainlab/builder/assets/less/menus.less index f0e96f1..3be02dd 100644 --- a/plugins/rainlab/builder/assets/less/menus.less +++ b/plugins/rainlab/builder/assets/less/menus.less @@ -1,6 +1,6 @@ .builder-menu-editor { - background: var(--bs-body-bg, white); - + background: white; + .builder-menu-editor-workspace { padding: 30px; } @@ -11,7 +11,7 @@ cursor: pointer; > li { - border-radius: 4px; + .border-radius(4px); div.item-container:hover, &.inspector-open > div.item-container { background: @builder-hover-color!important; @@ -41,10 +41,10 @@ &:hover .close-btn { display: block; text-decoration: none; - opacity: 0.5; + .opacity(0.5); &:hover { - opacity: 1; + .opacity(1); } } } @@ -52,11 +52,11 @@ &.add { font-size: 16px; text-align: center; - border: 2px dotted var(--oc-dropdown-trigger-border, #dde0e2); + border: 2px dotted #dde0e2; a { text-decoration: none; - color: var(--oc-dropdown-trigger-color, #bdc3c7); + color: #bdc3c7; } span.title { @@ -90,8 +90,8 @@ } > div.item-container { - background: var(--bs-secondary-bg, #ecf0f1); - color: var(--bs-secondary-color, #708080); + background: #ecf0f1; + color: #708080; padding: 20px 25px; height: 64px; white-space: nowrap; @@ -152,9 +152,8 @@ } > div.item-container { - background: var(--bs-tertiary-bg, #f3f5f5); - color: var(--bs-tertiary-color, #94a5a6); - + background: #f3f5f5; + color: #94a5a6; padding: 18px 13px; text-align: center; diff --git a/plugins/rainlab/builder/assets/less/tabs.less b/plugins/rainlab/builder/assets/less/tabs.less index a743dad..39d613c 100644 --- a/plugins/rainlab/builder/assets/less/tabs.less +++ b/plugins/rainlab/builder/assets/less/tabs.less @@ -32,31 +32,13 @@ &.global { top: 5px; - right: 0; - padding-right: 10px; - background: @body-bg; - z-index: 110; - border-radius: 3px; - - > div { - width: 24px; - height: 24px; - border-radius: 3px; - background: @toolbar-bg; - padding-left: 10px; - padding-top: 5px; - - &:active { - background: @toolbar-focus-bg; - } - } + right: 15px; } } } > ul.tabs { margin: 0; - padding-right: 50px; list-style: none; font-size: 0; white-space: nowrap; @@ -64,7 +46,7 @@ position: relative; > li { - user-select: none; + .user-select(none); display: inline-block; font-size: 13px; white-space: nowrap; @@ -73,16 +55,16 @@ > div.tab-container { position: relative; - color: @tab-color !important; + color: #bdc3c7!important; > div { - transition: padding .1s; + .transition(padding .1s); position: relative; } } &:hover > div { - color: @tab-active-color !important; + color: #95a5a6!important; } .tab-control { @@ -100,7 +82,7 @@ color: #95a5a6; &:hover { - color: @link-color !important; + color: @link-color!important; } } @@ -112,7 +94,7 @@ &.active { > div.tab-container { - color: @tab-active-color !important; + color: #95a5a6!important; } .tab-control { @@ -139,7 +121,7 @@ &.primary { > .tabs { > ul.tabs { - padding: 0 40px 0 40px; + padding: 0 20px 0 40px; height: 31px; &:after { @@ -150,8 +132,7 @@ left: 0; bottom: 0; width: 100%; - // background: #bdc3c7; - background: transparent linear-gradient(90deg, #bdc3c7 90%, transparent 100%); + background: #bdc3c7; z-index: 106; } @@ -166,39 +147,46 @@ > div { padding: 5px 5px 0 5px; - background: white; + border-top: 2px solid #e5e5e5; > span { position: relative; - top: -4px; - transition: top .1s; + top: -2px; + .transition(top .1s); } } + + &:before, &:after { + content: ''; + display: block; + position: absolute; + top: 0; + height: 27px; + width: 21px; + background: transparent url(../images/tab.png) no-repeat; + } + + &:before { + left: 0; + background-position: 0 -27px; + } + + &:after { + right: 0; + background-position: -75px -27px; + } } &.active { z-index: 107; - color: var(--oc-tab-active-color); > div.tab-container { - &:before, &:after { - content: ''; - display: block; - position: absolute; - top: 0; - height: 27px; - width: 21px; - background: transparent url(../images/tab.png) no-repeat; - } - &:before { - left: 0; background-position: 0 0; } &:after { - right: 0; background-position: -75px 0; } @@ -296,7 +284,7 @@ > div.tab-container { > div { - color: var(--oc-builder-control-color); + color: #555555; padding-right: 30px; } } @@ -316,16 +304,3 @@ // } // } // } - - -[data-bs-theme="dark"] { - .builder-tabs.primary > .tabs > ul.tabs > li.active:before, - .builder-tabs.primary > .tabs > ul.tabs > li > div.tab-container > div { - background: #202124; - } - - .builder-tabs.primary > .tabs > ul.tabs > li.active > div.tab-container:before, - .builder-tabs.primary > .tabs > ul.tabs > li.active > div.tab-container:after { - background-image: url(../images/tab-dark.png); - } -} diff --git a/plugins/rainlab/builder/behaviors/IndexCodeOperations.php b/plugins/rainlab/builder/behaviors/IndexCodeOperations.php deleted file mode 100644 index aee256c..0000000 --- a/plugins/rainlab/builder/behaviors/IndexCodeOperations.php +++ /dev/null @@ -1,135 +0,0 @@ -getPluginCode(); - - $options = [ - 'pluginCode' => $pluginCodeObj->toCode() - ]; - - $widget = $this->makeBaseFormWidget($fileName, $options); - $this->vars['fileName'] = $fileName; - - $result = [ - 'tabTitle' => $this->getTabName($widget->model), - 'tabIcon' => 'icon-file-code-o', - 'tabId' => $this->getTabId($pluginCodeObj->toCode(), $fileName), - 'tab' => $this->makePartial('tab', [ - 'form' => $widget, - 'pluginCode' => $pluginCodeObj->toCode() - ]) - ]; - - return $result; - } - - /** - * onCodeSave - */ - public function onCodeSave() - { - $pluginCodeObj = new PluginCode(post('plugin_code')); - $pluginCode = $pluginCodeObj->toCode(); - - $fileName = post('fileName'); - - $data = array_only(post(), ['fileName', 'content']); - - $model = $this->loadModelFromPost(); - $model->fill($data); - $model->save(); - - Flash::success(Lang::get('rainlab.builder::lang.controller.saved')); - - $result = $this->controller->widget->codeList->onRefresh(); - - $result['builderResponseData'] = [ - 'tabId' => $this->getTabId($pluginCode, $fileName), - 'tabTitle' => $this->getTabName($model), - ]; - - return $result; - } - - /** - * getTabName - */ - protected function getTabName($model) - { - $pluginName = Lang::get($model->getModelPluginName()); - - return $pluginName.'/'.$model->fileName; - } - - /** - * getTabId - */ - protected function getTabId($pluginCode, $fileName) - { - return 'code-'.$pluginCode.'-'.$fileName; - } - - /** - * loadModelFromPost - */ - protected function loadModelFromPost() - { - $pluginCodeObj = new PluginCode(Request::input('plugin_code')); - $options = [ - 'pluginCode' => $pluginCodeObj->toCode() - ]; - - $fileName = Input::get('fileName'); - - return $this->loadOrCreateBaseModel($fileName, $options); - } - - /** - * loadOrCreateBaseModel - */ - protected function loadOrCreateBaseModel($fileName, $options = []) - { - $model = new CodeFileModel(); - - if (isset($options['pluginCode'])) { - $model->setPluginCode($options['pluginCode']); - } - - if (!$fileName) { - if ($currentPath = $this->controller->widget->codeList->getCurrentRelativePath()) { - $model->fileName = $currentPath . '/'; - } - return $model; - } - - $model->load($fileName); - - return $model; - } -} diff --git a/plugins/rainlab/builder/behaviors/IndexControllerOperations.php b/plugins/rainlab/builder/behaviors/IndexControllerOperations.php index 094bfaf..4e3f75f 100644 --- a/plugins/rainlab/builder/behaviors/IndexControllerOperations.php +++ b/plugins/rainlab/builder/behaviors/IndexControllerOperations.php @@ -1,29 +1,25 @@ controller->widget->controllerList->updateList(); if ($model->behaviors) { - // Create a new tab only for controllers with behaviors. + // Create a new tab only for controllers + // with behaviors. + $widget = $this->makeBaseFormWidget($model->controller, $options); $tab = [ @@ -90,9 +85,6 @@ class IndexControllerOperations extends IndexOperationsBehaviorBase return $result; } - /** - * onControllerSave - */ public function onControllerSave() { $controller = Input::get('controller'); @@ -108,9 +100,6 @@ class IndexControllerOperations extends IndexOperationsBehaviorBase return $result; } - /** - * onControllerShowCreatePopup - */ public function onControllerShowCreatePopup() { $pluginCodeObj = $this->getPluginCode(); @@ -119,18 +108,15 @@ class IndexControllerOperations extends IndexOperationsBehaviorBase 'pluginCode' => $pluginCodeObj->toCode() ]; - $this->baseFormConfigFile = '~/plugins/rainlab/builder/models/controllermodel/fields_new_controller.yaml'; + $this->baseFormConfigFile = '~/plugins/rainlab/builder/classes/controllermodel/new-controller-fields.yaml'; $widget = $this->makeBaseFormWidget(null, $options); return $this->makePartial('create-controller-popup-form', [ - 'form' => $widget, - 'pluginCode' => $pluginCodeObj->toCode() + 'form'=>$widget, + 'pluginCode' => $pluginCodeObj->toCode() ]); } - /** - * getTabName - */ protected function getTabName($model) { $pluginName = Lang::get($model->getModelPluginName()); @@ -138,17 +124,11 @@ class IndexControllerOperations extends IndexOperationsBehaviorBase return $pluginName.'/'.$model->controller; } - /** - * getTabId - */ protected function getTabId($pluginCode, $controller) { return 'controller-'.$pluginCode.'-'.$controller; } - /** - * loadModelFromPost - */ protected function loadModelFromPost() { $pluginCodeObj = new PluginCode(Request::input('plugin_code')); @@ -161,9 +141,6 @@ class IndexControllerOperations extends IndexOperationsBehaviorBase return $this->loadOrCreateBaseModel($controller, $options); } - /** - * loadOrCreateBaseModel - */ protected function loadOrCreateBaseModel($controller, $options = []) { $model = new ControllerModel(); @@ -180,9 +157,6 @@ class IndexControllerOperations extends IndexOperationsBehaviorBase return $model; } - /** - * mergeRegistryDataIntoResult - */ protected function mergeRegistryDataIntoResult(&$result, $pluginCodeObj) { if (!array_key_exists('builderResponseData', $result)) { diff --git a/plugins/rainlab/builder/behaviors/IndexDataRegistry.php b/plugins/rainlab/builder/behaviors/IndexDataRegistry.php index 3ca1a35..0791ae1 100644 --- a/plugins/rainlab/builder/behaviors/IndexDataRegistry.php +++ b/plugins/rainlab/builder/behaviors/IndexDataRegistry.php @@ -1,17 +1,23 @@ getMessage()); } - $result = $this->controller->widget->databaseTableList->updateList(); + $result = $this->controller->widget->databaseTabelList->updateList(); $result = array_merge( $result, diff --git a/plugins/rainlab/builder/behaviors/IndexImportsOperations.php b/plugins/rainlab/builder/behaviors/IndexImportsOperations.php deleted file mode 100644 index 20faf05..0000000 --- a/plugins/rainlab/builder/behaviors/IndexImportsOperations.php +++ /dev/null @@ -1,192 +0,0 @@ -getPluginCode(); - $pluginCode = $pluginCodeObj->toCode(); - $widget = $this->makeSelectionFormWidget($pluginCode); - - $result = [ - 'tabTitle' => $widget->model->getPluginName().'/'.__("Import"), - 'tabIcon' => 'icon-arrow-circle-down', - 'tabId' => $this->getTabId($pluginCode), - 'tab' => $this->makePartial('tab', [ - 'form' => $widget, - 'pluginCode' => $pluginCodeObj->toCode() - ]) - ]; - - return $result; - } - - /** - * onImportsSave - */ - public function onImportsShowConfirmPopup() - { - if (!post('blueprints')) { - throw new ApplicationException(__("There are no blueprints to import, please select a blueprint and try again.")); - } - - $pluginCodeObj = $this->getPluginCode(); - - $options = [ - 'pluginCode' => $pluginCodeObj->toCode() - ]; - - $this->baseFormConfigFile = '~/plugins/rainlab/builder/models/importsmodel/fields_import.yaml'; - $widget = $this->makeBaseFormWidget(null, $options); - - return $this->makePartial('import-blueprints-popup-form', [ - 'form' => $widget, - 'pluginCode' => $pluginCodeObj->toCode() - ]); - } - - /** - * onImportsSave - */ - public function onImportsSave() - { - if (post('delete_blueprint_data')) { - $confirmText = trim(strtolower(post('delete_blueprint_data_confirm'))); - if ($confirmText !== 'ok') { - throw new ApplicationException(__("Type OK in the field to confirm you want to destroy the existing blueprint data.")); - } - } - - $pluginCodeObj = new PluginCode(post('plugin_code')); - $pluginCode = $pluginCodeObj->toCode(); - - // Validate plugin code matches - $vectorCode = $this->controller->getBuilderActivePluginVector()->pluginCodeObj->toCode(); - if ($pluginCode !== $vectorCode) { - throw new ApplicationException(Lang::get('rainlab.builder::lang.common.not_match')); - } - - $model = $this->loadOrCreateBaseModel($pluginCodeObj->toCode()); - - // Disable blueprints when finished - if (post('disable_blueprints')) { - $model->disableBlueprints = true; - } - - // Disable blueprints when finished - if (post('delete_blueprint_data')) { - $model->deleteBlueprintData = true; - } - - // Perform import - $model->setPluginCodeObj($pluginCodeObj); - $model->fill(post()); - $model->import(); - - // Migrate database - if (post('migrate_database')) { - VersionManager::instance()->updatePlugin($pluginCode); - } - - CacheHelper::instance()->clearBlueprintCache(); - - Flash::success(__("Import Complete")); - - $builderResponseData = [ - 'tabId' => $this->getTabId($pluginCode), - 'tabTitle' => $model->getPluginName().'/'.__("Import"), - ]; - - // Refresh everything - $result = $this->controller->setBuilderActivePlugin($pluginCode); - $result['builderResponseData'] = $builderResponseData; - - // Feature is nice to have, only supported in >3.3.9 - try { - PluginManager::instance()->reloadPlugins(); - BackendMenu::resetCache(); - - $result['mainMenu'] = $this->controller->makeLayoutPartial('mainmenu'); - $result['mainMenuLeft'] = $this->controller->makeLayoutPartial('mainmenu', ['isVerticalMenu'=>true]); - } - catch (Throwable $ex) {} - - return $result; - } - - /** - * onMigrateDatabase - */ - public function onMigrateDatabase() - { - $pluginCodeObj = new PluginCode(post('plugin_code')); - - VersionManager::instance()->updatePlugin($pluginCodeObj->toCode()); - - Flash::success(__("Migration Complete")); - } - - /** - * getTabId - */ - protected function getTabId($pluginCode) - { - return 'imports-'.$pluginCode; - } - - /** - * loadOrCreateBaseModel - */ - protected function loadOrCreateBaseModel($pluginCode, $options = []) - { - $model = new ImportsModel; - $model->loadPlugin($pluginCode); - return $model; - } - - /** - * makeBaseFormWidget - */ - protected function makeSelectionFormWidget($modelCode, $options = []) - { - if (!strlen($this->selectFormConfigFile)) { - throw new ApplicationException(sprintf('Base form configuration file is not specified for %s behavior', get_class($this))); - } - - $widgetConfig = $this->makeConfig($this->selectFormConfigFile); - $widgetConfig->model = $this->loadOrCreateBaseModel($modelCode, $options); - - return $this->makeWidget(\Backend\Widgets\Form::class, $widgetConfig); - } -} diff --git a/plugins/rainlab/builder/behaviors/IndexLocalizationOperations.php b/plugins/rainlab/builder/behaviors/IndexLocalizationOperations.php index eed43c7..082b414 100644 --- a/plugins/rainlab/builder/behaviors/IndexLocalizationOperations.php +++ b/plugins/rainlab/builder/behaviors/IndexLocalizationOperations.php @@ -1,7 +1,7 @@ getPluginCode(); @@ -46,9 +40,6 @@ class IndexMenusOperations extends IndexOperationsBehaviorBase return $result; } - /** - * onMenusSave - */ public function onMenusSave() { $pluginCodeObj = new PluginCode(Request::input('plugin_code')); @@ -66,36 +57,19 @@ class IndexMenusOperations extends IndexOperationsBehaviorBase 'tabTitle' => $model->getPluginName().'/'.Lang::get('rainlab.builder::lang.menu.tab'), ]; - // Feature is nice to have, only supported in >3.3.9 - try { - PluginManager::instance()->reloadPlugins(); - BackendMenu::resetCache(); - - $result['mainMenu'] = $this->controller->makeLayoutPartial('mainmenu'); - $result['mainMenuLeft'] = $this->controller->makeLayoutPartial('mainmenu', ['isVerticalMenu'=>true]); - } - catch (Throwable $ex) {} - return $result; } - /** - * getTabId - */ protected function getTabId($pluginCode) { return 'menus-'.$pluginCode; } - /** - * loadOrCreateBaseModel - */ protected function loadOrCreateBaseModel($pluginCode, $options = []) { $model = new MenusModel(); $model->loadPlugin($pluginCode); - return $model; } } diff --git a/plugins/rainlab/builder/behaviors/IndexModelFormOperations.php b/plugins/rainlab/builder/behaviors/IndexModelFormOperations.php index 3d10a93..53e7db8 100644 --- a/plugins/rainlab/builder/behaviors/IndexModelFormOperations.php +++ b/plugins/rainlab/builder/behaviors/IndexModelFormOperations.php @@ -1,12 +1,15 @@ alias = 'defaultFormBuilder'; - $formBuilder->bindToController(); + $formBulder = new FormBuilder($controller, $defaultBuilderField); + $formBulder->alias = 'defaultFormBuilder'; + $formBulder->bindToController(); } - /** - * onModelFormCreateOrOpen - */ public function onModelFormCreateOrOpen() { $fileName = Input::get('file_name'); @@ -73,9 +67,6 @@ class IndexModelFormOperations extends IndexOperationsBehaviorBase return $result; } - /** - * onModelFormSave - */ public function onModelFormSave() { $model = $this->loadOrCreateFormFromPost(); @@ -99,9 +90,6 @@ class IndexModelFormOperations extends IndexOperationsBehaviorBase return $result; } - /** - * onModelFormDelete - */ public function onModelFormDelete() { $model = $this->loadOrCreateFormFromPost(); @@ -116,9 +104,6 @@ class IndexModelFormOperations extends IndexOperationsBehaviorBase return $result; } - /** - * onModelFormGetModelFields - */ public function onModelFormGetModelFields() { $columnNames = ModelModel::getModelFields($this->getPluginCode(), Input::get('model_class')); @@ -144,9 +129,6 @@ class IndexModelFormOperations extends IndexOperationsBehaviorBase ]; } - /** - * onModelShowAddDatabaseFieldsPopup - */ public function onModelShowAddDatabaseFieldsPopup() { $columns = ModelModel::getModelColumnsAndTypes($this->getPluginCode(), Input::get('model_class')); @@ -165,9 +147,6 @@ class IndexModelFormOperations extends IndexOperationsBehaviorBase ]); } - /** - * loadOrCreateFormFromPost - */ protected function loadOrCreateFormFromPost() { $pluginCode = Request::input('plugin_code'); @@ -182,9 +161,6 @@ class IndexModelFormOperations extends IndexOperationsBehaviorBase return $this->loadOrCreateBaseModel($fileName, $options); } - /** - * getTabId - */ protected function getTabId($modelClass, $fileName) { if (!strlen($fileName)) { @@ -194,9 +170,6 @@ class IndexModelFormOperations extends IndexOperationsBehaviorBase return 'modelForm-'.$modelClass.'-'.$fileName; } - /** - * loadOrCreateBaseModel - */ protected function loadOrCreateBaseModel($fileName, $options = []) { $model = new ModelFormModel(); @@ -216,9 +189,6 @@ class IndexModelFormOperations extends IndexOperationsBehaviorBase return $model; } - /** - * mergeRegistryDataIntoResult - */ protected function mergeRegistryDataIntoResult(&$result, $model, $modelClass) { if (!array_key_exists('builderResponseData', $result)) { @@ -235,36 +205,36 @@ class IndexModelFormOperations extends IndexOperationsBehaviorBase } /** - * getAddDatabaseFieldsDataTableConfig returns the configuration for the DataTable widget - * that is used in the "add database fields" popup. + * Returns the configuration for the DataTable widget that + * is used in the "add database fields" popup. * * @return array */ protected function getAddDatabaseFieldsDataTableConfig() { // Get all registered controls and build an array that uses the control types as key and value for each entry. - $controls = ControlLibrary::instance()->listControls(); + $controls = ControlLibrary::instance()->listControls(); $fieldTypes = array_merge(array_keys($controls['Standard']), array_keys($controls['Widgets'])); - $options = array_combine($fieldTypes, $fieldTypes); + $options = array_combine($fieldTypes, $fieldTypes); return [ 'toolbar' => false, 'columns' => [ - 'add' => [ + 'add' => [ 'title' => 'rainlab.builder::lang.common.add', - 'type' => 'checkbox', + 'type' => 'checkbox', 'width' => '50px', ], 'column' => [ - 'title' => 'rainlab.builder::lang.database.column_name_name', + 'title' => 'rainlab.builder::lang.database.column_name_name', 'readOnly' => true, ], 'label' => [ 'title' => 'rainlab.builder::lang.list.column_name_label', ], 'type' => [ - 'title' => 'rainlab.builder::lang.form.control_widget_type', - 'type' => 'dropdown', + 'title' => 'rainlab.builder::lang.form.control_widget_type', + 'type' => 'dropdown', 'options' => $options, ], ], @@ -272,37 +242,38 @@ class IndexModelFormOperations extends IndexOperationsBehaviorBase } /** - * getAddDatabaseFieldsDataTableValue returns the initial value for the DataTable widget that + * Returns the initial value for the DataTable widget that * is used in the "add database columns" popup. * * @param array $columns + * * @return array */ protected function getAddDatabaseFieldsDataTableValue(array $columns) { // Map database column types to widget types. $typeMap = [ - 'string' => 'text', - 'integer' => 'number', - 'text' => 'textarea', - 'timestamp' => 'datepicker', + 'string' => 'text', + 'integer' => 'number', + 'text' => 'textarea', + 'timestamp' => 'datepicker', 'smallInteger' => 'number', - 'bigInteger' => 'number', - 'date' => 'datepicker', - 'time' => 'datepicker', - 'dateTime' => 'datepicker', - 'binary' => 'checkbox', - 'boolean' => 'checkbox', - 'decimal' => 'number', - 'double' => 'number', + 'bigInteger' => 'number', + 'date' => 'datepicker', + 'time' => 'datepicker', + 'dateTime' => 'datepicker', + 'binary' => 'checkbox', + 'boolean' => 'checkbox', + 'decimal' => 'number', + 'double' => 'number', ]; - return array_map(function($column) use ($typeMap) { + return array_map(function ($column) use ($typeMap) { return [ 'column' => $column['name'], - 'label' => str_replace('_', ' ', ucfirst($column['name'])), - 'type' => $typeMap[$column['type']] ?? $column['type'], - 'add' => false, + 'label' => str_replace('_', ' ', ucfirst($column['name'])), + 'type' => $typeMap[$column['type']] ?? $column['type'], + 'add' => false, ]; }, $columns); } diff --git a/plugins/rainlab/builder/behaviors/IndexModelListOperations.php b/plugins/rainlab/builder/behaviors/IndexModelListOperations.php index 95d8a2e..689d6f0 100644 --- a/plugins/rainlab/builder/behaviors/IndexModelListOperations.php +++ b/plugins/rainlab/builder/behaviors/IndexModelListOperations.php @@ -1,49 +1,26 @@ tabs, 'fields.columns.columns.type.options'); - - $pluginColumns = PluginManager::instance()->getRegistrationMethodValues('registerListColumnTypes'); - foreach ($pluginColumns as $customColumns) { - foreach (array_keys($customColumns) as $customColumn) { - $typeOptions[$customColumn] = __(Str::studly($customColumn)); - } - } - - array_set($config->tabs, 'fields.columns.columns.type.options', $typeOptions); - return $config; - } - - /** - * onModelListCreateOrOpen - */ public function onModelListCreateOrOpen() { $fileName = Input::get('file_name'); @@ -74,9 +51,6 @@ class IndexModelListOperations extends IndexOperationsBehaviorBase return $result; } - /** - * onModelListSave - */ public function onModelListSave() { $model = $this->loadOrCreateListFromPost(); @@ -99,9 +73,6 @@ class IndexModelListOperations extends IndexOperationsBehaviorBase return $result; } - /** - * onModelListDelete - */ public function onModelListDelete() { $model = $this->loadOrCreateListFromPost(); @@ -116,9 +87,6 @@ class IndexModelListOperations extends IndexOperationsBehaviorBase return $result; } - /** - * onModelListGetModelFields - */ public function onModelListGetModelFields() { $columnNames = ModelModel::getModelFields($this->getPluginCode(), Input::get('model_class')); @@ -138,9 +106,6 @@ class IndexModelListOperations extends IndexOperationsBehaviorBase ]; } - /** - * onModelListLoadDatabaseColumns - */ public function onModelListLoadDatabaseColumns() { $columns = ModelModel::getModelColumnsAndTypes($this->getPluginCode(), Input::get('model_class')); @@ -152,9 +117,6 @@ class IndexModelListOperations extends IndexOperationsBehaviorBase ]; } - /** - * loadOrCreateListFromPost - */ protected function loadOrCreateListFromPost() { $pluginCode = Request::input('plugin_code'); @@ -169,9 +131,6 @@ class IndexModelListOperations extends IndexOperationsBehaviorBase return $this->loadOrCreateBaseModel($fileName, $options); } - /** - * getTabId - */ protected function getTabId($modelClass, $fileName) { if (!strlen($fileName)) { @@ -181,9 +140,6 @@ class IndexModelListOperations extends IndexOperationsBehaviorBase return 'modelList-'.$modelClass.'-'.$fileName; } - /** - * loadOrCreateBaseModel - */ protected function loadOrCreateBaseModel($fileName, $options = []) { $model = new ModelListModel(); @@ -203,9 +159,6 @@ class IndexModelListOperations extends IndexOperationsBehaviorBase return $model; } - /** - * mergeRegistryDataIntoResult - */ protected function mergeRegistryDataIntoResult(&$result, $model, $modelClass) { if (!array_key_exists('builderResponseData', $result)) { diff --git a/plugins/rainlab/builder/behaviors/IndexModelOperations.php b/plugins/rainlab/builder/behaviors/IndexModelOperations.php index 3ea346b..4a94f2e 100644 --- a/plugins/rainlab/builder/behaviors/IndexModelOperations.php +++ b/plugins/rainlab/builder/behaviors/IndexModelOperations.php @@ -1,26 +1,23 @@ getPluginCode(); @@ -38,9 +35,6 @@ class IndexModelOperations extends IndexOperationsBehaviorBase return $this->makePartial('model-popup-form'); } - /** - * onModelSave - */ public function onModelSave() { $pluginCode = Request::input('plugin_code'); @@ -65,9 +59,6 @@ class IndexModelOperations extends IndexOperationsBehaviorBase return $result; } - /** - * loadOrCreateBaseModel - */ protected function loadOrCreateBaseModel($className, $options = []) { // Editing model is not supported, always return diff --git a/plugins/rainlab/builder/behaviors/IndexPermissionsOperations.php b/plugins/rainlab/builder/behaviors/IndexPermissionsOperations.php index b0a9778..bf7bafa 100644 --- a/plugins/rainlab/builder/behaviors/IndexPermissionsOperations.php +++ b/plugins/rainlab/builder/behaviors/IndexPermissionsOperations.php @@ -1,7 +1,7 @@ initDefaults(); diff --git a/plugins/rainlab/builder/behaviors/IndexVersionsOperations.php b/plugins/rainlab/builder/behaviors/IndexVersionsOperations.php index 30fc8b0..9dbe283 100644 --- a/plugins/rainlab/builder/behaviors/IndexVersionsOperations.php +++ b/plugins/rainlab/builder/behaviors/IndexVersionsOperations.php @@ -1,7 +1,7 @@ 'layout', - 'data-change-monitor' => 'true', - 'data-window-close-confirm' => e(trans('backend::lang.form.confirm_tab_close')), - 'data-entity' => 'code', - 'onsubmit' => 'return false' -]) ?> - render() ?> - - diff --git a/plugins/rainlab/builder/behaviors/indexcodeoperations/partials/_toolbar.php b/plugins/rainlab/builder/behaviors/indexcodeoperations/partials/_toolbar.php deleted file mode 100644 index bc46bbd..0000000 --- a/plugins/rainlab/builder/behaviors/indexcodeoperations/partials/_toolbar.php +++ /dev/null @@ -1,10 +0,0 @@ - diff --git a/plugins/rainlab/builder/behaviors/indexcontrolleroperations/partials/_create-controller-popup-form.php b/plugins/rainlab/builder/behaviors/indexcontrolleroperations/partials/_create-controller-popup-form.htm similarity index 85% rename from plugins/rainlab/builder/behaviors/indexcontrolleroperations/partials/_create-controller-popup-form.php rename to plugins/rainlab/builder/behaviors/indexcontrolleroperations/partials/_create-controller-popup-form.htm index 0f2cfb1..d3a3e93 100644 --- a/plugins/rainlab/builder/behaviors/indexcontrolleroperations/partials/_create-controller-popup-form.php +++ b/plugins/rainlab/builder/behaviors/indexcontrolleroperations/partials/_create-controller-popup-form.htm @@ -2,9 +2,9 @@ 'data-builder-command'=>'controller:cmdCreateController', 'data-plugin-code' => $pluginCode ]) ?> -